暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

​使用触发器限制表数据被修改

IT那活儿 2022-05-14
828

点击上方“IT那活儿”,关注后了解更多内容,不管IT什么活儿,干就完了!!!

文章背景

日常维护工作中,我们有时会需要对某张表限制修改,此时我们可以通过权限来控制。但是权限控制往往不能限制自己模式(OWNER)的用户以及拥有dba等权限的用户修改。
此时我们可以通过创建触发器来限制并提醒对方,当前表暂时不允许修改。
例如:在数据迁移过程中,我们在用ogg等工具同步数据时,同步过程可能会持续几天甚至几十天,这期间我们希望源端的数据随意,但目标端的数据都必须来自于源端的同步,而不允许应用或者其它维护人员擅自修改目标表,导致同步数据的两端不一致。

创建步骤

以user1.table2表为例
SQL> select * from user1.table2;
ID REM RETIME

---------- ------------------------ ------------

1 1 rows 05-JAN-22

创建触发器
CREATE OR REPLACE TRIGGER system.ogg_trg_table2 AFTER INSERT OR DELETE OR UPDATE ON user1.table2
REFERENCING OLD AS OLD NEW AS NEW
FOR EACH ROW
DECLARE
v_session_user varchar2(30);
BEGIN
v_session_user := SYS_CONTEXT('USERENV', 'SESSION_USER');
IF v_session_user = 'OGGUSER' THEN

-- 此处允许用户 oggusr 相当于白名单
NULL;
ELSE
raise_application_error(-20008,'非指定用户不允许修改,请联系管理员。');
END IF;
END;
/

完成。

效果展示

使用表自身用户user1(或者其它用户包括高权限用户登录)都不能修改表:
SQL>
SQL> conn user1/User1_123
Connected.
SQL>
SQL> insert into user1.table2 values(2,'2 rows',sysdate);
insert into user1.table2 values(2,'2 rows',sysdate)
*
ERROR at line 1:

ORA-20008: 非指定用户不允许修改,请联系管理员。

ORA-06512: at "SYSTEM.OGG_TRG_TABLE2", line 8
ORA-04088: error during execution of trigger 'SYSTEM.OGG_TRG_TABLE2'
SQL>


使用指定用户可以修改表:


SQL>
SQL> conn ogguser/Ogguser_123
Connected.
SQL>
SQL> insert into user1.table2 values(2,'2 rows',sysdate);
1 row created.
SQL>


 


END




本文作者:谭 凯

本文来源:IT那活儿(上海新炬王翦团队)

文章转载自IT那活儿,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论