📄 trigger.test
字号:
drop trigger trg2;drop table t1;# Test for bug #5859 "DROP TABLE does not drop triggers". Trigger should not# magically reappear when we recreate dropped table.create table t1 (a int);create trigger trg1 before insert on t1 for each row set new.a= 10;drop table t1;create table t1 (a int);insert into t1 values ();select * from t1;drop table t1;# Test for bug #6559 "DROP DATABASE forgets to drop triggers". create database mysqltest;use mysqltest;create table t1 (i int);create trigger trg1 before insert on t1 for each row set @a:= 1;# This should succeeddrop database mysqltest;use test;# Test for bug #8791# "Triggers: Allowed to create triggers on a subject table in a different DB". create database mysqltest;create table mysqltest.t1 (i int);--error ER_TRG_IN_WRONG_SCHEMAcreate trigger trg1 before insert on mysqltest.t1 for each row set @a:= 1;use mysqltest;--error ER_TRG_IN_WRONG_SCHEMAcreate trigger test.trg1 before insert on t1 for each row set @a:= 1;drop database mysqltest;use test;# Test for bug #5860 "Multi-table UPDATE does not activate update triggers"# We will also test how delete triggers wor for multi-table DELETE.create table t1 (i int, j int default 10, k int not null, key (k));create table t2 (i int);insert into t1 (i, k) values (1, 1);insert into t2 values (1);create trigger trg1 before update on t1 for each row set @a:= @a + new.j - old.j;create trigger trg2 after update on t1 for each row set @b:= "Fired";set @a:= 0, @b:= "";# Check that trigger works in case of update on the flyupdate t1, t2 set j = j + 10 where t1.i = t2.i;select @a, @b;insert into t1 values (2, 13, 2);insert into t2 values (2);set @a:= 0, @b:= "";# And now let us check that triggers work in case of multi-update which# is done through temporary tables...update t1, t2 set j = j + 15 where t1.i = t2.i and t1.k >= 2;select @a, @b;# Let us test delete triggers for multi-delete now.# We create triggers for both tables because we want test how they# work in both on-the-fly and via-temp-tables cases.create trigger trg3 before delete on t1 for each row set @c:= @c + old.j;create trigger trg4 before delete on t2 for each row set @d:= @d + old.i;create trigger trg5 after delete on t1 for each row set @e:= "After delete t1 fired";create trigger trg6 after delete on t2 for each row set @f:= "After delete t2 fired";set @c:= 0, @d:= 0, @e:= "", @f:= "";delete t1, t2 from t1, t2 where t1.i = t2.i;select @c, @d, @e, @f;# This also will drop triggersdrop table t1, t2;# Test for bug #6812 "Triggers are not activated for INSERT ... SELECT".# (We also check the fact that trigger modifies some field does not affect# value of next record inserted).delimiter |;create table t1 (i int, j int default 10)|create table t2 (i int)|insert into t2 values (1), (2)|create trigger trg1 before insert on t1 for each row begin if new.i = 1 then set new.j := 1; end if;end|create trigger trg2 after insert on t1 for each row set @a:= 1|set @a:= 0|insert into t1 (i) select * from t2|select * from t1|select @a|# This also will drop triggersdrop table t1, t2|delimiter ;|# Test for bug #8755 "Trigger is not activated by LOAD DATA"create table t1 (i int, j int, k int);create trigger trg1 before insert on t1 for each row set new.k = new.i;create trigger trg2 after insert on t1 for each row set @b:= "Fired"; set @b:="";# Test triggers with file with separatorsload data infile '../std_data_ln/rpl_loaddata.dat' into table t1 (@a, i);select *, @b from t1;set @b:="";# Test triggers with fixed size row fileload data infile '../std_data_ln/loaddata5.dat' into table t1 fields terminated by '' enclosed by '' (i, j);select *, @b from t1;# This also will drop triggersdrop table t1;# Test for bug #5894 "Triggers with altered tables cause corrupt databases"# Also tests basic error handling for various kinds of triggers.create table t1 (i int, at int, k int, key(k)) engine=myisam;create table t2 (i int);insert into t1 values (1, 1, 1);# We need at least 3 elements in t2 to test multi-update properlyinsert into t2 values (1), (2), (3);# Create and then break "after" triggerscreate trigger ai after insert on t1 for each row set @a:= new.at;create trigger au after update on t1 for each row set @a:= new.at;create trigger ad after delete on t1 for each row set @a:= old.at;alter table t1 drop column at;# We still should be able select data from tables.select * from t1;# The following statements changing t1 should fail, but still cause# their main effect. This is because operation on the table row is# executed before "after" trigger and its effect cannot be rolled back# when whole statement fails, because t1 is MyISAM table.--error 1054insert into t1 values (2, 1);select * from t1;--error 1054update t1 set k = 2 where i = 2;select * from t1;--error 1054delete from t1 where i = 2;select * from t1;# Should fail and insert only 1 row--error 1054load data infile '../std_data_ln/loaddata5.dat' into table t1 fields terminated by '' enclosed by '' (i, k);select * from t1;--error 1054insert into t1 select 3, 3;select * from t1;# Multi-update working on the fly, again it will update only# one row even if more matches--error 1054update t1, t2 set k = k + 10 where t1.i = t2.i;select * from t1;# The same for multi-update via temp table--error 1054update t1, t2 set k = k + 10 where t1.i = t2.i and k < 3;select * from t1;# Multi-delete on the fly--error 1054delete t1, t2 from t1 straight_join t2 where t1.i = t2.i;select * from t1;# And via temporary storage--error 1054delete t2, t1 from t2 straight_join t1 where t1.i = t2.i;select * from t1;# Prepare table for testing of REPLACE and INSERT ... ON DUPLICATE KEY UPDATEalter table t1 add primary key (i);--error 1054insert into t1 values (3, 4) on duplicate key update k= k + 10;select * from t1;--error 1054replace into t1 values (3, 3);select * from t1;# Change table in such way that REPLACE will delete rowalter table t1 add ts timestamp default now();--error 1054replace into t1 (i, k) values (3, 13);select * from t1;# Also drops all triggersdrop table t1, t2;create table t1 (i int, bt int, k int, key(k)) engine=myisam;create table t2 (i int);insert into t1 values (1, 1, 1), (2, 2, 2);insert into t2 values (1), (2), (3);# Create and then break "before" triggerscreate trigger bi before insert on t1 for each row set @a:= new.bt;create trigger bu before update on t1 for each row set @a:= new.bt;create trigger bd before delete on t1 for each row set @a:= old.bt;alter table t1 drop column bt;# The following statements changing t1 should fail and should not# cause any effect on table, since "before" trigger is executed # before operation on the table row.--error 1054insert into t1 values (3, 3);select * from t1;--error 1054update t1 set i = 2;select * from t1;--error 1054delete from t1;select * from t1;--error 1054load data infile '../std_data_ln/loaddata5.dat' into table t1 fields terminated by '' enclosed by '' (i, k);select * from t1;--error 1054insert into t1 select 3, 3;select * from t1;# Both types of multi-update (on the fly and via temp table)--error 1054update t1, t2 set k = k + 10 where t1.i = t2.i;select * from t1;--error 1054update t1, t2 set k = k + 10 where t1.i = t2.i and k < 2;select * from t1;# Both types of multi-delete--error 1054delete t1, t2 from t1 straight_join t2 where t1.i = t2.i;select * from t1;--error 1054delete t2, t1 from t2 straight_join t1 where t1.i = t2.i;select * from t1;# Let us test REPLACE/INSERT ... ON DUPLICATE KEY UPDATE.# To test properly code-paths different from those that are used# in ordinary INSERT we need to drop "before insert" trigger.alter table t1 add primary key (i);drop trigger bi;--error 1054insert into t1 values (2, 4) on duplicate key update k= k + 10;select * from t1;--error 1054replace into t1 values (2, 4);select * from t1;# Change table in such way that REPLACE will delete rowalter table t1 add ts timestamp default now();--error 1054replace into t1 (i, k) values (2, 11);select * from t1;# Also drops all triggersdrop table t1, t2;# Test for bug #5893 "Triggers with dropped functions cause crashes"# Appropriate error should be reported instead of crash.# Also test for bug #11889 "Server crashes when dropping trigger# using stored routine".--disable_warningsdrop function if exists bug5893;--enable_warningscreate table t1 (col1 int, col2 int); insert into t1 values (1, 2);create function bug5893 () returns int return 5;create trigger t1_bu before update on t1 for each row set new.col1= bug5893();drop function bug5893; --error 1305update t1 set col2 = 4;# This should not crash server too.drop trigger t1_bu;drop table t1;## storing and restoring parsing modes for triggers (BUG#5891)#set sql_mode='ansi';create table t1 ("t1 column" int);create trigger t1_bi before insert on t1 for each row set new."t1 column" = 5;set sql_mode="";insert into t1 values (0);# create trigger with different sql_modecreate trigger t1_af after insert on t1 for each row set @a=10;insert into t1 values (0);select * from t1;select @a;--replace_column 6 #show triggers;drop table t1;# check that rigger preserve sql_mode during executionset sql_mode="traditional";create table t1 (a date);-- error 1292insert into t1 values ('2004-01-00');set sql_mode="";create trigger t1_bi before insert on t1 for each row set new.a = '2004-01-00';set sql_mode="traditional";insert into t1 values ('2004-01-01');select * from t1;set sql_mode=default;show create table t1;--replace_column 6 #show triggers;drop table t1;# Test for bug #12280 "Triggers: crash if flush tables"# FLUSH TABLES and FLUSH PRIVILEGES should be disallowed inside# of functions and triggers.create table t1 (id int);--error ER_STMT_NOT_ALLOWED_IN_SF_OR_TRGcreate trigger t1_ai after insert on t1 for each row flush tables;--error ER_STMT_NOT_ALLOWED_IN_SF_OR_TRGcreate trigger t1_ai after insert on t1 for each row flush privileges;create procedure p1() flush tables;create trigger t1_ai after insert on t1 for each row call p1();--error ER_STMT_NOT_ALLOWED_IN_SF_OR_TRGinsert into t1 values (0);drop procedure p1;create procedure p1() flush privileges;--error ER_STMT_NOT_ALLOWED_IN_SF_OR_TRGinsert into t1 values (0);drop procedure p1;drop table t1;# Test for bug #11973 "SELECT .. INTO var_name; in trigger cause# crash on update"create table t1 (id int, data int, username varchar(16));insert into t1 (id, data) values (1, 0);delimiter |;create trigger t1_whoupdated before update on t1 for each rowbegin declare user varchar(32); declare i int; select user() into user; set NEW.username = user; select count(*) from ((select 1) union (select 2)) as d1 into i;end|delimiter ;|update t1 set data = 1;connection addconroot1;update t1 set data = 2;connection default;drop table t1;## #11587 Trigger causes lost connection error#create table t1 (c1 int, c2 datetime);delimiter |;--error ER_SP_NO_RETSETcreate trigger tr1 before insert on t1 for each row begin set new.c2= '2004-04-01'; select 'hello';end|delimiter ;|insert into t1 (c1) values (1),(2),(3);select * from t1;--disable_warningsdrop procedure if exists bug11587;--enable_warningsdelimiter |;create procedure bug11587(x char(16))begin select "hello"; select "hello again";end|create trigger tr1 before insert on t1 for each row begin call bug11587(); set new.c2= '2004-04-02';end|delimiter ;|--error ER_SP_NO_RETSETinsert into t1 (c1) values (4),(5),(6);select * from t1;drop procedure bug11587;drop table t1;# Test for bug #11896 "Partial locking in case of recursive trigger# definitions". Recursion in triggers should not be allowed.# We also should not allow to change tables which are used in# statements invoking this trigger.create table t1 (f1 integer);create table t2 (f2 integer);create trigger t1_ai after insert on t1 for each row insert into t2 values (new.f1+1);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -