在Oracle中删除分区触发器



我们如何在Oracle中创建删除分区DDL触发器。例如假设我们创建DDL触发器来捕获或防止有人在我们的模式中触发drop TABLE/INDEX或naything。创建或替换触发器my_trg在模式上DROP之后

我们可以对丢弃分区做同样的操作吗。

我们可以保存细节吗。。就像这个分区被这个特定的用户删除了一样。

我们可以通过触发或捕获哪个用户丢弃了分区来防止用户丢弃分区吗

触发器是这样的:

CREATE OR REPLACE TRIGGER LOG_ALTER
BEFORE ALTER ON SCHEMA
WHEN (ora_dict_obj_type = 'TABLE' AND ora_dict_obj_name = 'YOUR_TABLE')
DECLARE
sqlcmd T_USER_LOGGING.ULOG_SQL_CMD%TYPE;
sql_text ora_name_list_t;
n NUMBER;
BEGIN
n := ora_sql_txt(sql_text);
IF n IS NOT NULL THEN
FOR i IN 1..n LOOP
sqlcmd := sqlcmd || sql_text(i);
END LOOP;
END IF;
IF REGEXP_LIKE(sqlcmd, 'DROPs+PARTITION', 'i') THEN
RAISE_APPLICATION_ERROR(-20010, 'User '||ora_login_user||' must not drop partition from table YOUR_TABLE');
END IF;     
END;
/

但是请注意,具有ADMINISTER DATABASE TRIGGER系统权限的用户可以丢弃分区,因为他忽略了RAISE_APPLICATION_ERROR

最新更新