Eksempel: Å lage en trigger i C

Steg 1: Skriv en funksjon i C.
Min funksjon sjekker at input er korrekt ved insert og update.
Se på koden her

Steg 2: Kompiler koden som shared object.

gcc -L/usr/lib/pgsql -I/usr/include/pgsql/server -lpq -shared -o sjekkrna.so sjekkrna.c

Steg 3: Opprett tabellen, funksjonen og triggeren i psql

create table cFunkTest(
  id int not null,
  navn varchar(30),
  regnr varchar(6),
  alder int,
  primary key(id));

create function sjekkrna() RETURNS TRIGGER AS
'/home/ansatte/elinkaan/moddb/sjekkrna.so' LANGUAGE C;

create trigger rnabefore BEFORE INSERT OR UPDATE ON cFunkTest
for each row execute procedure sjekkrna();
      

Steg 4: Legg inn testdata for å sjekke at alt er ok

insert into cFunkTest
values(1, 'Hans Nilsen', 'AA2345', -1);
ERROR:  sjekkrna: alder=-1, kan ikke være negativ verdi

insert into cFunkTest
values(2, 'Per Olsen', 'AA1111', 25);
INSERT 4464450 1

insert into cFunkTest
values(3, 'Ole Jensen', 'bb2222', 31);
INSERT 4464451 1

insert into cFunkTest
values(4, 'Emma Evensen', 'AAA111', 18);
ERROR:  sjekkrna: regnr=AAA111, feil format. Skal være CC####

insert into cFunkTest
values(5, 'Anne Andersen', 'PP2212', NULL);
INSERT 4464452 1

insert into cFunkTest
values(6, 'Hans Hansen', NULL, 34);
INSERT 4464453 1

select * from cFunkTest;
 id |     navn      | regnr  | alder 
----+---------------+--------+-------
  2 | Per Olsen     | AA1111 |    25
  3 | Ole Jensen    | BB2222 |    31
  5 | Anne Andersen | PP2212 |      
  6 | Hans Hansen   |        |    34
(4 rows)

update cFunkTest
set alder=-1
where id = 2;
ERROR:  sjekkrna: alder=-1, kan ikke være negativ verdi

update cFunkTest
set alder=22
where id = 5;
UPDATE 1

select * from cFunkTest;
 id |     navn      | regnr  | alder 
----+---------------+--------+-------
  2 | Per Olsen     | AA1111 |    25
  3 | Ole Jensen    | BB2222 |    31
  6 | Hans Hansen   |        |    34
  5 | Anne Andersen | PP2212 |    22
(4 rows)

update cFunkTest
set regnr='aa7654'
where id = 6;
UPDATE 1

update cFunkTest
set regnr='bb76b1'
where id = 2;
ERROR:  sjekkrna: regnr=bb76b1, feil format. Skal være CC####

select * from cFunkTest;
 id |     navn      | regnr  | alder 
----+---------------+--------+-------
  2 | Per Olsen     | AA1111 |    25
  3 | Ole Jensen    | BB2222 |    31
  5 | Anne Andersen | PP2212 |    22
  6 | Hans Hansen   | AA7654 |    34
(4 rows)