![](/img/trans.png)
[英]How can I temporarily disable all constraints in a Table in Firebird 2.1?
[英]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.