CREATE TABLE form ( fid integer NOT NULL, areal float, omkrets float ); CREATE TABLE sirkel ( radius float, PRIMARY KEY(fid) )INHERITS (form); CREATE TABLE rektangel ( lengde float, bredde float, PRIMARY KEY(fid) )INHERITS (form); INSERT INTO sirkel VALUES(1, 28.26, 18.84, 3); INSERT INTO sirkel VALUES(2, 78.54, 31.42, 5); INSERT INTO rektangel VALUES(1, 6, 10, 2, 3); INSERT INTO rektangel VALUES(2, 42, 26, 7, 6); SELECT * FROM sirkel; fid | areal | omkrets | radius -----+-------+---------+-------- 1 | 28.26 | 18.84 | 3 2 | 78.54 | 31.42 | 5 (2 rows) SELECT * FROM rektangel; fid | areal | omkrets | lengde | bredde -----+-------+---------+--------+-------- 1 | 6 | 10 | 2 | 3 2 | 42 | 26 | 7 | 6 (2 rows)
CREATE TABLE datetest
(
id integer NOT NULL,
navn char(30),
fodt timestamp,
PRIMARY KEY(id)
);
INSERT INTO datetest VALUES(1, 'Per Olsen', '1982-28-02 02:12:00');
INSERT INTO datetest VALUES(2, 'Anne Jensen', '1979-10-06 12:45:00');
SELECT * FROM datetest;
id | navn | fodt
----+--------------------------------+---------------------
1 | Per Olsen | 1982-02-28 02:12:00
2 | Anne Jensen | 1979-10-06 12:45:00
(2 rows)
CREATE TABLE trekant
(
side float[3],
vinkel float[3],
PRIMARY KEY(fid)
)INHERITS (form);
INSERT INTO trekant VALUES(1, 3.46, 9.46, '{3.46,4,2}', '{30,60,90}');
INSERT INTO trekant VALUES(2, 3.897, 9, '{3,3,3}', '{60,60,60}');
SELECT * FROM trekant;
fid | areal | omkrets | side | vinkel
-----+-------+---------+------------+------------
1 | 3.46 | 9.46 | {3.46,4,2} | {30,60,90}
2 | 3.897 | 9 | {3,3,3} | {60,60,60}
(2 rows)
echo "Per er en snill gutt" > databaser/perolsen.txt chmod 777 databaser CREATE TABLE blobtest ( id integer NOT NULL, navn char(50), kommentar oid, PRIMARY KEY(id) ); INSERT INTO blobtest VALUES(1, 'Per Olsen', lo_import('/home/ansatte/elinkaan/databaser/perolsen.txt')); SELECT lo_export(blobtest.kommentar, '/home/ansatte/elinkaan/databaser/kopi_perolsen.txt') FROM blobtest WHERE navn = 'Per Olsen'; lo_export ----------- 1 (1 row) cat databaser/kopi_perolsen.txt Per er en snill gutt
Hvis ikke plpgsql eksisterer:
createlang -U elinkaan -d elinkaan -L /usr/lib/pgsql plpgsql
CREATE TABLE triggerTest
(
id integer NOT NULL,
posnr integer,
negnr integer,
PRIMARY KEY(id)
);
CREATE FUNCTION testPosNeg() RETURNS TRIGGER AS '
BEGIN
IF NEW.posnr < 0 THEN
RAISE EXCEPTION ''posnr cannot be negative'';
END IF;
IF NEW.negnr > 0 THEN
RAISE EXCEPTION ''negnr cannot be positive'';
END IF;
RETURN NEW;
END
' LANGUAGE 'plpgsql';
CREATE TRIGGER posneg BEFORE INSERT OR UPDATE
ON triggertest FOR EACH ROW
EXECUTE PROCEDURE testPosNeg();
INSERT INTO triggerTest VALUES(1, 1, -1);
INSERT 3237108 1
INSERT INTO triggerTest VALUES(2, 0, -1);
INSERT 3237109 1
INSERT INTO triggerTest VALUES(3, -1, 1);
ERROR: posnr cannot be negative
INSERT INTO triggerTest VALUES(4, 3, -2);
INSERT 3237110 1
INSERT INTO triggerTest VALUES(5, 1, 1);
ERROR: negnr cannot be positive
INSERT INTO triggerTest VALUES(6, 1, 0);
INSERT 3237111 1
SELECT * FROM triggerTest;
id | posnr | negnr
----+-------+-------
1 | 1 | -1
2 | 0 | -1
4 | 3 | -2
6 | 1 | 0
(4 rows)
Hvis man ønsker å skrive ut informasjon til bruker i en trigger(for eksempel for debugging), bruker man kommandoen RAISE NOTICE.
create table debugTest(
id int not null,
verdi varchar(10),
primary key(id));
create function write_debug() returns trigger as '
declare
begin
RAISE NOTICE ''Dette er en debug-melding'';
RAISE NOTICE ''id=%, verdi=%'', NEW.id, NEW.verdi;
return NEW;
end
' language 'plpgsql';
CREATE TRIGGER debugTrigger BEFORE INSERT OR UPDATE
ON debugTest FOR EACH ROW
EXECUTE PROCEDURE write_debug();
insert into debugTest values(1, 'blabla');
NOTICE: Dette er en debug-melding
NOTICE: id=1, verdi=blabla
INSERT 4984147 1
insert into debugTest values(2, 'haha');
NOTICE: Dette er en debug-melding
NOTICE: id=2, verdi=haha
INSERT 4984148 1
insert into debugTest values(3, 'kaklekakle');
NOTICE: Dette er en debug-melding
NOTICE: id=3, verdi=kaklekakle
INSERT 4984149 1
SELECT * FROM debugTest;
id | verdi
----+------------
1 | blabla
2 | haha
3 | kaklekakle
(3 rows)
create table fktest(
id int not null,
navn varchar(10),
primary key(id));
create table fktest_array(
id int not null,
fktest_id int[10],
primary key(id));
create function manualFK() returns trigger as '
declare
tmp_val integer := 0;
ids_in_fktest record;
found_val boolean := false;
begin
for i IN 1..10 loop
for ids_in_fktest in select id from fktest loop
select into tmp_val NEW.fktest_id[i];
if tmp_val = ids_in_fktest.id then
found_val := true;
elsif tmp_val is null then
found_val := true;
exit;
end if;
end loop;
if not found_val then
raise exception ''Illegal values found in array'';
end if;
found_val := false;
end loop;
return NEW;
end
' language 'plpgsql';
CREATE TRIGGER manualfkt BEFORE INSERT OR UPDATE
ON fktest_array FOR EACH ROW
EXECUTE PROCEDURE manualFK();
insert into fktest values(1, 'blabla');
insert into fktest values(2, 'clacla');
insert into fktest values(3, 'dladla');
insert into fktest values(4, 'elaela');
insert into fktest_array values(1, '{1, 2, 3, 4}');
INSERT 4977937 1
insert into fktest_array values(2, '{1, 2, 3, 5}');
ERROR: Illegal values found in array
SELECT * FROM fktest_array;
id | fktest_id
----+-----------
1 | {1,2,3,4}
(1 row)
For spesielt interesserte: her er et eksempel på hvordan man lager en trigger i C
CREATE TABLE person
(
id integer NOT NULL,
navn char(50),
sivilstatus char(10),
PRIMARY KEY(id)
);
CREATE TABLE person_logg
(
id integer NOT NULL,
sivilstatus char(10),
log_naar timestamp,
log_avhvem text,
PRIMARY KEY(id, log_naar)
);
CREATE RULE log_sivilstatus AS ON UPDATE TO person
WHERE NEW.sivilstatus != OLD.sivilstatus
DO INSERT INTO person_logg VALUES (
NEW.id,
NEW.sivilstatus,
current_timestamp,
current_user
);
INSERT INTO person VALUES(1, 'Per Olsen', 'ugift');
UPDATE person
SET sivilstatus='gift'
WHERE id=1;
UPDATE person
SET sivilstatus='separert'
WHERE id=1;
UPDATE person
SET sivilstatus='gift'
WHERE id=1;
UPDATE person
SET sivilstatus='enkemann'
WHERE id=1;
SELECT * FROM person;
id | navn | sivilstatus
----+----------------------------------------------------+-------------
1 | Per Olsen | enkemann
(1 row)
SELECT * FROM person_logg;
id | sivilstatus | log_naar | log_avhvem
----+-------------+----------------------------+------------
1 | gift | 2003-10-09 11:32:50.009128 | elinkaan
1 | separert | 2003-10-09 11:33:07.770337 | elinkaan
1 | gift | 2003-10-09 11:33:15.870525 | elinkaan
1 | enkemann | 2003-10-09 11:33:26.565217 | elinkaan
(4 rows)