test.sql
text/plain
CREATE FUNCTION check_primary_key ()
RETURNS trigger
AS '$libdir/refint.so'
LANGUAGE C;
CREATE FUNCTION check_foreign_key ()
RETURNS trigger
AS '$libdir/refint.so'
LANGUAGE C;
create table pkeys (pkey1 int4 not null, pkey2 text not null);
create table fkeys (fkey1 int4, fkey2 text);
create index fkeys_i on fkeys (fkey1, fkey2);
insert into pkeys values (10, '1');
insert into pkeys values (20, '2');
create unique index pkeys_i on pkeys (pkey1, pkey2);
create trigger check_fkeys_pkey_exist
before insert or update on fkeys
for each row
execute function
check_primary_key ('fkey1', 'fkey2', 'pkeys', 'pkey1', 'pkey2');
create trigger check_pkeys_fkey_cascade
before delete or update on pkeys
for each row
execute procedure
check_foreign_key (1, 'cascade', 'pkey1', 'pkey2', 'fkeys', 'fkey1', 'fkey2');
insert into fkeys values (10, '1');
insert into fkeys values (20, '2');
select * from fkeys;
delete from pkeys where pkey1 = 10 and pkey2 = '1';
-- cascade drop. Good. --
select * from fkeys;
update pkeys set pkey1 = 7, pkey2 = '70' where pkey1 = 20 and pkey2 = '2';
-- cascade drop. Bad. --
select * from fkeys;