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

27

我有一个触发函数:

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”表。每次我从“Users”表中删除一行时,数据库都会将一行(“uuidKey”,“dateCreated”,“dateModified”,“dateSynced”,“username”,“entityName”)插入到“DeletedEntities”表中,以供稍后用于同步目的。

上述方法有效。这是我的问题:我有大约两打表格。我知道我需要在每个表上创建触发器,但我不想为每个表创建自定义触发器函数。与上面的第一个函数不同的是,在函数内的INSERT语句的最后一个值会改变;它将不是'Users',而是“Ledgers”,或“Journal”,或其他任何东西。

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

2个回答

44

正是我需要的,只是我在文档中看错了位置。谢谢! - adamek

7

试试这个:

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"();

如果有帮助,请告诉我!


3
适用于Postgresql 12.2。 - Ben Asmussen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接