How can I get the table name in a PostgreSQL trigger function?

16,779

Solution 1

TG_TABLE_NAME. See the docs for other trigger arguments: http://www.postgresql.org/docs/current/static/plpgsql-trigger.html

Solution 2

try this:

TG_TABLE_NAME::regclass::text

I use it with version 9.4 but it should be working from 8.4 up.

Here is your code with this change:

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

let me know if it helps!

Share:
16,779

Related videos on Youtube

adamek
Author by

adamek

Updated on September 15, 2022

Comments

  • adamek
    adamek over 1 year

    I have a trigger function:

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

    This works for the table "Users". Every time I delete a row from the "Users" table the database inserts a row with ("uuidKey", "dateCreated", "dateModified", "dateSynced", "username", "entityName") into the table "DeletedEntities" that I will use for syncing purposes later.

    The above works. Here's my problem I have about two dozen tables. I know I need to CREATE TRIGGER on each table, but I don't want to have to create a custom trigger function for each table. The only thing that would change from first function above is the last value in the INSERT statement within the function; instead of 'Users' it would be "Ledgers", or "Journal", or whatever.

    Within a PostgreSQL trigger function, how do I get the name of the table that the OLD row belongs too?

  • adamek
    adamek over 10 years
    Just what I was looking for, just looked in the wrong place in the documentation. Thanks!
  • Ben Asmussen
    Ben Asmussen about 4 years
    Works on a Postgresql 12.2.