【问题标题】:Is there a way to log table creation and column modification in a table with the one who execute it, in oracle schema?有没有一种方法可以在 oracle 模式中记录表的创建和列修改以及执行它的人?
【发布时间】:2017-02-03 17:13:17
【问题描述】:

我正在寻找一种方法,仅将添加到数据库中的表和列与创建它的人 (nachin_name) 一起存储在日志表中。

我试图在 sys 表 user_tab_cols 上添加一个触发器,但我不能这样做 Why cannot I create triggers on objects owned by SYS?

系统表 user_objects 会给我创建表的日期,但我也想知道是哪台机器创建了它。而且我还想跟踪列的创建和修改并将它们记录在一个表中。

这可能吗?有办法吗?

【问题讨论】:

    标签: oracle


    【解决方案1】:

    您可以创建数据库事件触发器:

    CREATE OR REPLACE TRIGGER log_ddl_event_trg
      AFTER DDL
      ON DATABASE
    DECLARE
      v_sql_list  ora_name_list_t;
      v_sql_txt   VARCHAR2(2500);
    BEGIN
      FOR i in 1..ORA_SQL_TXT(v_sql_list) LOOP
        v_sql_txt := v_sql_txt || v_sql_list(i);
        EXIT WHEN length(v_sql_txt ) >= 2000;
      END LOOP;
    
     ...
    END;
    /
    

    在Trigger中,您可以使用ORA_SQL_TXT()函数获取执行的ddl-statement,然后将其与其他数据(log_date、user等)一起记录在表中。

    【讨论】:

    • 我也可以在 dml 上做吗?
    • dml 是插入/更新/删除。您当然可以在插入、更新或删除时创建触发器,但您已经问过如何记录“数据库中添加的表和列”
    • 我可以在插入或更新所有数据库时添加创建触发器吗?顺便说一句,在检查时我注意到它不会记录仅创建和更改的 drop 语句
    • 据我所知,无法在数据库上创建插入或更新触发器,只能在表或视图上创建
    猜你喜欢
    • 2022-11-25
    • 1970-01-01
    • 2018-03-13
    • 2018-10-08
    • 2013-03-08
    • 1970-01-01
    • 2022-07-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多