在oracle數據庫的用戶下,一張表須要作讀寫控制,只能讀和寫,不能刪除和修改。開發人員開始想從用戶權限上去實現。
通過一番討論,判讀從權限上去實現該需求是不合適的。
這個用戶下不少表,根本不會被一我的控制的。用戶自己有一個權限組resource,能夠對其下全部表進行增刪改查。
若是要用權限來實現,那麼就得將這個組去掉。這樣,該用戶下的其餘表就得一個一個受權。還得考慮到之後新建的表。如何處理又是個問題。
所以,判斷該解決方式不合適。
這種單獨一張表的讀寫控制,不知道審計能不能實現。我想到一種另外的控制方法,讓表只能讀寫,不能刪改。這個方法就是利用觸發器。
在表的每一行紀錄進行增刪改以前作判斷,若是是增,則不作任何處理,若是是刪除或者修改,直接rollback。
這樣就實現了這種讀寫控制。
sql
觸發器代碼以下:數據庫
create or replace trigger trg_test_insert_select before insert or update or delete on t_test for each row declare -- local variables here begin CASE WHEN INSERTING THEN DBMS_OUTPUT.PUT_LINE('Inserting'); WHEN UPDATING THEN DBMS_OUTPUT.PUT_LINE('Updating'); rollback; WHEN DELETING THEN DBMS_OUTPUT.PUT_LINE('Deleting'); rollback; END CASE; end trg_test_insert_select;
測試結果以下:
SQL> insert into t_test(a) select sysdate from dual;
1 row inserted
SQL> commit;
Commit complete
SQL> delete from t_test;
delete from t_test
ORA-04092: ROLLBACK 不能在觸發器中
ORA-06512: 在 "SCOTT.TRG_TEST_INSERT_SELECT", line 12
ORA-04088: 觸發器 'SCOTT.TRG_TEST_INSERT_SELECT' 執行過程當中出錯
SQL> update t_test set a=sysdate+1;
update t_test set a=sysdate+1
ORA-04092: ROLLBACK 不能在觸發器中
ORA-06512: 在 "SCOTT.TRG_TEST_INSERT_SELECT", line 9
ORA-04088: 觸發器 'SCOTT.TRG_TEST_INSERT_SELECT' 執行過程當中出錯
注意,在應用開發時,須要將這個表的操做進行封裝,異常捕獲很重要。
oracle