⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 triggers.out

📁 postgresql8.3.4源码,开源数据库
💻 OUT
📖 第 1 页 / 共 2 页
字号:
drop table tttest;drop sequence ttdummy_seq;---- tests for per-statement triggers--CREATE TABLE log_table (tstamp timestamp default timeofday()::timestamp);CREATE TABLE main_table (a int, b int);COPY main_table (a,b) FROM stdin;CREATE FUNCTION trigger_func() RETURNS trigger LANGUAGE plpgsql AS 'BEGIN	RAISE NOTICE ''trigger_func() called: action = %, when = %, level = %'', TG_OP, TG_WHEN, TG_LEVEL;	RETURN NULL;END;';CREATE TRIGGER before_ins_stmt_trig BEFORE INSERT ON main_tableFOR EACH STATEMENT EXECUTE PROCEDURE trigger_func();CREATE TRIGGER after_ins_stmt_trig AFTER INSERT ON main_tableFOR EACH STATEMENT EXECUTE PROCEDURE trigger_func();---- if neither 'FOR EACH ROW' nor 'FOR EACH STATEMENT' was specified,-- CREATE TRIGGER should default to 'FOR EACH STATEMENT'--CREATE TRIGGER before_upd_stmt_trig AFTER UPDATE ON main_tableEXECUTE PROCEDURE trigger_func();CREATE TRIGGER before_upd_row_trig AFTER UPDATE ON main_tableFOR EACH ROW EXECUTE PROCEDURE trigger_func();INSERT INTO main_table DEFAULT VALUES;NOTICE:  trigger_func() called: action = INSERT, when = BEFORE, level = STATEMENTNOTICE:  trigger_func() called: action = INSERT, when = AFTER, level = STATEMENTUPDATE main_table SET a = a + 1 WHERE b < 30;NOTICE:  trigger_func() called: action = UPDATE, when = AFTER, level = ROWNOTICE:  trigger_func() called: action = UPDATE, when = AFTER, level = ROWNOTICE:  trigger_func() called: action = UPDATE, when = AFTER, level = ROWNOTICE:  trigger_func() called: action = UPDATE, when = AFTER, level = ROWNOTICE:  trigger_func() called: action = UPDATE, when = AFTER, level = STATEMENT-- UPDATE that effects zero rows should still call per-statement triggerUPDATE main_table SET a = a + 2 WHERE b > 100;NOTICE:  trigger_func() called: action = UPDATE, when = AFTER, level = STATEMENT-- COPY should fire per-row and per-statement INSERT triggersCOPY main_table (a, b) FROM stdin;NOTICE:  trigger_func() called: action = INSERT, when = BEFORE, level = STATEMENTNOTICE:  trigger_func() called: action = INSERT, when = AFTER, level = STATEMENTSELECT * FROM main_table ORDER BY a, b; a  | b  ----+----  6 | 10 21 | 20 30 | 40 31 | 10 50 | 35 50 | 60 81 | 15    |   (8 rows)-- Test enable/disable triggerscreate table trigtest (i serial primary key);NOTICE:  CREATE TABLE will create implicit sequence "trigtest_i_seq" for serial column "trigtest.i"NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "trigtest_pkey" for table "trigtest"-- test that disabling RI triggers workscreate table trigtest2 (i int references trigtest(i) on delete cascade);create function trigtest() returns trigger as $$begin	raise notice '% % % %', TG_RELNAME, TG_OP, TG_WHEN, TG_LEVEL;	return new;end;$$ language plpgsql;create trigger trigtest_b_row_tg before insert or update or delete on trigtestfor each row execute procedure trigtest();create trigger trigtest_a_row_tg after insert or update or delete on trigtestfor each row execute procedure trigtest();create trigger trigtest_b_stmt_tg before insert or update or delete on trigtestfor each statement execute procedure trigtest();create trigger trigtest_a_stmt_tg after insert or update or delete on trigtestfor each statement execute procedure trigtest();insert into trigtest default values;NOTICE:  trigtest INSERT BEFORE STATEMENTNOTICE:  trigtest INSERT BEFORE ROWNOTICE:  trigtest INSERT AFTER ROWNOTICE:  trigtest INSERT AFTER STATEMENTalter table trigtest disable trigger trigtest_b_row_tg;insert into trigtest default values;NOTICE:  trigtest INSERT BEFORE STATEMENTNOTICE:  trigtest INSERT AFTER ROWNOTICE:  trigtest INSERT AFTER STATEMENTalter table trigtest disable trigger user;insert into trigtest default values;alter table trigtest enable trigger trigtest_a_stmt_tg;insert into trigtest default values;NOTICE:  trigtest INSERT AFTER STATEMENTinsert into trigtest2 values(1);insert into trigtest2 values(2);delete from trigtest where i=2;NOTICE:  trigtest DELETE AFTER STATEMENTselect * from trigtest2; i --- 1(1 row)alter table trigtest disable trigger all;delete from trigtest where i=1;select * from trigtest2; i --- 1(1 row)-- ensure we still insert, even when all triggers are disabledinsert into trigtest default values;select *  from trigtest; i --- 3 4 5(3 rows)drop table trigtest2;drop table trigtest;-- dump trigger dataCREATE TABLE trigger_test (        i int,        v varchar);CREATE OR REPLACE FUNCTION trigger_data()  RETURNS trigger LANGUAGE plpgsql AS $$declare	argstr text;	relid text;begin	relid := TG_relid::regclass;	-- plpgsql can't discover its trigger data in a hash like perl and python	-- can, or by a sort of reflection like tcl can, 	-- so we have to hard code the names.	raise NOTICE 'TG_NAME: %', TG_name;	raise NOTICE 'TG_WHEN: %', TG_when;	raise NOTICE 'TG_LEVEL: %', TG_level;	raise NOTICE 'TG_OP: %', TG_op;	raise NOTICE 'TG_RELID::regclass: %', relid;	raise NOTICE 'TG_RELNAME: %', TG_relname;	raise NOTICE 'TG_TABLE_NAME: %', TG_table_name;	raise NOTICE 'TG_TABLE_SCHEMA: %', TG_table_schema;	raise NOTICE 'TG_NARGS: %', TG_nargs;	argstr := '[';	for i in 0 .. TG_nargs - 1 loop		if i > 0 then			argstr := argstr || ', ';		end if;		argstr := argstr || TG_argv[i];	end loop;	argstr := argstr || ']';	raise NOTICE 'TG_ARGV: %', argstr;	if TG_OP != 'INSERT' then		raise NOTICE 'OLD: %', OLD;	end if;	if TG_OP != 'DELETE' then		raise NOTICE 'NEW: %', NEW;	end if;	if TG_OP = 'DELETE' then		return OLD;	else		return NEW;	end if;end;$$;CREATE TRIGGER show_trigger_data_trig BEFORE INSERT OR UPDATE OR DELETE ON trigger_testFOR EACH ROW EXECUTE PROCEDURE trigger_data(23,'skidoo');insert into trigger_test values(1,'insert');NOTICE:  TG_NAME: show_trigger_data_trigNOTICE:  TG_WHEN: BEFORENOTICE:  TG_LEVEL: ROWNOTICE:  TG_OP: INSERTNOTICE:  TG_RELID::regclass: trigger_testNOTICE:  TG_RELNAME: trigger_testNOTICE:  TG_TABLE_NAME: trigger_testNOTICE:  TG_TABLE_SCHEMA: publicNOTICE:  TG_NARGS: 2NOTICE:  TG_ARGV: [23, skidoo]NOTICE:  NEW: (1,insert)update trigger_test set v = 'update' where i = 1;NOTICE:  TG_NAME: show_trigger_data_trigNOTICE:  TG_WHEN: BEFORENOTICE:  TG_LEVEL: ROWNOTICE:  TG_OP: UPDATENOTICE:  TG_RELID::regclass: trigger_testNOTICE:  TG_RELNAME: trigger_testNOTICE:  TG_TABLE_NAME: trigger_testNOTICE:  TG_TABLE_SCHEMA: publicNOTICE:  TG_NARGS: 2NOTICE:  TG_ARGV: [23, skidoo]NOTICE:  OLD: (1,insert)NOTICE:  NEW: (1,update)delete from trigger_test;NOTICE:  TG_NAME: show_trigger_data_trigNOTICE:  TG_WHEN: BEFORENOTICE:  TG_LEVEL: ROWNOTICE:  TG_OP: DELETENOTICE:  TG_RELID::regclass: trigger_testNOTICE:  TG_RELNAME: trigger_testNOTICE:  TG_TABLE_NAME: trigger_testNOTICE:  TG_TABLE_SCHEMA: publicNOTICE:  TG_NARGS: 2NOTICE:  TG_ARGV: [23, skidoo]NOTICE:  OLD: (1,update)      DROP TRIGGER show_trigger_data_trig on trigger_test;      DROP FUNCTION trigger_data();DROP TABLE trigger_test;---- Test use of row comparisons on OLD/NEW--CREATE TABLE trigger_test (f1 int, f2 text, f3 text);-- this is the obvious (and wrong...) way to compare rowsCREATE FUNCTION mytrigger() RETURNS trigger LANGUAGE plpgsql as $$begin	if row(old.*) = row(new.*) then		raise notice 'row % not changed', new.f1;	else		raise notice 'row % changed', new.f1;	end if;	return new;end$$;CREATE TRIGGER tBEFORE UPDATE ON trigger_testFOR EACH ROW EXECUTE PROCEDURE mytrigger();INSERT INTO trigger_test VALUES(1, 'foo', 'bar');INSERT INTO trigger_test VALUES(2, 'baz', 'quux');UPDATE trigger_test SET f3 = 'bar';NOTICE:  row 1 not changedNOTICE:  row 2 changedUPDATE trigger_test SET f3 = NULL;NOTICE:  row 1 changedNOTICE:  row 2 changed-- this demonstrates that the above isn't really working as desired:UPDATE trigger_test SET f3 = NULL;NOTICE:  row 1 changedNOTICE:  row 2 changed-- the right way when considering nulls isCREATE OR REPLACE FUNCTION mytrigger() RETURNS trigger LANGUAGE plpgsql as $$begin	if row(old.*) is distinct from row(new.*) then		raise notice 'row % changed', new.f1;	else		raise notice 'row % not changed', new.f1;	end if;	return new;end$$;UPDATE trigger_test SET f3 = 'bar';NOTICE:  row 1 changedNOTICE:  row 2 changedUPDATE trigger_test SET f3 = NULL;NOTICE:  row 1 changedNOTICE:  row 2 changedUPDATE trigger_test SET f3 = NULL;NOTICE:  row 1 not changedNOTICE:  row 2 not changedDROP TABLE trigger_test;DROP FUNCTION mytrigger();

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -