Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Làm cách nào để sao chép hoặc cập nhật các chỉ mục và ràng buộc của bảng từ các cơ sở dữ liệu khác nhau?

Tôi nghĩ rằng không có cách nào trực tiếp để có được tên mong muốn của các ràng buộc và Chỉ mục, nhưng có, bạn có thể đạt được nó với một chút thao tác thủ công như sau.

Trước hết, bạn có thể thay đổi tên ràng buộc bằng lệnh sau:

alter table <table_name> rename constraint <constarint_name> to <new_constarint_name>;

Theo cách tương tự, bạn có thể thay đổi tên chỉ mục bằng lệnh sau:

ALTER INDEX <index_name> RENAME TO <new_index_name>;

Trong trường hợp của bạn, bạn cần một số cách để liên kết tên (ràng buộc / chỉ mục) xấu với tên chính xác. và sau đó đổi tên các ràng buộc / Chỉ mục bằng tên chính xác. Để đạt được nó, bạn có thể thử các bước sau. (Tôi đang đưa ra ví dụ cho các Ràng buộc, bạn có thể đạt được điều tương tự cho các chỉ mục)

  • Bước 1

Nhận tên ràng buộc và dữ liệu của chúng từ production DB bằng cách sử dụng truy vấn sau và tạo một bảng trong Dự phòng DB sử dụng dữ liệu đó. (Bạn có thể sử dụng SQL Loader hoặc External table cho nó.) Đặt tên của bảng này là PROD_DB_CONS

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;
  • Bước 2

Tạo cùng một loại bảng trong DB dự phòng sử dụng truy vấn sau:

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;
  • Bước 3

Thực thi truy vấn sau trong Dự phòng DB sẽ tạo ra một loạt các lệnh để thay đổi tên của tất cả các ràng buộc của sản xuất DB

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 );
  • Bước 4

Sao chép tất cả các lệnh và thực thi tất cả chúng trong production DB .

Chúc mừng !!




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Sử dụng REGEXP_SUBSTR với Strings Qualifier

  2. Hàm INITCAP () trong Oracle

  3. chuyển đổi giá trị được phân tách bằng dấu phẩy thành nhiều hàng

  4. Sql - thay thế cho WITH ... AS

  5. Oracle / SQL - Tìm các bản ghi có một giá trị không bao gồm giá trị null