پرسش: کاربر A قصد اجرای پروسیجری از کاربر B را دارد، برای انجام این کار، به کاربر A مجوز execute بر روی این پروسیجر داده شده است. در قسمتی از متن این پروسیجر، پسورد کاربر B هم تغییر خواهد کرد در صورتی که کاربر A، مجوز alter user را ندارد. با در نظر گرفتن این مسئله، کاربر A، امکان اجرای این پروسیجر را دارد؟
پاسخ: به صورت پیش فرض، کاربر A می تواند با اجرای این پروسیجر، سبب تغییر پسورد کاربر B شود در مثال زیر، این مسئله شبیه سازی شده است.
مثال: در ابتدا کاربر A و B را ایجاد کرده و مجوز connect و resource را به انها می دهیم:
SQL> create user A identified by a;
User created.
SQL> create user B identified by b;
User created.
SQL> grant connect,resource to a,b;
Grant succeeded.
با اتصال به کاربر B، پروسیجری به نام proc را ایجاد می کنیم:
SQL> conn B/b
Connected.
SQL> CREATE OR REPLACE PROCEDURE proc IS
2 BEGIN
3 execute immediate ‘alter user B identified by n’;
4 END;
5 /
Procedure created.
سپس به کاربر A مجوز اجرای این پروسیجر را اهدا می کنیم:
SQL> grant execute on proc to A;
Grant succeeded.
در نهایت، با اتصال به کاربر A، این پروسیجر را اجرا می کنیم:
SQL> conn A/a
Connected.
SQL> exec B.proc;
PL/SQL procedure successfully completed.
همانطور که قابل مشاهده است، این پروسیجر بدون خطا اجرا شده است و همچنین دستور زیر نشان می دهد که با پسورد جدید می توان به کاربر B متصل شد:
SQL> conn B/n
Connected.
در ادامه ضمن تعریف دو اصطلاح نشان خواهیم داد که چگونه می توان در زمان اجرای پروسیجر proc توسط کاربر A، مانع از تغییر پسورد کاربر B شد.
DEFINER: کاربری که مالک پروسیجر است(در مثال ما کاربر B)
INVOKER: کاربری که پروسیجر را اجرا می کند(در مثال ما کاربر A)
در مثال قبلی مشاهده شد که بطور پیش فرض، در زمان اجرای یک پروسیجر، invoker با مجوز definer ان پروسیجر را اجرا خواهد کرد این مسئله به صورت صریح با استفاده از کلمه کلیدی AUTHID DEFINER در هدر پروسیجر هم قابل تعریف می باشد.
برای محدود کردن invoker، صرفا به مجوزی که دارد، می توان از کلمه کلیدی AUTHID CURRENT_USER در پروسیجر(قبل از کلمه کلیدی IS) استفاده کرد.
در مثال زیر خواهید دید که استفاده از کلمه کلیدی AUTHID CURRENT_USER در پروسیجر proc، مانع از اجرای این پروسیجر توسط کاربر A خواهد شد:
SQL> CREATE OR REPLACE PROCEDURE proc AUTHID CURRENT_USER IS
2 BEGIN
3 execute immediate ‘alter user B identified by n’;
4 END;
5 /
Procedure created.
SQL> conn A/a
Connected.
SQL> exec B.proc;
ORA-01031: insufficient privileges