簡體   English   中英

如何暫時禁用 postgresql 中模式的所有約束?

[英]How to temporarily disable all constraints of a schema in postgresql?

我需要暫時禁用架構的所有約束和觸發器,以便匿名化多個表中的數據。 由於表之間存在依賴關系,我更喜歡禁用所有內容,一旦匿名處理結束,我可以再次啟用所有約束和觸發器。

我試過SET FOREIGN_KEY_CHECKS=0; 我得到了這個錯誤:

錯誤:無法識別的配置參數“foreign_key_checks”SQL state:42704

我已經閱讀了很多相關內容,有些人說這是不可能的。

你知道這樣做的方法嗎?

謝謝你!

要禁用表的外鍵和可延遲的唯一鍵和主鍵約束,您可以使用

ALTER TABLE ... DISABLE TRIGGER ALL;

要在數據庫 session 的持續時間內禁用所有此類約束,您可以

SET session_replication_role = replica;

這兩種技巧都不適用於不可延遲約束和檢查約束。

我找到了這個解決方案,

我創建了一個臨時表來保留所有約束定義:

CREATE TEMPORARY TABLE temp_constraints AS
SELECT conname constraintname, conrelid::regclass tablename, pg_get_constraintdef(oid) definition, contype 
FROM pg_catalog.pg_constraint;

然后我放棄所有約束:

DO $$
DECLARE constraint_name TEXT;
DECLARE constraint_table TEXT;
BEGIN
    FOR constraint_name, constraint_table IN
    SELECT constraintname ,  tablename FROM temp_constraints ORDER BY contype DESC
        LOOP
            EXECUTE 'ALTER TABLE ' || constraint_table || ' DROP CONSTRAINT IF EXISTS ' || constraint_name || ' CASCADE;';
        END LOOP;
END $$;

在匿名化數據之后,我使用時態表中的定義恢復所有約束,然后刪除時態表:

DO $$
DECLARE constraint_table TEXT;
DECLARE constraint_definition TEXT;
BEGIN
    FOR constraint_table, constraint_definition IN 
    SELECT tablename, definition FROM temp_constraints ORDER BY contype DESC
        LOOP
            EXECUTE 'ALTER TABLE ' || constraint_table || ' ADD ' || constraint_definition || ';';
        END LOOP;
    DROP TABLE IF EXISTS temp_constraints;
END $$;

我希望這可以幫助別人。 謝謝你!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM