在Oracle中删除分区触发器

时间:2018-11-02 11:32:31

标签: sql database oracle

我们如何在Oracle中创建放置分区DDL触发器。 例如 假设我们创建DDL触发器来捕获或阻止有人在我们的架构中触发TABLE / INDEX或其他动作。 创建或替换触发器my_trg 在模式上执行DROP后

我们可以对拖放分区做同样的事情吗?

我们可以存储详细信息吗?。例如该分区已被该特定用户删除。

我们可以阻止用户通过触发器删除分区还是捕获哪个用户删除了分区

1 个答案:

答案 0 :(得分:1)

触发器将是此触发器:

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, 'DROP\s+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

来删除分区。