我在 bash 中有腳本可以在 oracle 中授予權限(30 次授予)。該腳本在 cron 中,每天在特定時間開始。我想通過最簡單/最快的方式創建檢查/如果僅在尚未授予權限的情況下授予權限。有人可以幫忙嗎?
uj5u.com熱心網友回復:
不要費心檢查他們是否擁有/沒有獲得特權。只需授予/撤銷它們,以便它最終獲得正確權限的任何用戶。
您可以撰寫一個 shell 腳本來生成一個包含 SQL 命令的檔案,然后使用 SQL/Plus 運行該腳本。
uj5u.com熱心網友回復:
下面的 PL/SQL 塊僅授予缺少的權限。我經常使用“預期減去實際”模式,并且學會了始終在錯誤訊息中顯示有問題的 SQL 陳述句的艱難方法。
--Grant missing privileges.
begin
for missing_grants in
(
select grantee, table_name, privilege, 'grant ' || privilege || ' on ' || table_name || ' to asdf ' || grantee grant_ddl
from
(
--Expected privileges:
select 'TEST_USER' grantee, 'TEST1' table_name, 'SELECT' privilege from dual union all
select 'TEST_USER' grantee, 'TEST2' table_name, 'SELECT' privilege from dual union all
select 'TEST_USER' grantee, 'TEST2' table_name, 'INSERT' privilege from dual union all
select 'TEST_USER' grantee, 'TEST2' table_name, 'UPDATE' privilege from dual union all
select 'TEST_USER' grantee, 'TEST2' table_name, 'DELETE' privilege from dual
minus
--Actual privileges:
select grantee, table_name, privilege
from user_tab_privs
where table_name in ('TEST1', 'TEST2')
)
) loop
begin
execute immediate missing_grants.grant_ddl;
exception when others then
raise_application_error(-20000, 'Error with this SQL: ' || missing_grants.grant_ddl || chr(10) || sqlerrm);
end;
end loop;
end;
/
雖然您確實可以每次都重新運行授權,但您可能不想這樣做有幾個原因:
- 性能雖然 30 次授權通常會很快運行,但如果您的權限腳本增長,它可能會開始變慢。
- 鎖定如果其他東西同時改變物件,您可能會遇到問題。(盡管授權似乎確實避免了大多數鎖定問題。例如,行鎖不會停止授權。)
- 審計如果你審計 DDL 命令,頻繁地重新授權會使審計線索充滿噪音,并且很難判斷發生了什么變化。
此外,您可能需要考慮 Gary Myers 的建議,將這個任務放在調度程式中。只需一次呼叫 DBMS_SCHEDULER,您就可以將作業放入資料庫中,而不必擔心 shell 腳本或 cron。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/414777.html
標籤:
