2014-11-16 108 views
3

我希望能夠在我的表中插入數據。一旦數據被插入,人們只能更新整個表中的一列。我試圖在下面這個,但我得到的錯誤 - ORA-04092:不能在觸發器COMMIT或ROLLBACK:ORACLE PL/SQL - GRANT/REVOKE權限

這是我的觸發器。我的想法是給予用戶插入數據的所有特權。數據插入後,只刪除一列上的UPDATE權限。假設我們有這張表:

CREATE TABLE tabelName(
    col1 INTEGER, 
    col2 INTEGER, 
    col3 INTEGER, 
    col4 INTEGER 
); 


CREATE OR REPLACE TRIGGER TRG_TABLENAME_BI 
BEFORE INSERT 
ON TABLENAME 

BEGIN 
    EXECUTE IMMEDIATE 'GRANT ALL ON TABLENAME TO PUBLIC'; 
END; 
/

CREATE OR REPLACE TRIGGER TRG_TABLENAME_AI 
AFTER INSERT 
ON TABLENAME 

BEGIN 
    EXECUTE IMMEDIATE 'REVOKE UPDATE (col1,col2,col3) TABLENAME to PUBLIC'; 
END; 
/

所以最後,我們只能在表格中插入數據後更新tableName的col4。如果我們這樣做:

INSERT INTO tableName VALUES(1,2,3,4); 
1 row created 

我只能做

UPDATE tableName 
SET col4= 10 
WHERE col1=1; 

以下不會工作,本次更新:

UPDATE tableName 
SET col2= 10 
WHERE col1=1; 

但我不知道如何計算出來。 謝謝。

+0

'表格級別上的'grant insert',但'grant update'只在'列級別'上。 –

回答

4

您不能在觸發器中使用grantrevoke權限。看起來你只是想授予用戶INSERTUPDATE(col4)的能力。

CREATE TABLE tableName(
    col1 INTEGER, 
    col2 INTEGER, 
    col3 INTEGER, 
    col4 INTEGER 
); 

GRANT INSERT ON tableName TO public; 

GRANT UPDATE(col4) ON tableName TO public; 

當然,這隻影響其他用戶在表上的權限。表的所​​有者將始終有權更改表中的數據。我還假設你並沒有真正授予public的權限,而是授予您在系統中定義的與需要修改數據的業務角色相關的某個用戶或角色。

+0

像一個魅力工程!謝謝。 – Thapipo