存储过程执行权限
最后更新時間: 2014年4月13日,星期日
存儲過程分為兩種,即DR(Definer's Rights ) Procedure和IR(Invoker's Rights ) Procedure。為什么會有兩種存儲過程呢?比如說用戶user02創建了修改表t1的存儲過程,當用戶user01調用時,是修改的user01自己的t1表還是user02的t1表? ?
示例:用戶user02將存過賦執行權限給user01:grant execute on user02.prc1 to user01;grant execute on user02.prc2 to user01;grant execute on user02.prc3 to user01;
用戶user01執行user02下的存過 prc1,prc2,prc3;用戶user01只有執行user02下存過的權限,沒有查詢/修改user02.t1的任何權限;--默認是 authid DEFINERcreate or replace procedure prc1 isv_sql varchar2(200);begin? begin?v_sql :='drop table t1 purge';EXECUTE IMMEDIATE v_sql;v_sql:='create table t1(id int)';EXECUTE IMMEDIATE v_sql; exception when others thendbms_output.put_line('表不存在!');v_sql:='create table t1(id int)';EXECUTE IMMEDIATE v_sql; end; for i in 1 .. 10 loop insert into t1 values(0); end loop; commit;end;/-- DEFINER 表示使用的是定義者的權限,即user02的權限,修改的是 user02.t1表,盡管user01沒有直接修改user02.t1表的任何權限create or replace procedure prc2 authid DEFINER isv_sql varchar2(200);begin?begin?v_sql :='drop table t1 purge';EXECUTE IMMEDIATE v_sql;v_sql:='create table t1(id int)';EXECUTE IMMEDIATE v_sql;exception when others thendbms_output.put_line('表不存在!');v_sql:='create table t1(id int)';EXECUTE IMMEDIATE v_sql;end;for i in 1 .. 10loopinsert into t1 values(2);end loop;commit;end;/
-- current_user 表示調用者權限,修改的是user01.t1表create or replace procedure prc3 authid current_user isv_sql varchar2(200);begin?begin?v_sql :='drop table t1 purge';EXECUTE IMMEDIATE v_sql;v_sql:='create table t1(id int)';EXECUTE IMMEDIATE v_sql;exception when others thendbms_output.put_line('表不存在!');v_sql:='create table t1(id int)';EXECUTE IMMEDIATE v_sql;end;for i in 1 .. 10loopinsert into t1 values(3);end loop;commit;end;/
參考:?http://blog.itpub.net/12272958/viewspace-686460/ http://docs.oracle.com/cd/B12037_01/appdev.101/b10807/08_subs.htm#i18574
1. 匿名塊(DECLARE BEGIN END;)總是IR Procedure,觸發器和視圖總是DR Procedure。我們可以通過視圖*_PROCEDURES來查看存儲過程的AUTHID屬性值。2. 存儲過程、包、都適用。
來自為知筆記(Wiz)
存儲過程分為兩種,即DR(Definer's Rights ) Procedure和IR(Invoker's Rights ) Procedure。為什么會有兩種存儲過程呢?比如說用戶user02創建了修改表t1的存儲過程,當用戶user01調用時,是修改的user01自己的t1表還是user02的t1表? ?
示例:用戶user02將存過賦執行權限給user01:grant execute on user02.prc1 to user01;grant execute on user02.prc2 to user01;grant execute on user02.prc3 to user01;
用戶user01執行user02下的存過 prc1,prc2,prc3;用戶user01只有執行user02下存過的權限,沒有查詢/修改user02.t1的任何權限;--默認是 authid DEFINERcreate or replace procedure prc1 isv_sql varchar2(200);begin? begin?v_sql :='drop table t1 purge';EXECUTE IMMEDIATE v_sql;v_sql:='create table t1(id int)';EXECUTE IMMEDIATE v_sql; exception when others thendbms_output.put_line('表不存在!');v_sql:='create table t1(id int)';EXECUTE IMMEDIATE v_sql; end; for i in 1 .. 10 loop insert into t1 values(0); end loop; commit;end;/-- DEFINER 表示使用的是定義者的權限,即user02的權限,修改的是 user02.t1表,盡管user01沒有直接修改user02.t1表的任何權限create or replace procedure prc2 authid DEFINER isv_sql varchar2(200);begin?begin?v_sql :='drop table t1 purge';EXECUTE IMMEDIATE v_sql;v_sql:='create table t1(id int)';EXECUTE IMMEDIATE v_sql;exception when others thendbms_output.put_line('表不存在!');v_sql:='create table t1(id int)';EXECUTE IMMEDIATE v_sql;end;for i in 1 .. 10loopinsert into t1 values(2);end loop;commit;end;/
-- current_user 表示調用者權限,修改的是user01.t1表create or replace procedure prc3 authid current_user isv_sql varchar2(200);begin?begin?v_sql :='drop table t1 purge';EXECUTE IMMEDIATE v_sql;v_sql:='create table t1(id int)';EXECUTE IMMEDIATE v_sql;exception when others thendbms_output.put_line('表不存在!');v_sql:='create table t1(id int)';EXECUTE IMMEDIATE v_sql;end;for i in 1 .. 10loopinsert into t1 values(3);end loop;commit;end;/
參考:?http://blog.itpub.net/12272958/viewspace-686460/ http://docs.oracle.com/cd/B12037_01/appdev.101/b10807/08_subs.htm#i18574
1. 匿名塊(DECLARE BEGIN END;)總是IR Procedure,觸發器和視圖總是DR Procedure。我們可以通過視圖*_PROCEDURES來查看存儲過程的AUTHID屬性值。2. 存儲過程、包、都適用。
來自為知筆記(Wiz)
轉載于:https://www.cnblogs.com/bowshy/p/3661867.html
總結
- 上一篇: 字符串数组去重
- 下一篇: 移动端页面0.5px border的实现