snippetsqlModerate
How to access to other INSERTed/UPDATEd rows from trigger in PostgreSQL?
Viewed 0 times
fromrowspostgresqltriggerinsertedupdatedhowotheraccess
Problem
Solution in MS SQL
MS SQL trigger functions have
or find out minimum value:
Problem with PostgreSQL
For
For
PostgreSQL does not allow the old and new tables to be referenced in statement-level triggers, i.e., the tables that contain all the old and/or new rows, which are referred to by the OLD TABLE and NEW TABLE clauses in the SQL standard.
Try with transaction_timestamp() additional column
I can add special column with
So, this try was failed.
Bad solution in PostgreSQL
The only way I know is that:
First, use
```
CREATE TEMP TABLE IF NOT EXISTS _stats (
MS SQL trigger functions have
deleted and inserted system tables in which all rows affected by operation are stored. You can count updated rows:set @updatedCount = (select count(*) from deleted)or find out minimum value:
set @updatedMinimumCol1 = (select min(col1) from deleted)Problem with PostgreSQL
For
FOR EACH ROW triggers I can use OLD and NEW system records, but they store only 1 row for each call of trigger. Calls of trigger are separated, so if user updates 10 rows, trigger will be called 10 times, but each time I can know only about 1 current row, not about all 10 rows.For
FOR EACH STATEMENT I do not know any mechanism of access to updated rows at all. I use PostgreSQL v9.6, OLD TABLE and NEW TABLE were introduced in v10.PostgreSQL does not allow the old and new tables to be referenced in statement-level triggers, i.e., the tables that contain all the old and/or new rows, which are referred to by the OLD TABLE and NEW TABLE clauses in the SQL standard.
Try with transaction_timestamp() additional column
I can add special column with
DEFAULT transaction_timestamp() to the main table and then use it to distinguish just-now-updated rows from other, but it is not a solution since multiple INSERTs/UPDATEs can be in one transaction and they will have the same timestamp of transaction. Probably I could clear this timestamp column in trigger after each statement to avoid this problem, but how to do this if such clearing will emit update trigger again - will be infinite update trigger calling.So, this try was failed.
Bad solution in PostgreSQL
The only way I know is that:
First, use
FOR EACH ROW trigger to collect current statistics (min and count) like aggregate functions. I use temp table to store it between calls (this trigger gets called 1 time for each row). But we will not know which row is last (when time will come to use this statistics).```
CREATE TEMP TABLE IF NOT EXISTS _stats (
Solution
See the docs, you should be able to access the old and new records from a statement trigger:
CREATE TRIGGER some_table_update_trigger
AFTER UPDATE ON some_table
REFERENCING NEW TABLE AS newtab OLD TABLE AS oldtab
FOR EACH STATEMENT
EXECUTE PROCEDURE do_something_with_newtab_and_oldtab();Code Snippets
CREATE TRIGGER some_table_update_trigger
AFTER UPDATE ON some_table
REFERENCING NEW TABLE AS newtab OLD TABLE AS oldtab
FOR EACH STATEMENT
EXECUTE PROCEDURE do_something_with_newtab_and_oldtab();Context
StackExchange Database Administrators Q#212135, answer score: 10
Revisions (0)
No revisions yet.