客戶有這樣一個需求,需要賦予用戶test查看所有存儲過程和觸發器的權限,但是不能夠對其進行修改或刪除。
當前用戶test具備的權限是基本的connect, resource
,其實如果對象是表的話,有點像SELECT ON TABLE_NAME
的權限。
但是實際查詢存儲過程和觸發器,並沒有顯示SELECT這樣的權限,可以這樣查詢:
SQL> select * from session_privs where PRIVILEGE like '%TRIGGER%';
PRIVILEGE
--------------------------------------------------------------------------------
CREATE TRIGGER
CREATE ANY TRIGGER
ALTER ANY TRIGGER
DROP ANY TRIGGER
ADMINISTER DATABASE TRIGGER
SQL> select * from session_privs where PRIVILEGE like '%PROCEDURE%';
PRIVILEGE
--------------------------------------------------------------------------------
CREATE PROCEDURE
CREATE ANY PROCEDURE
ALTER ANY PROCEDURE
DROP ANY PROCEDURE
EXECUTE ANY PROCEDURE
DEBUG ANY PROCEDURE
6 rows selected.
現在在用戶jingyu下創建測試用的存儲過程和觸發器:
--create procedure jingyu.sp_pro1
create or replace procedure jingyu.sp_pro1 is
begin
insert into jingyu.t1 values('Alfred','Zhao');
end;
/
--create trigger jingyu.insertT1
create or replace trigger jingyu.insertT1
after insert on jingyu.t1
for each row
declare
-- local variables here
begin
dbms_output.put_line('新增員工成功');
end insertStaffHint;
/
依次嘗試TRIGGER和PROCEDURE相關的權限,發現分別授予DEBUG ANY PROCEDURE
和ADMINISTER DATABASE TRIGGER
的權限可以實現查看所有存儲過程和觸發器的權限。
grant DEBUG ANY PROCEDURE, ADMINISTER DATABASE TRIGGER to test;
使用test用戶登陸,比如plsql工具,驗證可以查看到其他用戶的存儲過程和觸發器,比如jingyu用戶下的:
jingyu.sp_pro1
jingyu.insertT1
嘗試對其進行刪除、修改、重建都會報錯權限不足,滿足客戶需求。