【问题标题】:Drop partition trigger in OracleOracle 中的删除分区触发器
【发布时间】:2018-11-02 11:32:30
【问题描述】:

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

我们可以对删除分区做同样的事情吗?

我们可以存储详细信息吗?就像这个分区被这个特定的用户删除了一样。

我们能否通过触发器阻止用户删除分区或捕获哪个用户删除了分区

【问题讨论】:

    标签: sql database oracle


    【解决方案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

    【讨论】:

    • 非常感谢。还有一件事,如果我们想存储哪个分区被哪个用户删除了,我们该怎么办?
    • 你必须解析cmd字符串
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-11
    • 1970-01-01
    相关资源
    最近更新 更多