如何在 PostgreSQL 触发器函数中获取表名?

Posted

技术标签:

【中文标题】如何在 PostgreSQL 触发器函数中获取表名?【英文标题】:How can I get the table name in a PostgreSQL trigger function? 【发布时间】:2013-08-05 16:01:04 【问题描述】:

我有一个触发功能:

CREATE OR REPLACE FUNCTION "trigger_deleteUsers"()
RETURNS trigger AS
$BODY$
BEGIN
    INSERT INTO "DeletedEntities" ("uuidKey", "dateCreated", "dateModified", "dateSynced", "username", "entityName")
         VALUES (OLD."uuidKey", OLD."dateCreated", OLD."dateModified", "dateSynced", OLD."username", 'Users');
    RETURN NULL;
END;
$BODY$
LANGUAGE plpgsql;

CREATE TRIGGER "deleteUsers" AFTER DELETE ON "Users" FOR EACH ROW EXECUTE PROCEDURE "trigger_deleteUsers"();

这适用于“用户”表。每次我从“Users”表中删除一行时,数据库都会在“DeletedEntities”表中插入一行(“uuidKey”、“dateCreated”、“dateModified”、“dateSynced”、“username”、“entityName”)稍后我将用于同步目的。

以上工作。这是我的问题,我有大约两打桌子。我知道我需要在每个表上创建 TRIGGER,但我不想为每个表创建自定义触发器函数。唯一与上面第一个函数不同的是函数内 INSERT 语句中的最后一个值;而不是“用户”,它将是“分类帐”或“期刊”或其他任何内容。

在 PostgreSQL 触发器函数中,如何获取 OLD 行所属的表的名称?

【问题讨论】:

【参考方案1】:

TG_TABLE_NAME。有关其他触发参数,请参阅文档:http://www.postgresql.org/docs/current/static/plpgsql-trigger.html

【讨论】:

正是我要找的东西,只是在文档中看错了地方。谢谢!【参考方案2】:

试试这个:

TG_TABLE_NAME::regclass::text

我在 9.4 版本中使用它,但它应该从 8.4 开始工作。

这是您进行此更改的代码:

CREATE OR REPLACE FUNCTION "trigger_deleteUsers"()
RETURNS trigger AS
$BODY$
BEGIN
  INSERT INTO "DeletedEntities" ("uuidKey", "dateCreated", "dateModified", "dateSynced", "username", "entityName")
  VALUES (OLD."uuidKey", OLD."dateCreated", OLD."dateModified", "dateSynced", OLD."username", TG_TABLE_NAME::regclass::text);

  RETURN NULL;
END;
$BODY$
LANGUAGE plpgsql;

CREATE TRIGGER "deleteUsers" AFTER DELETE ON "Users" FOR EACH ROW EXECUTE 
PROCEDURE "trigger_deleteUsers"();

如果有帮助请告诉我!

【讨论】:

在 Postgresql 12.2 上工作。

以上是关于如何在 PostgreSQL 触发器函数中获取表名?的主要内容,如果未能解决你的问题,请参考以下文章

Postgresql动态函数,带有当前表名

如何使用 PostgreSQL 从表名中获取列属性查询?

如何在 plpgsql 函数中获取表的关键字段?

如何在 Postgresql 中获取结合 old.variablename 的列数据?

如何在 PostgreSQL 中仅获取数据库的表名

PostgreSQL字段名和表名大小写的问题