Edu*_*uza 9 database postgresql triggers database-trigger
我有一个触发器,但我需要与我的postgres的所有表关联.下面有这样的命令吗?
CREATE TRIGGER delete_data_alldb
BEFORE DELETE
ON ALL DATABASE
FOR EACH ROW
EXECUTE PROCEDURE delete_data();
Run Code Online (Sandbox Code Playgroud)
好吧,没有数据库范围的触发器创建,但是对于所有这样的批量管理操作,您可以使用PostgreSQL系统表为您生成查询,而不是手动编写它们.在这种情况下,您可以运行:
SELECT
'CREATE TRIGGER '
|| tab_name
|| ' BEFORE DELETE ON ALL DATABASE FOR EACH ROW EXECUTE PROCEDURE delete_data();' AS trigger_creation_query
FROM (
SELECT
quote_ident(table_schema) || '.' || quote_ident(table_name) as tab_name
FROM
information_schema.tables
WHERE
table_schema NOT IN ('pg_catalog', 'information_schema')
AND table_schema NOT LIKE 'pg_toast%'
) tablist;
Run Code Online (Sandbox Code Playgroud)
这将为您提供一组字符串,这些字符串是SQL命令,如:
CREATE TRIGGER schema1.table1 BEFORE DELETE ON ALL DATABASE FOR EACH ROW EXECUTE PROCEDURE delete_data();
CREATE TRIGGER schema1.table2 BEFORE DELETE ON ALL DATABASE FOR EACH ROW EXECUTE PROCEDURE delete_data();
CREATE TRIGGER schema1.table3 BEFORE DELETE ON ALL DATABASE FOR EACH ROW EXECUTE PROCEDURE delete_data();
CREATE TRIGGER schema2.table1 BEFORE DELETE ON ALL DATABASE FOR EACH ROW EXECUTE PROCEDURE delete_data();
CREATE TRIGGER schema2."TABLE2" BEFORE DELETE ON ALL DATABASE FOR EACH ROW EXECUTE PROCEDURE delete_data();
...
etc
Run Code Online (Sandbox Code Playgroud)
您只需要立即运行它们(通过psql或pgAdmin).
现在一些解释:
information_schema.tables系统表选择数据库中的表名.因为有几乎所有表的数据,记得从你的表中排除pg_catalog和information_schema模式和toast表select.quote_ident(text)函数,""如果需要,将字符串放在双引号()中(即带有空格或大写字母的名称需要).quote_ident(table_schema) || '.' || quote_ident(table_name)代替来编写单个查询tab_name.