7

AWS Aurora Postgres を使用しており、DMS を使用して RDS postgres から Aurora PG に移行しています。FULL LOAD を実行するために、すべてのオブジェクトで外部キー制約とトリガーを無効にしたいと考えています。トリガーを無効にすることはできますが、制約を無効にする方法が見つかりませんでした。

以下は機能しません:

ALTER TABLE so_items DISABLE CONSTRAINT so_items_so_id_fkey;

それはスローします:

エラー: "CONSTRAINT" 行 1 またはその近くの構文エラー: ALTER TABLE so_items DISABLE CONSTRAINT so_items_so_id_fkey; ^ SQL 状態: 42601 文字: 30

パラメーター グループで "session_replication_role" = "replica" を設定しても機能しませんでした。DMS タスクは準備のテーブル部分を切り捨てようとしますが、それでも外部キー違反エラーで失敗します。

回避策を教えてください。

注: RDS では、マスター アカウントでも実行する権限がないため、以下を実行できませんでした。

alter table so_items disable trigger ALL;

エラー: 権限が拒否されました: "RI_ConstraintTrigger_c_16520" はシステム トリガーの SQL 状態です: 42501

4

1 に答える 1

9

制約を無効にすることはできません。これでは意味がありません。

あなたDROP CONSTRAINT

ALTER TABLE so_items DROP CONSTRAINT so_items_so_id_fkey;

永久に削除するか、制約チェックをトランザクションの最後まで延期します。

ALTER TABLE so_items ALTER CONSTRAINT so_items_so_id_fkey DEFERRABLE INITIALLY DEFERRED;

その変更により、制約は現在のトランザクションの終了時に変更された後に評価されます。これにより、トランザクション内の制約を破ることができます。

Postgres 制約が依存するトリガーを変更しないでください。これは、気にする必要のない実装の詳細です。

編集:テーブルの外部キー制約にも影響するトリガーを無効にすることもできます

ALTER TABLE so_items DISABLE TRIGGER ALL;

ただし、後でトリガーを再度有効にすると、外部キーはチェックされません。これにより、データベース内の外部キーが無効または矛盾する可能性があります。

于 2018-01-19T06:22:01.373 に答える