mirror of
https://github.com/postgres/postgres.git
synced 2025-11-04 20:11:56 +03:00
Support triggers on views.
This patch adds the SQL-standard concept of an INSTEAD OF trigger, which is fired instead of performing a physical insert/update/delete. The trigger function is passed the entire old and/or new rows of the view, and must figure out what to do to the underlying tables to implement the update. So this feature can be used to implement updatable views using trigger programming style rather than rule hacking. In passing, this patch corrects the names of some columns in the information_schema.triggers view. It seems the SQL committee renamed them somewhere between SQL:99 and SQL:2003. Dean Rasheed, reviewed by Bernd Helmle; some additional hacking by me.
This commit is contained in:
@@ -71,26 +71,31 @@ typedef struct Trigger
|
||||
|
||||
typedef struct TriggerDesc
|
||||
{
|
||||
Trigger *triggers; /* array of Trigger structs */
|
||||
int numtriggers; /* number of array entries */
|
||||
|
||||
/*
|
||||
* Index data to identify which triggers are which. Since each trigger
|
||||
* can appear in more than one class, for each class we provide a list of
|
||||
* integer indexes into the triggers array. The class codes are defined
|
||||
* by TRIGGER_EVENT_xxx macros in commands/trigger.h.
|
||||
* These flags indicate whether the array contains at least one of each
|
||||
* type of trigger. We use these to skip searching the array if not.
|
||||
*/
|
||||
#define TRIGGER_NUM_EVENT_CLASSES 4
|
||||
|
||||
uint16 n_before_statement[TRIGGER_NUM_EVENT_CLASSES];
|
||||
uint16 n_before_row[TRIGGER_NUM_EVENT_CLASSES];
|
||||
uint16 n_after_row[TRIGGER_NUM_EVENT_CLASSES];
|
||||
uint16 n_after_statement[TRIGGER_NUM_EVENT_CLASSES];
|
||||
int *tg_before_statement[TRIGGER_NUM_EVENT_CLASSES];
|
||||
int *tg_before_row[TRIGGER_NUM_EVENT_CLASSES];
|
||||
int *tg_after_row[TRIGGER_NUM_EVENT_CLASSES];
|
||||
int *tg_after_statement[TRIGGER_NUM_EVENT_CLASSES];
|
||||
|
||||
/* The actual array of triggers is here */
|
||||
Trigger *triggers;
|
||||
int numtriggers;
|
||||
bool trig_insert_before_row;
|
||||
bool trig_insert_after_row;
|
||||
bool trig_insert_instead_row;
|
||||
bool trig_insert_before_statement;
|
||||
bool trig_insert_after_statement;
|
||||
bool trig_update_before_row;
|
||||
bool trig_update_after_row;
|
||||
bool trig_update_instead_row;
|
||||
bool trig_update_before_statement;
|
||||
bool trig_update_after_statement;
|
||||
bool trig_delete_before_row;
|
||||
bool trig_delete_after_row;
|
||||
bool trig_delete_instead_row;
|
||||
bool trig_delete_before_statement;
|
||||
bool trig_delete_after_statement;
|
||||
/* there are no row-level truncate triggers */
|
||||
bool trig_truncate_before_statement;
|
||||
bool trig_truncate_after_statement;
|
||||
} TriggerDesc;
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user