- 論壇徽章:
- 0
|
本帖最后由 zlj2208 于 2011-08-26 09:55 編輯
自己搞定了!
我使用Aqua Data Studio 4.7 連接數(shù)據(jù)庫,按照官方文檔做實(shí)驗(yàn),報(bào)各種錯(cuò)誤, 后來同事在psql的命令行執(zhí)行建立 triigger 和 function 的語句好用,然后就在命令行上做實(shí)驗(yàn),問題解決了。
后來使用pgAdmin III圖形工具也可以,不管怎么樣問題解決了。下面是我的示例,希望對其他朋友有用。
Postgresql的例子太少了!那是相當(dāng)少!
目的:對于基本表執(zhí)行 insert,update,delete 在Log表中記錄相關(guān)的操作內(nèi)容。
1. 對基本表進(jìn)行 insert 后會在log表中生成一條和基本表中相同的記錄;
2. 對基本表進(jìn)行 update 后會在log表中生成對基本表更新前和更新后2條記錄;
3. 對基本表進(jìn)行 delete 后會在log表中生成一條和基本表中相同的記錄;
如果出現(xiàn)誤操作可以通過log表來修正數(shù)據(jù).
連接數(shù)據(jù)庫工具: pgAdmin III
實(shí)驗(yàn)步驟:
1. 建立基本表和log表- create table testtable (
- id integer not null primary key ,
- sname varchar(100)
- );
- CREATE SEQUENCE seq_no1 MINVALUE 1;
- CREATE TABLE logtesttable (
- logtestid INTEGER PRIMARY KEY DEFAULT NEXTVAL('seq_no1'),
- id INTEGER,
- sname VARCHAR(100),
- updt_type VARCHAR(20) ,
- updt_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
- );
復(fù)制代碼 2. 建立 Trigger 和 Function- ---------------------------------------------
- --創(chuàng)建trigger調(diào)用的函數(shù)
- --
- CREATE OR REPLACE FUNCTION fun_trigger_insert()
- RETURNS TRIGGER
- LANGUAGE PLPGSQL
- AS
- $BODY$
- BEGIN
- INSERT INTO logtesttable(id,sname,updt_type,updt_time)
- VALUES(new.id,new.sname,'insert',current_timestamp);
- return new;
- END;
- $BODY$;
- CREATE OR REPLACE FUNCTION fun_trigger_update()
- RETURNS TRIGGER
- LANGUAGE PLPGSQL
- AS
- $BODY$
- BEGIN
- INSERT INTO logtesttable(id,sname,updt_type,updt_time)
- VALUES(OLD.id,OLD.sname,'before_update',current_timestamp);
- INSERT INTO logtesttable(id,sname,updt_type,updt_time)
- VALUES(new.id,new.sname,'after_update',current_timestamp);
- return new;
- END;
- $BODY$;
- CREATE OR REPLACE FUNCTION fun_trigger_delete()
- RETURNS TRIGGER
- LANGUAGE PLPGSQL
- AS $BODY$
- BEGIN
- INSERT INTO logtesttable(id,sname,updt_type,updt_time)
- VALUES(OLD.id,OLD.sname,'delete',current_timestamp);
- return OLD;
- END;
- $BODY$;
- -----------------------
- --建立Trigger
- --
- CREATE TRIGGER TRIGGER_INSERT
- AFTER INSERT ON testtable
- FOR EACH ROW EXECUTE PROCEDURE fun_trigger_insert();
- CREATE TRIGGER TRIGGER_UPDATE
- AFTER UPDATE ON testtable
- FOR EACH ROW EXECUTE PROCEDURE fun_trigger_update();
- CREATE TRIGGER TRIGGER_DELETE
- AFTER DELETE ON testtable
- FOR EACH ROW EXECUTE PROCEDURE fun_trigger_delete();
復(fù)制代碼 3. 檢驗(yàn)Trigger是否生效
1). insert 操作- insert into testtable values (10,'aaaaa');
- insert into testtable values (20,'bbbbb');
復(fù)制代碼 查詢數(shù)據(jù)庫結(jié)果:- select * from testtable;
- select * from logtesttable;
- ------------------------
- 輸出結(jié)果:
- ------------------------
- id sname
- ----- --------
- 10 aaaaa
- 20 bbbbb
- 2 record(s) selected [Fetch MetaData: 0/ms] [Fetch Data: 0/ms]
- [Executed: 11-8-26 上午09時(shí)49分05秒 ] [Execution: 0/ms]
- logtestid id sname updt_type updt_time
- ------------ ----- -------- ------------ --------------------------
- 1 10 aaaaa insert 2011-08-26 09:42:14.711853
- 2 20 bbbbb insert 2011-08-26 09:42:14.711853
- 2 record(s) selected [Fetch MetaData: 0/ms] [Fetch Data: 0/ms]
- [Executed: 11-8-26 上午09時(shí)49分05秒 ] [Execution: 0/ms]
復(fù)制代碼 2). update 操作- update testtable set sname='xxxxxx' where id=20;
復(fù)制代碼 查詢數(shù)據(jù)庫結(jié)果:- select * from testtable where id=20;
- select * from logtesttable where id=20;
- ------------------------
- 輸出結(jié)果:
- ------------------------
- id sname
- ----- --------
- 10 aaaaa
- 20 xxxxxx
- 2 record(s) selected [Fetch MetaData: 0/ms] [Fetch Data: 0/ms]
- [Executed: 11-8-26 上午09時(shí)49分55秒 ] [Execution: 0/ms]
- logtestid id sname updt_type updt_time
- ------------ ----- -------- ------------- --------------------------
- 1 10 aaaaa insert 2011-08-26 09:42:14.711853
- 2 20 bbbbb insert 2011-08-26 09:42:14.711853
- 3 20 bbbbb before_update 2011-08-26 09:43:21.574783
- 4 20 xxxxxx after_update 2011-08-26 09:43:21.574783
- 4 record(s) selected [Fetch MetaData: 0/ms] [Fetch Data: 0/ms]
- [Executed: 11-8-26 上午09時(shí)49分55秒 ] [Execution: 0/ms]
復(fù)制代碼 3). delete 操作- delete from testtable where id=20;
復(fù)制代碼 查詢數(shù)據(jù)庫結(jié)果:- select * from testtable;
- select * from logtesttable;
- ------------------------
- 輸出結(jié)果:
- ------------------------
- id sname
- ----- --------
- 10 aaaaa
- 1 record(s) selected [Fetch MetaData: 0/ms] [Fetch Data: 0/ms]
- [Executed: 11-8-26 上午09時(shí)51分21秒 ] [Execution: 0/ms]
- logtestid id sname updt_type updt_time
- ------------ ----- -------- ------------- --------------------------
- 1 10 aaaaa insert 2011-08-26 09:42:14.711853
- 2 20 bbbbb insert 2011-08-26 09:42:14.711853
- 3 20 bbbbb before_update 2011-08-26 09:43:21.574783
- 4 20 xxxxxx after_update 2011-08-26 09:43:21.574783
- 5 20 xxxxxx delete 2011-08-26 09:44:44.509704
- 5 record(s) selected [Fetch MetaData: 0/ms] [Fetch Data: 0/ms]
- [Executed: 11-8-26 上午09時(shí)51分21秒 ] [Execution: 16/ms]
復(fù)制代碼 |
|