官术网_书友最值得收藏!

Creating and using definer's rights procedures

In this recipe, you'll learn to create and use definer's rights procedures.

Getting ready

To complete this recipe, you'll use a user who has a DBA role.

How to do it...

  1. Connect to the database as a user with the DBA role (for example, zoran)
    SQL> connect zoran
    
  2. Create two users (procowner and procuser) and grant them appropriate privileges:
    SQL> create user procowner identified by oracle1;
    SQL> create user procuser identified by oracle2;
    SQL> grant create session, create procedure to procowner;
    SQL> grant create session to procuser;
    
  3. Create a table called zoran.tbl and grant users privileges on this table:
    SQL> create table zoran.tbl(a number, b varchar2(40));
    SQL> insert into zoran.tbl values(1, 'old_value');
    SQL> commit;
    SQL> grant select on zoran.tbl to procuser;
    SQL> grant update on zoran.tbl to procowner;
    
  4. Connect as a user, procowner, create a procedure to update table zoran.tbl, and grant execute on this procedure to user procuser:
    SQL> connect procowner/oracle1
    CREATE OR REPLACE PROCEDURE UpdateTbl (x IN number, y IN varchar2)
     AUTHID DEFINER
     AS
     BEGIN
     UPDATE ZORAN.TBL
     SET b = y
     WHERE a = x;
     END;
     /
    SQL> grant execute on UpdateTbl to procuser;
    
  5. Connect as user procuser and try to directly update table zoran.tbl:
    SQL> connect procuser/oracle2
    SQL> UPDATE ZORAN.TBL SET B = 'value1' WHERE A = 1;
    UPDATE ZORAN.TBL SET B = 'value1' WHERE A = 1
     *
    ERROR at line 1:
    ORA-01031: insufficient privileges
    
  6. When the previous step fails, update table by using the UpdateTbl procedure:
    SQL> EXEC procowner.UpdateTbl(1, 'new_value');
    PL/SQL procedure successfully completed.
    
  7. Check whether the table is updated:
    SQL> select * from zoran.tbl;
     A B
    ---------- ----------------------------------------
     1 new_value
    

How it works...

Definer's rights procedures are executed by using privileges that are granted to the owner of the procedure. In our example, we have two users: procowner - a user who is the owner of the procedure and has privilege to update table zoran.tbl and procuser - a user who just executes the procedure. In step 4, procuser creates procedure by using the AUTHID DEFINER clause, which means that this procedure will be definer's rights procedure. This is a default behavior (we can omit the AUTHID DEFINER clause). In step 5, procuser tries to update table zoran.tbl directly, but it gets an error:

SQL> UPDATE ZORAN.TBL SET B = 'value1' WHERE A = 1;
UPDATE ZORAN.TBL SET B = 'value1' WHERE A = 1
 *
ERROR at line 1:
ORA-01031: insufficient privileges

This is the expected behavior, considering that procuser doesn't have an update privilege on zoran.tbl. When procuser executes the procedure in step 6, the table is updated because the privilege of the definer is applied.

主站蜘蛛池模板: 宝应县| 古交市| 阳新县| 化德县| 五台县| 武川县| 达拉特旗| 历史| 保亭| 彩票| 荣昌县| 长治县| 永胜县| 惠州市| 卫辉市| 遂溪县| 铜山县| 合江县| 汾阳市| 云南省| 阜城县| 崇左市| 深泽县| 双辽市| 松桃| 河间市| 上杭县| 青田县| 雅江县| 沭阳县| 平原县| 建水县| 巴楚县| 达拉特旗| 循化| 革吉县| 偏关县| 清河县| 呼伦贝尔市| 孟津县| 宁国市|