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