Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle 如何将DDL更改从一个模式镜像到另一个模式?_Oracle_Triggers_Ddl - Fatal编程技术网

Oracle 如何将DDL更改从一个模式镜像到另一个模式?

Oracle 如何将DDL更改从一个模式镜像到另一个模式?,oracle,triggers,ddl,Oracle,Triggers,Ddl,我需要保持归档表的结构与主表相同。每当我们在主表上执行DDL时,我也希望在归档表上执行相同的DDL。请建议如何在Oracle DB中实现它 考虑下面的场景,其中我有两个表A.T1_TAB和B.T1_TAB_ARCH。 我正在向a.T1_选项卡添加一列(名称VARCHAR2(30))。我需要在B.T1_TAB_ARCH中添加相同的列 --SCHEMA B: CREATE TABLE T1_TAB_ARCH(ID NUMBER); --SCHEMA A: CREATE TABLE T1_TAB(ID

我需要保持归档表的结构与主表相同。每当我们在主表上执行DDL时,我也希望在归档表上执行相同的DDL。请建议如何在Oracle DB中实现它

考虑下面的场景,其中我有两个表A.T1_TAB和B.T1_TAB_ARCH。 我正在向a.T1_选项卡添加一列(名称VARCHAR2(30))。我需要在B.T1_TAB_ARCH中添加相同的列

--SCHEMA B:
CREATE TABLE T1_TAB_ARCH(ID NUMBER);
--SCHEMA A:
CREATE TABLE T1_TAB(ID NUMBER);

ALTER TABLE T1_TAB ADD NAME VARCHAR2(30);--Added column in A.T1_TAB
我们可以使用DDL触发器或任何其他方法来完成吗

此外,我希望仅对存储在单独查找表中的一组表启用此功能

谢谢
K

我可以给你我的触发器,它可以写入我数据库中的每个DDL。在迁移之前必须测试数据库性能时,我使用此触发器。这有助于使第二个数据库保持最新。我在这个表中有很多信息,我使用的上一个数据库有50TB和200多个用户

CREATE TABLE SESSION_DDLS
(
  SID           NUMBER,
  SERIAL        NUMBER,
  USERNAME      VARCHAR2(30 BYTE),
  OSUSER        VARCHAR2(30 BYTE),
  MACHINE       VARCHAR2(64 BYTE),
  IP_ADDR       VARCHAR2(30 BYTE),
  PROCESS       VARCHAR2(15 BYTE),
  PROGRAM       VARCHAR2(48 BYTE),
  MODULE        VARCHAR2(48 BYTE),
  LOGON_TIME    DATE,
  DATE_CREATED  DATE,
  OWNER         VARCHAR2(30 BYTE),
  OBJECT_NAME   VARCHAR2(128 BYTE),
  OBJECT_TYPE   VARCHAR2(18 BYTE),
  EVENT         VARCHAR2(16 BYTE),
  SQL_TEXT      VARCHAR2(4000 BYTE)
)

CREATE OR REPLACE TRIGGER session_ddls
    BEFORE DDL
    ON DATABASE
DECLARE
    v_sid      NUMBER;
    sql_text   ora_name_list_t;
    stmt       VARCHAR2 ( 1000 ) := '';
    n          BINARY_INTEGER := 0;
BEGIN
    SELECT DISTINCT sid
      INTO v_sid
      FROM sys.v_$mystat;

    n := NVL ( ora_sql_txt ( sql_text ), 0 );

    FOR i IN 1 .. n
    LOOP
        stmt := SUBSTR ( stmt || sql_text ( i ), 1, 1000 );
    END LOOP;

    IF LOWER ( stmt ) LIKE '%identified by%' THEN
        stmt := SUBSTR ( stmt, 1, 20 );
    END IF;

    INSERT INTO o2o.session_ddls
        SELECT vses.sid,
               vses.serial#,
               vses.username,
               vses.osuser,
               vses.machine,
               SYS_CONTEXT ( 'userenv', 'ip_address' ),
               vses.process,
               vses.program,
               vses.module,
               vses.logon_time,
               SYSDATE,
               sys.dictionary_obj_owner,
               sys.dictionary_obj_name,
               sys.dictionary_obj_type,
               sys.sysevent,
               stmt
          FROM sys.v_$session vses
         WHERE vses.sid = v_sid;
END;
/
我认为这对你来说是一个好的开始。首先,您必须在DICTIONARY_OBJ_类型之后进行筛选,因为您对表感兴趣;其次,您可以在DICTIONARY_OBJ_所有者和DICTIONARY_OBJ_名称上实现一些筛选;最后,如果需要,您可以在ARCH表上执行SYSEVENT中的语句,但别忘了将你的拱形后缀连在字典的名字上

如果我没有说清楚,请告诉我

祝你好运