我如何从另一个模式的触发器调用另一个模式的过程

问题描述 投票:0回答:1

我正在尝试创建一个触发器,以记录特定模式(模式DS)的所有ddl更改并更新另一个模式(模式SD)的那些更改。

CREATE OR REPLACE TRIGGER audit_ddl_trg AFTER DDL ON SCHEMA DECLARE
    sql_text   ora_name_list_t;
    v_stmt     VARCHAR2(2000);
    n          PLS_INTEGER;
BEGIN
    n := ora_sql_txt(sql_text);
    FOR i IN 1..n LOOP v_stmt := v_stmt || sql_text(i);
    END LOOP;

    v_stmt := regexp_replace(v_stmt, 'rename[[:space:]]+.*[[:space:]]+to[[:space:]]+([a-z0-9_]+)', '\1', 1, 1,
               'i');
    IF ( ora_sysevent = 'TRUNCATE' ) THEN
        NULL;
    ELSE
        INSERT INTO audit_ddl (
            d,
            osuser,
            current_user,
            host,
            terminal,
            owner,
            type,
            name,
            sysevent,
            statements
        ) VALUES (
            sysdate,
            sys_context('USERENV', 'OS_USER'),
            sys_context('USERENV', 'CURRENT_USER'),
            sys_context('USERENV', 'HOST'),
            sys_context('USERENV', 'TERMINAL'),
            ora_dict_obj_owner,
            ora_dict_obj_type,
            ora_dict_obj_name,
            ora_sysevent,
            v_stmt
        );

        sd.insert_log(sql_text);
    END IF;

END;
/ 

但是,似乎无法识别该过程。我尝试创建数据库链接。但这也不起作用。反正有解决这个问题的方法吗?

oracle plsql ddl database-trigger
1个回答
0
投票

我怀疑您在一个模式中有触发器,而在另一模式中有表,但是我不知道是哪个。假设AUDIT_DDL_TRIG在模式DS中,而表AUDIT_DDL在模式SD中。在这种情况下,您需要使用表所在的模式来限定表的名称,即INSERT INTO SD.AUDIT_DDL(... whatever ...)。另外,模式DS将需要具有适当的GRANT,以便可以将数据存储到该表中,例如在GRANT INSERT INTO SD.AUDIT_DLL TO DS

© www.soinside.com 2019 - 2024. All rights reserved.