自動為新建的表建立同義詞

zhang41082發表於2019-05-04

問題提出:

為了控制使用者許可權,給某些使用者只有查詢系統的許可權,但是這樣帶來的維護麻煩是每次系統建立了新的表,都需要給查詢使用者對這個表的查詢許可權授權,然後查詢使用者使用的時候不方便,要加上使用者的字首才能使用。這裡提供一個自動為新建立的表進行授權和建立同義詞的辦法。

[@more@]

解決的辦法就是使用系統觸發器,當在一個schema上建立一個表的時候,就使用動態語句來執行授權和建立同義詞的語句。問題的難點是如果單純使用execute immedite來建立同義詞,則會報許可權不足,怎麼都搞不定。後來搜尋了一下,tom提供了下面的方法,就是把任務提交到一個job,使用job來完成建立同義詞的工作,問題得到解決。

結合上一篇發表的一個自殺程式,可以看到,很多東西如果程式做起來不方便,可以透過job進行變通,讓job來完成我們需要的工作。

CREATE OR REPLACE TRIGGER AUTO_CREATE_SYNONYM
AFTER CREATE ON SCHEMA
DECLARE
V_STR VARCHAR2(200);
V_JOB NUMBER;
BEGIN
IF (ORA_DICT_OBJ_TYPE = 'TABLE') THEN
--判斷建立的物件是否是表
V_STR := 'execute immediate "grant select on ' || ORA_DICT_OBJ_NAME ||
' to query";';
--為查詢使用者query授權
DBMS_JOB.SUBMIT(V_JOB, REPLACE(STR, '"', ''''));
V_STR := 'execute immediate "create or replace synonym query.' ||
ORA_DICT_OBJ_NAME || ' for ' || ORA_DICT_OBJ_NAME || '";';
--建立同義詞
DBMS_JOB.SUBMIT(V_JOB, REPLACE(STR, '"', ''''));
END IF;
EXCEPTION
WHEN OTHERS THEN
MAIL_TOOLS.MAIL_FILES('');
END AUTO_CREATE_SYNONYM;

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25016/viewspace-926488/,如需轉載,請註明出處,否則將追究法律責任。

相關文章