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

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.

主站蜘蛛池模板: 房山区| 金堂县| 通州市| 奉节县| 旌德县| 枞阳县| 新津县| 育儿| 桐乡市| 紫阳县| 郸城县| 习水县| 通州市| 万安县| 墨脱县| 花莲市| 宁波市| 开封市| 孝感市| 淮滨县| 嘉峪关市| 肥西县| 仙居县| 永修县| 犍为县| 昌宁县| 灵武市| 西盟| 柞水县| 莫力| 罗甸县| 工布江达县| 砚山县| 通山县| 临城县| 香港 | 松原市| 徐州市| 铁岭县| 泽普县| 洞头县|