@@ -46,20 +46,20 @@ create unique index pkeys_i on pkeys (pkey1, pkey2);
46
46
-- (fkey3) --> fkeys2 (pkey23)
47
47
--
48
48
create trigger check_fkeys_pkey_exist
49
- before insert or update on fkeys
49
+ after insert or update on fkeys
50
50
for each row
51
51
execute function
52
52
check_primary_key ('fkey1', 'fkey2', 'pkeys', 'pkey1', 'pkey2');
53
53
create trigger check_fkeys_pkey2_exist
54
- before insert or update on fkeys
54
+ after insert or update on fkeys
55
55
for each row
56
56
execute function check_primary_key ('fkey3', 'fkeys2', 'pkey23');
57
57
--
58
58
-- For fkeys2:
59
59
-- (fkey21, fkey22) --> pkeys (pkey1, pkey2)
60
60
--
61
61
create trigger check_fkeys2_pkey_exist
62
- before insert or update on fkeys2
62
+ after insert or update on fkeys2
63
63
for each row
64
64
execute procedure
65
65
check_primary_key ('fkey21', 'fkey22', 'pkeys', 'pkey1', 'pkey2');
@@ -74,7 +74,7 @@ COMMENT ON TRIGGER check_fkeys2_pkey_exist ON fkeys2 IS NULL;
74
74
-- fkeys (fkey1, fkey2) and fkeys2 (fkey21, fkey22)
75
75
--
76
76
create trigger check_pkeys_fkey_cascade
77
- before delete or update on pkeys
77
+ after delete or update on pkeys
78
78
for each row
79
79
execute procedure
80
80
check_foreign_key (2, 'cascade', 'pkey1', 'pkey2',
@@ -85,9 +85,27 @@ create trigger check_pkeys_fkey_cascade
85
85
-- fkeys (fkey3)
86
86
--
87
87
create trigger check_fkeys2_fkey_restrict
88
- before delete or update on fkeys2
88
+ after delete or update on fkeys2
89
89
for each row
90
90
execute procedure check_foreign_key (1, 'restrict', 'pkey23', 'fkeys', 'fkey3');
91
+ -- BEFORE triggers must raise an error
92
+ create trigger check_fkeys2_pkey_exist_before
93
+ before insert or update on fkeys2
94
+ for each row
95
+ execute procedure
96
+ check_primary_key ('fkey21', 'fkey22', 'pkeys', 'pkey1', 'pkey2');
97
+ create trigger check_pkeys_fkey_cascade_before
98
+ before delete or update on pkeys
99
+ for each row
100
+ execute procedure
101
+ check_foreign_key (2, 'cascade', 'pkey1', 'pkey2',
102
+ 'fkeys', 'fkey1', 'fkey2', 'fkeys2', 'fkey21', 'fkey22');
103
+ update pkeys set pkey1 = 7, pkey2 = '70' where pkey1 = 10 and pkey2 = '1';
104
+ ERROR: check_foreign_key: must be fired by AFTER trigger
105
+ insert into fkeys2 values (10, '1', 1);
106
+ ERROR: check_primary_key: must be fired by AFTER trigger
107
+ drop trigger check_fkeys2_pkey_exist_before on fkeys2;
108
+ drop trigger check_pkeys_fkey_cascade_before on pkeys;
91
109
insert into fkeys2 values (10, '1', 1);
92
110
insert into fkeys2 values (30, '3', 2);
93
111
insert into fkeys2 values (40, '4', 5);
@@ -116,12 +134,11 @@ delete from pkeys where pkey1 = 40 and pkey2 = '4';
116
134
NOTICE: check_pkeys_fkey_cascade: 1 tuple(s) of fkeys are deleted
117
135
NOTICE: check_pkeys_fkey_cascade: 1 tuple(s) of fkeys2 are deleted
118
136
update pkeys set pkey1 = 7, pkey2 = '70' where pkey1 = 50 and pkey2 = '5';
119
- NOTICE: check_pkeys_fkey_cascade: 1 tuple(s) of fkeys are deleted
120
- ERROR: "check_fkeys2_fkey_restrict": tuple is referenced in "fkeys"
121
- CONTEXT: SQL statement "delete from fkeys2 where fkey21 = $1 and fkey22 = $2 "
137
+ NOTICE: check_pkeys_fkey_cascade: 1 tuple(s) of fkeys are updated
138
+ NOTICE: check_pkeys_fkey_cascade: 1 tuple(s) of fkeys2 are updated
122
139
update pkeys set pkey1 = 7, pkey2 = '70' where pkey1 = 10 and pkey2 = '1';
123
- NOTICE : check_pkeys_fkey_cascade: 1 tuple(s) of fkeys are deleted
124
- NOTICE : check_pkeys_fkey_cascade: 1 tuple(s) of fkeys2 are deleted
140
+ ERROR : duplicate key value violates unique constraint "pkeys_i"
141
+ DETAIL : Key (pkey1, pkey2)=(7, 70) already exists.
125
142
SELECT trigger_name, event_manipulation, event_object_schema, event_object_table,
126
143
action_order, action_condition, action_orientation, action_timing,
127
144
action_reference_old_table, action_reference_new_table
@@ -130,16 +147,16 @@ SELECT trigger_name, event_manipulation, event_object_schema, event_object_table
130
147
ORDER BY trigger_name COLLATE "C", 2;
131
148
trigger_name | event_manipulation | event_object_schema | event_object_table | action_order | action_condition | action_orientation | action_timing | action_reference_old_table | action_reference_new_table
132
149
----------------------------+--------------------+---------------------+--------------------+--------------+------------------+--------------------+---------------+----------------------------+----------------------------
133
- check_fkeys2_fkey_restrict | DELETE | public | fkeys2 | 1 | | ROW | BEFORE | |
134
- check_fkeys2_fkey_restrict | UPDATE | public | fkeys2 | 1 | | ROW | BEFORE | |
135
- check_fkeys2_pkey_exist | INSERT | public | fkeys2 | 1 | | ROW | BEFORE | |
136
- check_fkeys2_pkey_exist | UPDATE | public | fkeys2 | 2 | | ROW | BEFORE | |
137
- check_fkeys_pkey2_exist | INSERT | public | fkeys | 1 | | ROW | BEFORE | |
138
- check_fkeys_pkey2_exist | UPDATE | public | fkeys | 1 | | ROW | BEFORE | |
139
- check_fkeys_pkey_exist | INSERT | public | fkeys | 2 | | ROW | BEFORE | |
140
- check_fkeys_pkey_exist | UPDATE | public | fkeys | 2 | | ROW | BEFORE | |
141
- check_pkeys_fkey_cascade | DELETE | public | pkeys | 1 | | ROW | BEFORE | |
142
- check_pkeys_fkey_cascade | UPDATE | public | pkeys | 1 | | ROW | BEFORE | |
150
+ check_fkeys2_fkey_restrict | DELETE | public | fkeys2 | 1 | | ROW | AFTER | |
151
+ check_fkeys2_fkey_restrict | UPDATE | public | fkeys2 | 1 | | ROW | AFTER | |
152
+ check_fkeys2_pkey_exist | INSERT | public | fkeys2 | 1 | | ROW | AFTER | |
153
+ check_fkeys2_pkey_exist | UPDATE | public | fkeys2 | 2 | | ROW | AFTER | |
154
+ check_fkeys_pkey2_exist | INSERT | public | fkeys | 1 | | ROW | AFTER | |
155
+ check_fkeys_pkey2_exist | UPDATE | public | fkeys | 1 | | ROW | AFTER | |
156
+ check_fkeys_pkey_exist | INSERT | public | fkeys | 2 | | ROW | AFTER | |
157
+ check_fkeys_pkey_exist | UPDATE | public | fkeys | 2 | | ROW | AFTER | |
158
+ check_pkeys_fkey_cascade | DELETE | public | pkeys | 1 | | ROW | AFTER | |
159
+ check_pkeys_fkey_cascade | UPDATE | public | pkeys | 1 | | ROW | AFTER | |
143
160
(10 rows)
144
161
145
162
DROP TABLE pkeys;
0 commit comments