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
Sql 如何从不同的数据库复制或更新表索引和约束?_Sql_Oracle - Fatal编程技术网

Sql 如何从不同的数据库复制或更新表索引和约束?

Sql 如何从不同的数据库复制或更新表索引和约束?,sql,oracle,Sql,Oracle,我们有一个生产Oracle 11g数据库,该数据库是由一名试图集成到内部web应用程序的开发人员删除的。他说他忘了自己连接到了生产数据库,并运行了自己的命令php-artisan-migrate:fresh,我搜索了它,它删除了所有表并重新创建了它 然后,他尝试使用flashback命令恢复所有表。所有内容都已恢复,但索引、键和约束已重命名 是否可以将备份数据库的表结构(索引、键、约束)复制/更新到受影响的数据库?我认为没有直接的方法可以获得所需的约束和索引名称,但您可以通过以下几点手动操作来实

我们有一个生产Oracle 11g数据库,该数据库是由一名试图集成到内部web应用程序的开发人员删除的。他说他忘了自己连接到了生产数据库,并运行了自己的命令
php-artisan-migrate:fresh
,我搜索了它,它删除了所有表并重新创建了它

然后,他尝试使用flashback命令恢复所有表。所有内容都已恢复,但索引、键和约束已重命名


是否可以将备份数据库的表结构(索引、键、约束)复制/更新到受影响的数据库?

我认为没有直接的方法可以获得所需的约束和索引名称,但您可以通过以下几点手动操作来实现

首先,可以使用以下命令更改约束名称:

alter table <table_name> rename constraint <constarint_name> to <new_constarint_name>;
ALTER INDEX <index_name> RENAME TO <new_index_name>;
  • 步骤2
使用以下查询在备份数据库中创建相同类型的表:

CREATE TABLE BACKUP_DB_CONS AS
SELECT
    C.TABLE_NAME,
    C.CONSTRAINT_NAME,
    C.CONSTRAINT_TYPE,
    LISTAGG(CC.COLUMN_NAME, ',') WITHIN GROUP(
            ORDER BY
                COLUMN_NAME
        ) CONS_COLUMNS
FROM
    USER_CONSTRAINTS C
    JOIN USER_CONS_COLUMNS CC ON ( C.CONSTRAINT_NAME = CC.CONSTRAINT_NAME )
GROUP BY
    C.TABLE_NAME,
    C.CONSTRAINT_NAME,
    C.CONSTRAINT_TYPE;
  • 步骤3
在备份数据库中执行以下查询,该查询将生成一系列命令来更改生产数据库的所有约束的名称

SELECT
    'ALTER TABLE '
    || B.TABLE_NAME
    || ' RENAME CONSTRAINT '
    || P.CONSTRAINT_NAME
    || ' TO '
    || B.CONSTRAINT_NAME
    || ';'
FROM
    BACKUP_DB_CONS B
    JOIN PROD_DB_CONS P ON ( B.TABLE_NAME = P.TABLE_NAME
                             AND B.CONS_COLUMNS = P.CONS_COLUMNS );
  • 步骤4
复制所有命令并在生产数据库中执行所有命令


干杯

谢谢你。对于步骤3,查询输出已经具有相同约束名称(正确名称)的记录。我想查询由于删除而更改了合同名称的记录。对于我的桌子,它们以BIN$开头。我做了一些修改,但不确定是否正确```这是我的更新代码。请选中“选择”ALTER TABLE“| B.TABLE|U NAME”| |“重命名约束”| P.CONSTRAINT|U NAME | |”为“| B.CONSTRAINT|U NAME |”从备份数据库连接产品数据库连接打开(B.TABLE名称=P.TABLE名称和B.CONSTRAINT类型=P.CONSTRAINT类型和B.CONSTRAINT列=P.CONSTRAINT列)`尝试以下操作:
选择'ALTER TABLE'| B.TABLE_NAME | |'RENAME CONSTRAINT'| P.CONSTRAINT_NAME | |'TO'| | B.CONSTRAINT_NAME | |'从备份数据库连接产品数据库连接打开(B.TABLE\u NAME=P.TABLE\u NAME和B.CONSTRAINT\u TYPE=P.CONSTRAINT\u TYPE和B.CONSTRAINT\u COLUMNS=P.CONSTRAINT\u COLUMNS和B.CONSTRAINT\u NAME P.CONSTRAINT\u NAME)USER\u索引
USER\u索引列
SELECT
    'ALTER TABLE '
    || B.TABLE_NAME
    || ' RENAME CONSTRAINT '
    || P.CONSTRAINT_NAME
    || ' TO '
    || B.CONSTRAINT_NAME
    || ';'
FROM
    BACKUP_DB_CONS B
    JOIN PROD_DB_CONS P ON ( B.TABLE_NAME = P.TABLE_NAME
                             AND B.CONS_COLUMNS = P.CONS_COLUMNS );