【发布时间】:2018-04-26 20:42:46
【问题描述】:
如果我创建了这个触发器,那么当对表使用 drop 或 truncate 时会引发错误,但 logTable 中没有插入任何内容,但是如果我删除 RAISE_APPLICATION_ERROR... 那么值将插入 logTable,但 drop /truncate 也被执行。为什么?如何避免在 Schema 上删除/截断(如果我使用而不是触发器,则仅当架构的所有者正在删除/截断某些内容时才会触发它)。
CREATE OR REPLACE TRIGGER trigger_name
BEFORE DROP OR TRUNCATE ON DATABASE
DECLARE
username varchar2(100);
BEGIN
IF ora_dict_obj_owner = 'MySchema' THEN
select user INTO username from dual;
INSERT INTO logTable VALUES(username , SYSDATE);
RAISE_APPLICATION_ERROR (-20001,'ERROR, YOU CAN NOT DELETE THIS!!');
END IF;
END;
【问题讨论】:
-
出于兴趣,
select user INTO username from dual的目的是什么? -
目的是将想要从 MySchema 中删除/截断表的用户名添加到日志表中。
-
但你已经知道
user。该查询似乎只是将其复制到名称略有不同的变量中。现在username与user具有相同的值。它似乎没有给你任何你不知道的东西。 -
如果我有,例如,两个用户可以访问相同的模式并且有人试图删除一个表,那么在日志表中我有用户名和他试图删除表的时间.
-
但你不能只是
insert into logTable values (user, sysdate)?必须有第二个变量和一个查询来填充它?
标签: sql database plsql triggers