database - 如何为postgresql中的所有表创建触发器?

标签 database postgresql triggers database-trigger

我有一个触发器,但我需要关联我的 postgres 的所有表。 下面有这样的命令吗?

CREATE TRIGGER delete_data_alldb
BEFORE DELETE
ON ALL DATABASE
FOR EACH ROW
EXECUTE PROCEDURE delete_data();

最佳答案

好吧,没有数据库范围的触发器创建,但对于所有此类批量管理操作,您可以使用 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;

这将为您提供一组字符串,这些字符串是 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

您只需要立即运行它们(通过 psql 或 pgAdmin)。

现在一些解释:

  • 我使用 information_schema.tables 系统表在我的数据库中选择表的名称。因为几乎所有表都有数据,请记住从您的 select 中排除 pg_cataloginformation_schema 架构和 toast 表。
  • 我使用 quote_ident(text) 函数,该函数会在必要时将字符串放在双引号 ("") 中(即名称需要包含空格或大写字母) .
  • 当我有表名列表时,我只是将它们与一些静态字符串连接起来以获得我的 SQL 命令。
  • 我使用子查询编写该命令是因为我希望您能更好地了解这里发生的事情。您可以通过放置 quote_ident(table_schema) || 来编写单个查询'.' || quote_ident(table_name) 代替 tab_name

关于database - 如何为postgresql中的所有表创建触发器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29675347/

相关文章:

sql - 根据不同列中的值集以任何顺序连接表

mysql - 我可以使用 NativeScript 在应用程序中读取和写入数据库吗?

bash - 从 Bash 脚本在 PostgreSQL 中创建 FUNCTION

javascript - 为什么 $ ('#file-input' ).click() 在浏览器控制台中调用时不打开文件输入对话框?

mysql - 如何使用存储过程设置新触发器值?

java - 用于检查 "unseriousness"的应用程序/脚本可能吗?

mysql - 导入mysql数据库时出错

mysql - 跨公司计算机共享数据库

java - 错误 : COALESCE types bytea and character varying in PostgreSQL

azure - 即使满足条件,逻辑应用程序在第一个警报后也不会触发警报