mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
WL#2818 (Add creator to the trigger definition for privilege
checks on trigger activation)
This commit is contained in:
@ -722,6 +722,7 @@ information_schema ROUTINES SQL_MODE
|
||||
information_schema TRIGGERS ACTION_CONDITION
|
||||
information_schema TRIGGERS ACTION_STATEMENT
|
||||
information_schema TRIGGERS SQL_MODE
|
||||
information_schema TRIGGERS DEFINER
|
||||
information_schema VIEWS VIEW_DEFINITION
|
||||
select table_name, column_name, data_type from information_schema.columns
|
||||
where data_type = 'datetime';
|
||||
@ -800,45 +801,45 @@ set @fired:= "Yes";
|
||||
end if;
|
||||
end|
|
||||
show triggers;
|
||||
Trigger Event Table Statement Timing Created sql_mode
|
||||
Trigger Event Table Statement Timing Created sql_mode Definer
|
||||
trg1 INSERT t1
|
||||
begin
|
||||
if new.j > 10 then
|
||||
set new.j := 10;
|
||||
end if;
|
||||
end BEFORE NULL
|
||||
end BEFORE NULL root@localhost
|
||||
trg2 UPDATE t1
|
||||
begin
|
||||
if old.i % 2 = 0 then
|
||||
set new.j := -1;
|
||||
end if;
|
||||
end BEFORE NULL
|
||||
end BEFORE NULL root@localhost
|
||||
trg3 UPDATE t1
|
||||
begin
|
||||
if new.j = -1 then
|
||||
set @fired:= "Yes";
|
||||
end if;
|
||||
end AFTER NULL
|
||||
end AFTER NULL root@localhost
|
||||
select * from information_schema.triggers;
|
||||
TRIGGER_CATALOG TRIGGER_SCHEMA TRIGGER_NAME EVENT_MANIPULATION EVENT_OBJECT_CATALOG EVENT_OBJECT_SCHEMA EVENT_OBJECT_TABLE ACTION_ORDER ACTION_CONDITION ACTION_STATEMENT ACTION_ORIENTATION ACTION_TIMING ACTION_REFERENCE_OLD_TABLE ACTION_REFERENCE_NEW_TABLE ACTION_REFERENCE_OLD_ROW ACTION_REFERENCE_NEW_ROW CREATED SQL_MODE
|
||||
TRIGGER_CATALOG TRIGGER_SCHEMA TRIGGER_NAME EVENT_MANIPULATION EVENT_OBJECT_CATALOG EVENT_OBJECT_SCHEMA EVENT_OBJECT_TABLE ACTION_ORDER ACTION_CONDITION ACTION_STATEMENT ACTION_ORIENTATION ACTION_TIMING ACTION_REFERENCE_OLD_TABLE ACTION_REFERENCE_NEW_TABLE ACTION_REFERENCE_OLD_ROW ACTION_REFERENCE_NEW_ROW CREATED SQL_MODE DEFINER
|
||||
NULL test trg1 INSERT NULL test t1 0 NULL
|
||||
begin
|
||||
if new.j > 10 then
|
||||
set new.j := 10;
|
||||
end if;
|
||||
end ROW BEFORE NULL NULL OLD NEW NULL
|
||||
end ROW BEFORE NULL NULL OLD NEW NULL root@localhost
|
||||
NULL test trg2 UPDATE NULL test t1 0 NULL
|
||||
begin
|
||||
if old.i % 2 = 0 then
|
||||
set new.j := -1;
|
||||
end if;
|
||||
end ROW BEFORE NULL NULL OLD NEW NULL
|
||||
end ROW BEFORE NULL NULL OLD NEW NULL root@localhost
|
||||
NULL test trg3 UPDATE NULL test t1 0 NULL
|
||||
begin
|
||||
if new.j = -1 then
|
||||
set @fired:= "Yes";
|
||||
end if;
|
||||
end ROW AFTER NULL NULL OLD NEW NULL
|
||||
end ROW AFTER NULL NULL OLD NEW NULL root@localhost
|
||||
drop trigger trg1;
|
||||
drop trigger trg2;
|
||||
drop trigger trg3;
|
||||
|
@ -1926,23 +1926,23 @@ end if;
|
||||
end|
|
||||
set sql_mode=default|
|
||||
show triggers like "t1";
|
||||
Trigger Event Table Statement Timing Created sql_mode
|
||||
Trigger Event Table Statement Timing Created sql_mode Definer
|
||||
trg1 INSERT t1
|
||||
begin
|
||||
if new.a > 10 then
|
||||
set new.a := 10;
|
||||
set new.a := 11;
|
||||
end if;
|
||||
end BEFORE 0000-00-00 00:00:00
|
||||
end BEFORE 0000-00-00 00:00:00 root@localhost
|
||||
trg2 UPDATE t1 begin
|
||||
if old.a % 2 = 0 then set new.b := 12; end if;
|
||||
end BEFORE 0000-00-00 00:00:00
|
||||
end BEFORE 0000-00-00 00:00:00 root@localhost
|
||||
trg3 UPDATE t1
|
||||
begin
|
||||
if new.a = -1 then
|
||||
set @fired:= "Yes";
|
||||
end if;
|
||||
end AFTER 0000-00-00 00:00:00 STRICT_TRANS_TABLES,STRICT_ALL_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,TRADITIONAL,NO_AUTO_CREATE_USER
|
||||
end AFTER 0000-00-00 00:00:00 STRICT_TRANS_TABLES,STRICT_ALL_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,TRADITIONAL,NO_AUTO_CREATE_USER root@localhost
|
||||
INSERT INTO t1 (a) VALUES (1),(2),(3),(22);
|
||||
update t1 set a = 4 where a=3;
|
||||
|
||||
@ -2085,29 +2085,29 @@ Tables_in_test
|
||||
t1
|
||||
t2
|
||||
show triggers;
|
||||
Trigger Event Table Statement Timing Created sql_mode
|
||||
Trigger Event Table Statement Timing Created sql_mode Definer
|
||||
trg1 INSERT t1
|
||||
begin
|
||||
if new.a > 10 then
|
||||
set new.a := 10;
|
||||
set new.a := 11;
|
||||
end if;
|
||||
end BEFORE #
|
||||
end BEFORE # root@localhost
|
||||
trg2 UPDATE t1 begin
|
||||
if old.a % 2 = 0 then set new.b := 12; end if;
|
||||
end BEFORE #
|
||||
end BEFORE # root@localhost
|
||||
trg3 UPDATE t1
|
||||
begin
|
||||
if new.a = -1 then
|
||||
set @fired:= "Yes";
|
||||
end if;
|
||||
end AFTER # STRICT_TRANS_TABLES,STRICT_ALL_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,TRADITIONAL,NO_AUTO_CREATE_USER
|
||||
end AFTER # STRICT_TRANS_TABLES,STRICT_ALL_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,TRADITIONAL,NO_AUTO_CREATE_USER root@localhost
|
||||
trg4 INSERT t2
|
||||
begin
|
||||
if new.a > 10 then
|
||||
set @fired:= "No";
|
||||
end if;
|
||||
end BEFORE # STRICT_TRANS_TABLES,STRICT_ALL_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,TRADITIONAL,NO_AUTO_CREATE_USER
|
||||
end BEFORE # STRICT_TRANS_TABLES,STRICT_ALL_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,TRADITIONAL,NO_AUTO_CREATE_USER root@localhost
|
||||
DROP TABLE t1, t2;
|
||||
--port=1234
|
||||
--port=1234
|
||||
@ -2130,9 +2130,9 @@ SELECT * FROM `test2`;
|
||||
a2
|
||||
1
|
||||
SHOW TRIGGERS;
|
||||
Trigger Event Table Statement Timing Created sql_mode
|
||||
Trigger Event Table Statement Timing Created sql_mode Definer
|
||||
testref INSERT test1 BEGIN
|
||||
INSERT INTO test2 SET a2 = NEW.a1; END BEFORE NULL
|
||||
INSERT INTO test2 SET a2 = NEW.a1; END BEFORE NULL root@localhost
|
||||
SELECT * FROM `test1`;
|
||||
a1
|
||||
1
|
||||
@ -2147,6 +2147,7 @@ DROP FUNCTION IF EXISTS bug9056_func1;
|
||||
DROP FUNCTION IF EXISTS bug9056_func2;
|
||||
DROP PROCEDURE IF EXISTS bug9056_proc1;
|
||||
DROP PROCEDURE IF EXISTS bug9056_proc2;
|
||||
DROP PROCEDURE IF EXISTS `a'b`;
|
||||
CREATE TABLE t1 (id int);
|
||||
INSERT INTO t1 VALUES(1), (2), (3), (4), (5);
|
||||
CREATE FUNCTION `bug9056_func1`(a INT, b INT) RETURNS int(11) RETURN a+b //
|
||||
|
@ -1465,13 +1465,13 @@ flush logs;
|
||||
|
||||
-------- switch to master -------
|
||||
SHOW TRIGGERS;
|
||||
Trigger Event Table Statement Timing Created sql_mode
|
||||
trg1 INSERT t1 SET @a:=1 BEFORE NULL
|
||||
Trigger Event Table Statement Timing Created sql_mode Definer
|
||||
trg1 INSERT t1 SET @a:=1 BEFORE NULL root@localhost
|
||||
|
||||
-------- switch to slave -------
|
||||
SHOW TRIGGERS;
|
||||
Trigger Event Table Statement Timing Created sql_mode
|
||||
trg1 INSERT t1 SET @a:=1 BEFORE NULL
|
||||
Trigger Event Table Statement Timing Created sql_mode Definer
|
||||
trg1 INSERT t1 SET @a:=1 BEFORE NULL root@localhost
|
||||
|
||||
######## DROP TRIGGER trg1 ########
|
||||
|
||||
@ -1520,11 +1520,11 @@ flush logs;
|
||||
|
||||
-------- switch to master -------
|
||||
SHOW TRIGGERS;
|
||||
Trigger Event Table Statement Timing Created sql_mode
|
||||
Trigger Event Table Statement Timing Created sql_mode Definer
|
||||
|
||||
-------- switch to slave -------
|
||||
SHOW TRIGGERS;
|
||||
Trigger Event Table Statement Timing Created sql_mode
|
||||
Trigger Event Table Statement Timing Created sql_mode Definer
|
||||
|
||||
######## CREATE USER user1@localhost ########
|
||||
|
||||
|
@ -256,7 +256,7 @@ a
|
||||
show binlog events in 'master-bin.000002' from 98;
|
||||
Log_name Pos Event_type Server_id End_log_pos Info
|
||||
master-bin.000002 # Query 1 # use `mysqltest1`; delete from t1
|
||||
master-bin.000002 # Query 1 # use `mysqltest1`; create trigger trg before insert on t1 for each row set new.a= 10
|
||||
master-bin.000002 # Query 1 # use `mysqltest1`; CREATE DEFINER=`root`@`localhost` trigger trg before insert on t1 for each row set new.a= 10
|
||||
master-bin.000002 # Query 1 # use `mysqltest1`; insert into t1 values (1)
|
||||
master-bin.000002 # Query 1 # use `mysqltest1`; delete from t1
|
||||
master-bin.000002 # Query 1 # use `mysqltest1`; drop trigger trg
|
||||
|
@ -89,8 +89,24 @@ insert into t1 set a = now();
|
||||
select a=b && a=c from t1;
|
||||
a=b && a=c
|
||||
1
|
||||
SELECT routine_name, definer
|
||||
FROM information_schema.routines;
|
||||
routine_name definer
|
||||
bug12480 root@localhost
|
||||
SELECT trigger_name, definer
|
||||
FROM information_schema.triggers;
|
||||
trigger_name definer
|
||||
t1_first root@localhost
|
||||
|
||||
--- On slave --
|
||||
SELECT routine_name, definer
|
||||
FROM information_schema.routines;
|
||||
routine_name definer
|
||||
bug12480 @
|
||||
SELECT trigger_name, definer
|
||||
FROM information_schema.triggers;
|
||||
trigger_name definer
|
||||
t1_first root@localhost
|
||||
select a=b && a=c from t1;
|
||||
a=b && a=c
|
||||
1
|
||||
|
@ -4,7 +4,7 @@ drop procedure if exists f1;
|
||||
use test;
|
||||
create table t1 (field1 INT);
|
||||
CREATE VIEW v1 AS SELECT field1 FROM t1;
|
||||
ERROR HY000: View definer is not fully qualified
|
||||
ERROR HY000: Definer is not fully qualified
|
||||
drop table t1;
|
||||
create procedure f1() select 1;
|
||||
drop procedure f1;
|
||||
|
40
mysql-test/r/trigger-compat.result
Normal file
40
mysql-test/r/trigger-compat.result
Normal file
@ -0,0 +1,40 @@
|
||||
DELETE FROM mysql.user WHERE User LIKE 'mysqltest_%';
|
||||
DELETE FROM mysql.db WHERE User LIKE 'mysqltest_%';
|
||||
DELETE FROM mysql.tables_priv WHERE User LIKE 'mysqltest_%';
|
||||
DELETE FROM mysql.columns_priv WHERE User LIKE 'mysqltest_%';
|
||||
FLUSH PRIVILEGES;
|
||||
DROP DATABASE IF EXISTS mysqltest_db1;
|
||||
CREATE DATABASE mysqltest_db1;
|
||||
CREATE USER mysqltest_dfn@localhost;
|
||||
CREATE USER mysqltest_inv@localhost;
|
||||
GRANT SUPER ON *.* TO mysqltest_dfn@localhost;
|
||||
GRANT CREATE ON mysqltest_db1.* TO mysqltest_dfn@localhost;
|
||||
|
||||
---> connection: wl2818_definer_con
|
||||
CREATE TABLE t1(num_value INT);
|
||||
CREATE TABLE t2(user_str TEXT);
|
||||
CREATE TRIGGER wl2818_trg1 BEFORE INSERT ON t1
|
||||
FOR EACH ROW
|
||||
INSERT INTO t2 VALUES(CURRENT_USER());
|
||||
|
||||
---> patching t1.TRG...
|
||||
|
||||
CREATE TRIGGER wl2818_trg2 AFTER INSERT ON t1
|
||||
FOR EACH ROW
|
||||
INSERT INTO t2 VALUES(CURRENT_USER());
|
||||
Warnings:
|
||||
Warning 1454 No definer attribute for trigger 'mysqltest_db1'.'wl2818_trg1'. The trigger will be activated under the authorization of the invoker, which may have insufficient privileges. Please recreate the trigger.
|
||||
|
||||
SELECT trigger_name, definer FROM INFORMATION_SCHEMA.TRIGGERS ORDER BY trigger_name;
|
||||
trigger_name definer
|
||||
wl2818_trg1
|
||||
wl2818_trg2 mysqltest_dfn@localhost
|
||||
Warnings:
|
||||
Warning 1454 No definer attribute for trigger 'mysqltest_db1'.'wl2818_trg1'. The trigger will be activated under the authorization of the invoker, which may have insufficient privileges. Please recreate the trigger.
|
||||
|
||||
SELECT * FROM INFORMATION_SCHEMA.TRIGGERS ORDER BY trigger_name;
|
||||
TRIGGER_CATALOG TRIGGER_SCHEMA TRIGGER_NAME EVENT_MANIPULATION EVENT_OBJECT_CATALOG EVENT_OBJECT_SCHEMA EVENT_OBJECT_TABLE ACTION_ORDER ACTION_CONDITION ACTION_STATEMENT ACTION_ORIENTATION ACTION_TIMING ACTION_REFERENCE_OLD_TABLE ACTION_REFERENCE_NEW_TABLE ACTION_REFERENCE_OLD_ROW ACTION_REFERENCE_NEW_ROW CREATED SQL_MODE DEFINER
|
||||
NULL mysqltest_db1 wl2818_trg1 INSERT NULL mysqltest_db1 t1 0 NULL
|
||||
INSERT INTO t2 VALUES(CURRENT_USER()) ROW BEFORE NULL NULL OLD NEW NULL
|
||||
NULL mysqltest_db1 wl2818_trg2 INSERT NULL mysqltest_db1 t1 0 NULL
|
||||
INSERT INTO t2 VALUES(CURRENT_USER()) ROW AFTER NULL NULL OLD NEW NULL mysqltest_dfn@localhost
|
238
mysql-test/r/trigger-grant.result
Normal file
238
mysql-test/r/trigger-grant.result
Normal file
@ -0,0 +1,238 @@
|
||||
DELETE FROM mysql.user WHERE User LIKE 'mysqltest_%';
|
||||
DELETE FROM mysql.db WHERE User LIKE 'mysqltest_%';
|
||||
DELETE FROM mysql.tables_priv WHERE User LIKE 'mysqltest_%';
|
||||
DELETE FROM mysql.columns_priv WHERE User LIKE 'mysqltest_%';
|
||||
FLUSH PRIVILEGES;
|
||||
DROP DATABASE IF EXISTS mysqltest_db1;
|
||||
CREATE DATABASE mysqltest_db1;
|
||||
CREATE USER mysqltest_dfn@localhost;
|
||||
CREATE USER mysqltest_inv@localhost;
|
||||
GRANT SUPER ON *.* TO mysqltest_dfn@localhost;
|
||||
GRANT CREATE ON mysqltest_db1.* TO mysqltest_dfn@localhost;
|
||||
|
||||
---> connection: wl2818_definer_con
|
||||
CREATE TABLE t1(num_value INT);
|
||||
CREATE TABLE t2(user_str TEXT);
|
||||
CREATE TRIGGER trg1 AFTER INSERT ON t1
|
||||
FOR EACH ROW
|
||||
INSERT INTO t2 VALUES(CURRENT_USER());
|
||||
|
||||
---> connection: default
|
||||
GRANT ALL PRIVILEGES ON mysqltest_db1.t1 TO mysqltest_dfn@localhost;
|
||||
GRANT ALL PRIVILEGES ON mysqltest_db1.t2 TO mysqltest_dfn@localhost;
|
||||
GRANT ALL PRIVILEGES ON mysqltest_db1.t1
|
||||
TO 'mysqltest_inv'@localhost;
|
||||
GRANT SELECT ON mysqltest_db1.t2
|
||||
TO 'mysqltest_inv'@localhost;
|
||||
|
||||
---> connection: wl2818_definer_con
|
||||
use mysqltest_db1;
|
||||
INSERT INTO t1 VALUES(1);
|
||||
SELECT * FROM t1;
|
||||
num_value
|
||||
1
|
||||
SELECT * FROM t2;
|
||||
user_str
|
||||
mysqltest_dfn@localhost
|
||||
|
||||
---> connection: wl2818_invoker_con
|
||||
use mysqltest_db1;
|
||||
INSERT INTO t1 VALUES(2);
|
||||
SELECT * FROM t1;
|
||||
num_value
|
||||
1
|
||||
2
|
||||
SELECT * FROM t2;
|
||||
user_str
|
||||
mysqltest_dfn@localhost
|
||||
mysqltest_dfn@localhost
|
||||
|
||||
---> connection: default
|
||||
use mysqltest_db1;
|
||||
REVOKE INSERT ON mysqltest_db1.t2 FROM mysqltest_dfn@localhost;
|
||||
|
||||
---> connection: wl2818_invoker_con
|
||||
use mysqltest_db1;
|
||||
INSERT INTO t1 VALUES(3);
|
||||
ERROR 42000: INSERT command denied to user 'mysqltest_dfn'@'localhost' for table 't2'
|
||||
SELECT * FROM t1;
|
||||
num_value
|
||||
1
|
||||
2
|
||||
3
|
||||
SELECT * FROM t2;
|
||||
user_str
|
||||
mysqltest_dfn@localhost
|
||||
mysqltest_dfn@localhost
|
||||
|
||||
---> connection: default
|
||||
use mysqltest_db1;
|
||||
REVOKE SELECT ON mysqltest_db1.t1 FROM mysqltest_dfn@localhost;
|
||||
|
||||
---> connection: wl2818_definer_con
|
||||
use mysqltest_db1;
|
||||
DROP TRIGGER trg1;
|
||||
SET @new_sum = 0;
|
||||
SET @old_sum = 0;
|
||||
---> INSERT INTO statement; BEFORE timing
|
||||
CREATE TRIGGER trg1 BEFORE INSERT ON t1
|
||||
FOR EACH ROW
|
||||
SET @new_sum = @new_sum + NEW.num_value;
|
||||
INSERT INTO t1 VALUES(4);
|
||||
ERROR 42000: SELECT command denied to user 'mysqltest_dfn'@'localhost' for table 't1'
|
||||
---> INSERT INTO statement; AFTER timing
|
||||
DROP TRIGGER trg1;
|
||||
CREATE TRIGGER trg1 AFTER INSERT ON t1
|
||||
FOR EACH ROW
|
||||
SET @new_sum = @new_sum + NEW.num_value;
|
||||
INSERT INTO t1 VALUES(5);
|
||||
ERROR 42000: SELECT command denied to user 'mysqltest_dfn'@'localhost' for table 't1'
|
||||
---> UPDATE statement; BEFORE timing
|
||||
DROP TRIGGER trg1;
|
||||
CREATE TRIGGER trg1 BEFORE UPDATE ON t1
|
||||
FOR EACH ROW
|
||||
SET @old_sum = @old_sum + OLD.num_value;
|
||||
UPDATE t1 SET num_value = 10;
|
||||
ERROR 42000: SELECT command denied to user 'mysqltest_dfn'@'localhost' for table 't1'
|
||||
---> UPDATE statement; AFTER timing
|
||||
DROP TRIGGER trg1;
|
||||
CREATE TRIGGER trg1 AFTER UPDATE ON t1
|
||||
FOR EACH ROW
|
||||
SET @new_sum = @new_sum + NEW.num_value;
|
||||
UPDATE t1 SET num_value = 20;
|
||||
ERROR 42000: SELECT command denied to user 'mysqltest_dfn'@'localhost' for table 't1'
|
||||
---> DELETE statement; BEFORE timing
|
||||
DROP TRIGGER trg1;
|
||||
CREATE TRIGGER trg1 BEFORE DELETE ON t1
|
||||
FOR EACH ROW
|
||||
SET @old_sum = @old_sum + OLD.num_value;
|
||||
DELETE FROM t1;
|
||||
ERROR 42000: SELECT command denied to user 'mysqltest_dfn'@'localhost' for table 't1'
|
||||
---> DELETE statement; AFTER timing
|
||||
DROP TRIGGER trg1;
|
||||
CREATE TRIGGER trg1 AFTER DELETE ON t1
|
||||
FOR EACH ROW
|
||||
SET @old_sum = @old_sum + OLD.num_value;
|
||||
DELETE FROM t1;
|
||||
ERROR 42000: SELECT command denied to user 'mysqltest_dfn'@'localhost' for table 't1'
|
||||
|
||||
---> connection: default
|
||||
use mysqltest_db1;
|
||||
GRANT SELECT ON mysqltest_db1.t1 TO mysqltest_dfn@localhost;
|
||||
REVOKE UPDATE ON mysqltest_db1.t1 FROM mysqltest_dfn@localhost;
|
||||
|
||||
---> connection: wl2818_definer_con
|
||||
use mysqltest_db1;
|
||||
DROP TRIGGER trg1;
|
||||
SET @new_sum = 0;
|
||||
SET @old_sum = 0;
|
||||
---> INSERT INTO statement; BEFORE timing
|
||||
CREATE TRIGGER trg1 BEFORE INSERT ON t1
|
||||
FOR EACH ROW
|
||||
SET @new_sum = @new_sum + NEW.num_value;
|
||||
INSERT INTO t1 VALUES(4);
|
||||
ERROR 42000: UPDATE command denied to user 'mysqltest_dfn'@'localhost' for table 't1'
|
||||
---> INSERT INTO statement; AFTER timing
|
||||
DROP TRIGGER trg1;
|
||||
CREATE TRIGGER trg1 AFTER INSERT ON t1
|
||||
FOR EACH ROW
|
||||
SET @new_sum = @new_sum + NEW.num_value;
|
||||
INSERT INTO t1 VALUES(5);
|
||||
ERROR 42000: UPDATE command denied to user 'mysqltest_dfn'@'localhost' for table 't1'
|
||||
---> UPDATE statement; BEFORE timing
|
||||
DROP TRIGGER trg1;
|
||||
CREATE TRIGGER trg1 BEFORE UPDATE ON t1
|
||||
FOR EACH ROW
|
||||
SET @old_sum = @old_sum + OLD.num_value;
|
||||
UPDATE t1 SET num_value = 10;
|
||||
ERROR 42000: UPDATE command denied to user 'mysqltest_dfn'@'localhost' for table 't1'
|
||||
---> UPDATE statement; AFTER timing
|
||||
DROP TRIGGER trg1;
|
||||
CREATE TRIGGER trg1 AFTER UPDATE ON t1
|
||||
FOR EACH ROW
|
||||
SET @new_sum = @new_sum + NEW.num_value;
|
||||
UPDATE t1 SET num_value = 20;
|
||||
ERROR 42000: UPDATE command denied to user 'mysqltest_dfn'@'localhost' for table 't1'
|
||||
---> DELETE statement; BEFORE timing
|
||||
DROP TRIGGER trg1;
|
||||
CREATE TRIGGER trg1 BEFORE DELETE ON t1
|
||||
FOR EACH ROW
|
||||
SET @old_sum = @old_sum + OLD.num_value;
|
||||
DELETE FROM t1;
|
||||
ERROR 42000: UPDATE command denied to user 'mysqltest_dfn'@'localhost' for table 't1'
|
||||
---> DELETE statement; AFTER timing
|
||||
DROP TRIGGER trg1;
|
||||
CREATE TRIGGER trg1 AFTER DELETE ON t1
|
||||
FOR EACH ROW
|
||||
SET @old_sum = @old_sum + OLD.num_value;
|
||||
DELETE FROM t1;
|
||||
ERROR 42000: UPDATE command denied to user 'mysqltest_dfn'@'localhost' for table 't1'
|
||||
|
||||
---> connection: wl2818_definer_con
|
||||
use mysqltest_db1;
|
||||
DROP TRIGGER trg1;
|
||||
CREATE DEFINER='mysqltest_inv'@'localhost'
|
||||
TRIGGER trg1 BEFORE INSERT ON t1
|
||||
FOR EACH ROW
|
||||
SET @new_sum = 0;
|
||||
CREATE DEFINER='mysqltest_nonexs'@'localhost'
|
||||
TRIGGER trg2 AFTER INSERT ON t1
|
||||
FOR EACH ROW
|
||||
SET @new_sum = 0;
|
||||
Warnings:
|
||||
Note 1449 There is no 'mysqltest_nonexs'@'localhost' registered
|
||||
INSERT INTO t1 VALUES(6);
|
||||
ERROR 42000: Access denied; you need the SUPER privilege for this operation
|
||||
SHOW TRIGGERS;
|
||||
Trigger Event Table Statement Timing Created sql_mode Definer
|
||||
trg1 INSERT t1
|
||||
SET @new_sum = 0 BEFORE NULL mysqltest_inv@localhost
|
||||
trg2 INSERT t1
|
||||
SET @new_sum = 0 AFTER NULL mysqltest_nonexs@localhost
|
||||
DROP TRIGGER trg1;
|
||||
DROP TRIGGER trg2;
|
||||
CREATE TRIGGER trg1 BEFORE INSERT ON t1
|
||||
FOR EACH ROW
|
||||
SET @a = 1;
|
||||
CREATE TRIGGER trg2 AFTER INSERT ON t1
|
||||
FOR EACH ROW
|
||||
SET @a = 2;
|
||||
CREATE TRIGGER trg3 BEFORE UPDATE ON t1
|
||||
FOR EACH ROW
|
||||
SET @a = 3;
|
||||
CREATE TRIGGER trg4 AFTER UPDATE ON t1
|
||||
FOR EACH ROW
|
||||
SET @a = 4;
|
||||
CREATE TRIGGER trg5 BEFORE DELETE ON t1
|
||||
FOR EACH ROW
|
||||
SET @a = 5;
|
||||
|
||||
SELECT trigger_name, definer FROM INFORMATION_SCHEMA.TRIGGERS ORDER BY trigger_name;
|
||||
trigger_name definer
|
||||
trg1
|
||||
trg2 @
|
||||
trg3 @abc@def@@
|
||||
trg4 @hostname
|
||||
trg5 @abcdef@@@hostname
|
||||
Warnings:
|
||||
Warning 1454 No definer attribute for trigger 'mysqltest_db1'.'trg1'. The trigger will be activated under the authorization of the invoker, which may have insufficient privileges. Please recreate the trigger.
|
||||
|
||||
SELECT * FROM INFORMATION_SCHEMA.TRIGGERS ORDER BY trigger_name;
|
||||
TRIGGER_CATALOG TRIGGER_SCHEMA TRIGGER_NAME EVENT_MANIPULATION EVENT_OBJECT_CATALOG EVENT_OBJECT_SCHEMA EVENT_OBJECT_TABLE ACTION_ORDER ACTION_CONDITION ACTION_STATEMENT ACTION_ORIENTATION ACTION_TIMING ACTION_REFERENCE_OLD_TABLE ACTION_REFERENCE_NEW_TABLE ACTION_REFERENCE_OLD_ROW ACTION_REFERENCE_NEW_ROW CREATED SQL_MODE DEFINER
|
||||
NULL mysqltest_db1 trg1 INSERT NULL mysqltest_db1 t1 0 NULL
|
||||
SET @a = 1 ROW BEFORE NULL NULL OLD NEW NULL
|
||||
NULL mysqltest_db1 trg2 INSERT NULL mysqltest_db1 t1 0 NULL
|
||||
SET @a = 2 ROW AFTER NULL NULL OLD NEW NULL @
|
||||
NULL mysqltest_db1 trg3 UPDATE NULL mysqltest_db1 t1 0 NULL
|
||||
SET @a = 3 ROW BEFORE NULL NULL OLD NEW NULL @abc@def@@
|
||||
NULL mysqltest_db1 trg4 UPDATE NULL mysqltest_db1 t1 0 NULL
|
||||
SET @a = 4 ROW AFTER NULL NULL OLD NEW NULL @hostname
|
||||
NULL mysqltest_db1 trg5 DELETE NULL mysqltest_db1 t1 0 NULL
|
||||
SET @a = 5 ROW BEFORE NULL NULL OLD NEW NULL @abcdef@@@hostname
|
||||
|
||||
---> connection: default
|
||||
DROP USER mysqltest_dfn@localhost;
|
||||
DROP USER mysqltest_inv@localhost;
|
||||
DROP DATABASE mysqltest_db1;
|
||||
Warnings:
|
||||
Warning 1454 No definer attribute for trigger 'mysqltest_db1'.'trg1'. The trigger will be activated under the authorization of the invoker, which may have insufficient privileges. Please recreate the trigger.
|
@ -611,9 +611,9 @@ select @a;
|
||||
@a
|
||||
10
|
||||
show triggers;
|
||||
Trigger Event Table Statement Timing Created sql_mode
|
||||
t1_bi INSERT t1 set new."t1 column" = 5 BEFORE # REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ANSI
|
||||
t1_af INSERT t1 set @a=10 AFTER #
|
||||
Trigger Event Table Statement Timing Created sql_mode Definer
|
||||
t1_bi INSERT t1 set new."t1 column" = 5 BEFORE # REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ANSI root@localhost
|
||||
t1_af INSERT t1 set @a=10 AFTER # root@localhost
|
||||
drop table t1;
|
||||
set sql_mode="traditional";
|
||||
create table t1 (a date);
|
||||
@ -633,8 +633,8 @@ t1 CREATE TABLE `t1` (
|
||||
`a` date default NULL
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||
show triggers;
|
||||
Trigger Event Table Statement Timing Created sql_mode
|
||||
t1_bi INSERT t1 set new.a = '2004-01-00' BEFORE #
|
||||
Trigger Event Table Statement Timing Created sql_mode Definer
|
||||
t1_bi INSERT t1 set new.a = '2004-01-00' BEFORE # root@localhost
|
||||
drop table t1;
|
||||
create table t1 (id int);
|
||||
create trigger t1_ai after insert on t1 for each row flush tables;
|
||||
|
@ -2199,10 +2199,10 @@ r_object_id users_names
|
||||
drop view v1, v2;
|
||||
drop table t1, t2;
|
||||
create definer=some_user@`` sql security invoker view v1 as select 1;
|
||||
ERROR HY000: View definer is not fully qualified
|
||||
ERROR HY000: Definer is not fully qualified
|
||||
create definer=some_user@localhost sql security invoker view v1 as select 1;
|
||||
Warnings:
|
||||
Note 1449 There is not some_user@localhost registered
|
||||
Note 1449 There is no 'some_user'@'localhost' registered
|
||||
show create view v1;
|
||||
View Create View
|
||||
v1 CREATE ALGORITHM=UNDEFINED DEFINER=`some_user`@`localhost` SQL SECURITY INVOKER VIEW `v1` AS select 1 AS `1`
|
||||
|
@ -13,7 +13,7 @@ create table mysqltest.t2 (a int, b int);
|
||||
grant select on mysqltest.t1 to mysqltest_1@localhost;
|
||||
grant create view,select on test.* to mysqltest_1@localhost;
|
||||
create definer=root@localhost view v1 as select * from mysqltest.t1;
|
||||
ERROR HY000: You need the SUPER privilege for creation view with root@localhost definer
|
||||
ERROR 42000: Access denied; you need the SUPER privilege for this operation
|
||||
create view v1 as select * from mysqltest.t1;
|
||||
alter view v1 as select * from mysqltest.t1;
|
||||
ERROR 42000: DROP command denied to user 'mysqltest_1'@'localhost' for table 'v1'
|
||||
|
@ -882,6 +882,7 @@ DROP FUNCTION IF EXISTS bug9056_func1;
|
||||
DROP FUNCTION IF EXISTS bug9056_func2;
|
||||
DROP PROCEDURE IF EXISTS bug9056_proc1;
|
||||
DROP PROCEDURE IF EXISTS bug9056_proc2;
|
||||
DROP PROCEDURE IF EXISTS `a'b`;
|
||||
--enable_warnings
|
||||
|
||||
CREATE TABLE t1 (id int);
|
||||
|
@ -87,12 +87,35 @@ insert into t1 set a = now();
|
||||
select a=b && a=c from t1;
|
||||
let $time=`select a from t1`;
|
||||
|
||||
# Check that definer attribute is replicated properly:
|
||||
# - dump definers on the master;
|
||||
# - wait for the slave to synchronize with the master;
|
||||
# - dump definers on the slave;
|
||||
|
||||
SELECT routine_name, definer
|
||||
FROM information_schema.routines;
|
||||
|
||||
SELECT trigger_name, definer
|
||||
FROM information_schema.triggers;
|
||||
|
||||
save_master_pos;
|
||||
connection slave;
|
||||
sync_with_master;
|
||||
--disable_query_log
|
||||
select "--- On slave --" as "";
|
||||
--enable_query_log
|
||||
|
||||
# XXX: Definers of stored procedures and functions are not replicated. WL#2897
|
||||
# (Complete definer support in the stored routines) addresses this issue. So,
|
||||
# the result file is expected to be changed after implementation of this WL
|
||||
# item.
|
||||
|
||||
SELECT routine_name, definer
|
||||
FROM information_schema.routines;
|
||||
|
||||
SELECT trigger_name, definer
|
||||
FROM information_schema.triggers;
|
||||
|
||||
select a=b && a=c from t1;
|
||||
--disable_query_log
|
||||
eval select a='$time' as 'test' from t1;
|
||||
|
@ -9,7 +9,7 @@ use test;
|
||||
# test that we can create VIEW if privileges check switched off
|
||||
#
|
||||
create table t1 (field1 INT);
|
||||
-- error ER_NO_VIEW_USER
|
||||
-- error ER_MALFORMED_DEFINER
|
||||
CREATE VIEW v1 AS SELECT field1 FROM t1;
|
||||
drop table t1;
|
||||
|
||||
|
83
mysql-test/t/trigger-compat.test
Normal file
83
mysql-test/t/trigger-compat.test
Normal file
@ -0,0 +1,83 @@
|
||||
# Test case(s) in this file contain(s) GRANT/REVOKE statements, which are not
|
||||
# supported in embedded server. So, this test should not be run on embedded
|
||||
# server.
|
||||
|
||||
-- source include/not_embedded.inc
|
||||
|
||||
###########################################################################
|
||||
#
|
||||
# Tests for WL#2818:
|
||||
# - Check that triggers created w/o DEFINER information work well:
|
||||
# - create the first trigger;
|
||||
# - manually remove definer information from corresponding TRG file;
|
||||
# - create the second trigger (the first trigger will be reloaded; check
|
||||
# that we receive a warning);
|
||||
# - check that the triggers loaded correctly;
|
||||
#
|
||||
###########################################################################
|
||||
|
||||
#
|
||||
# Prepare environment.
|
||||
#
|
||||
|
||||
DELETE FROM mysql.user WHERE User LIKE 'mysqltest_%';
|
||||
DELETE FROM mysql.db WHERE User LIKE 'mysqltest_%';
|
||||
DELETE FROM mysql.tables_priv WHERE User LIKE 'mysqltest_%';
|
||||
DELETE FROM mysql.columns_priv WHERE User LIKE 'mysqltest_%';
|
||||
FLUSH PRIVILEGES;
|
||||
|
||||
--disable_warnings
|
||||
DROP DATABASE IF EXISTS mysqltest_db1;
|
||||
--enable_warnings
|
||||
|
||||
CREATE DATABASE mysqltest_db1;
|
||||
|
||||
CREATE USER mysqltest_dfn@localhost;
|
||||
CREATE USER mysqltest_inv@localhost;
|
||||
|
||||
GRANT SUPER ON *.* TO mysqltest_dfn@localhost;
|
||||
GRANT CREATE ON mysqltest_db1.* TO mysqltest_dfn@localhost;
|
||||
|
||||
#
|
||||
# Create a table and the first trigger.
|
||||
#
|
||||
|
||||
--connect (wl2818_definer_con,localhost,mysqltest_dfn,,mysqltest_db1)
|
||||
--connection wl2818_definer_con
|
||||
--echo
|
||||
--echo ---> connection: wl2818_definer_con
|
||||
|
||||
CREATE TABLE t1(num_value INT);
|
||||
CREATE TABLE t2(user_str TEXT);
|
||||
|
||||
CREATE TRIGGER wl2818_trg1 BEFORE INSERT ON t1
|
||||
FOR EACH ROW
|
||||
INSERT INTO t2 VALUES(CURRENT_USER());
|
||||
|
||||
#
|
||||
# Remove definers from TRG file.
|
||||
#
|
||||
|
||||
--echo
|
||||
--echo ---> patching t1.TRG...
|
||||
|
||||
--exec grep --text -v 'definers=' $MYSQL_TEST_DIR/var/master-data/mysqltest_db1/t1.TRG > $MYSQL_TEST_DIR/var/tmp/t1.TRG
|
||||
--exec mv $MYSQL_TEST_DIR/var/tmp/t1.TRG $MYSQL_TEST_DIR/var/master-data/mysqltest_db1/t1.TRG
|
||||
|
||||
#
|
||||
# Create a new trigger.
|
||||
#
|
||||
|
||||
--echo
|
||||
|
||||
CREATE TRIGGER wl2818_trg2 AFTER INSERT ON t1
|
||||
FOR EACH ROW
|
||||
INSERT INTO t2 VALUES(CURRENT_USER());
|
||||
|
||||
--echo
|
||||
|
||||
SELECT trigger_name, definer FROM INFORMATION_SCHEMA.TRIGGERS ORDER BY trigger_name;
|
||||
|
||||
--echo
|
||||
|
||||
SELECT * FROM INFORMATION_SCHEMA.TRIGGERS ORDER BY trigger_name;
|
475
mysql-test/t/trigger-grant.test
Normal file
475
mysql-test/t/trigger-grant.test
Normal file
@ -0,0 +1,475 @@
|
||||
# Test case(s) in this file contain(s) GRANT/REVOKE statements, which are not
|
||||
# supported in embedded server. So, this test should not be run on embedded
|
||||
# server.
|
||||
|
||||
-- source include/not_embedded.inc
|
||||
|
||||
###########################################################################
|
||||
#
|
||||
# Tests for WL#2818:
|
||||
# - Check that triggers are executed under the authorization of the definer.
|
||||
# - Check that if trigger contains NEW/OLD variables, the definer must have
|
||||
# SELECT privilege on the subject table.
|
||||
# - Check DEFINER clause of CREATE TRIGGER statement;
|
||||
# - Check that SUPER privilege required to create a trigger with different
|
||||
# definer.
|
||||
# - Check that if the user specified as DEFINER does not exist, a warning
|
||||
# is emitted.
|
||||
# - Check that the definer of a trigger does not exist, the trigger will
|
||||
# not be activated.
|
||||
# - Check that SHOW TRIGGERS statement provides "Definer" column.
|
||||
#
|
||||
# Let's also check that user name part of definer can contain '@' symbol (to
|
||||
# check that triggers are not affected by BUG#13310 "incorrect user parsing
|
||||
# by SP").
|
||||
#
|
||||
###########################################################################
|
||||
|
||||
#
|
||||
# Prepare environment.
|
||||
#
|
||||
|
||||
DELETE FROM mysql.user WHERE User LIKE 'mysqltest_%';
|
||||
DELETE FROM mysql.db WHERE User LIKE 'mysqltest_%';
|
||||
DELETE FROM mysql.tables_priv WHERE User LIKE 'mysqltest_%';
|
||||
DELETE FROM mysql.columns_priv WHERE User LIKE 'mysqltest_%';
|
||||
FLUSH PRIVILEGES;
|
||||
|
||||
--disable_warnings
|
||||
DROP DATABASE IF EXISTS mysqltest_db1;
|
||||
--enable_warnings
|
||||
|
||||
CREATE DATABASE mysqltest_db1;
|
||||
|
||||
CREATE USER mysqltest_dfn@localhost;
|
||||
CREATE USER mysqltest_inv@localhost;
|
||||
|
||||
GRANT SUPER ON *.* TO mysqltest_dfn@localhost;
|
||||
GRANT CREATE ON mysqltest_db1.* TO mysqltest_dfn@localhost;
|
||||
|
||||
#
|
||||
# Check that triggers are executed under the authorization of the definer:
|
||||
# - create two tables under "definer";
|
||||
# - grant all privileges on the test db to "definer";
|
||||
# - grant all privileges on the first table to "invoker";
|
||||
# - grant only select privilege on the second table to "invoker";
|
||||
# - create a trigger, which inserts a row into the second table after
|
||||
# inserting into the first table.
|
||||
# - insert a row into the first table under "invoker". A row also should be
|
||||
# inserted into the second table.
|
||||
#
|
||||
|
||||
--connect (wl2818_definer_con,localhost,mysqltest_dfn,,mysqltest_db1)
|
||||
--connection wl2818_definer_con
|
||||
--echo
|
||||
--echo ---> connection: wl2818_definer_con
|
||||
|
||||
CREATE TABLE t1(num_value INT);
|
||||
CREATE TABLE t2(user_str TEXT);
|
||||
|
||||
CREATE TRIGGER trg1 AFTER INSERT ON t1
|
||||
FOR EACH ROW
|
||||
INSERT INTO t2 VALUES(CURRENT_USER());
|
||||
|
||||
--connection default
|
||||
--echo
|
||||
--echo ---> connection: default
|
||||
|
||||
# Setup definer's privileges.
|
||||
|
||||
GRANT ALL PRIVILEGES ON mysqltest_db1.t1 TO mysqltest_dfn@localhost;
|
||||
GRANT ALL PRIVILEGES ON mysqltest_db1.t2 TO mysqltest_dfn@localhost;
|
||||
|
||||
# Setup invoker's privileges.
|
||||
|
||||
GRANT ALL PRIVILEGES ON mysqltest_db1.t1
|
||||
TO 'mysqltest_inv'@localhost;
|
||||
|
||||
GRANT SELECT ON mysqltest_db1.t2
|
||||
TO 'mysqltest_inv'@localhost;
|
||||
|
||||
--connection wl2818_definer_con
|
||||
--echo
|
||||
--echo ---> connection: wl2818_definer_con
|
||||
|
||||
use mysqltest_db1;
|
||||
|
||||
INSERT INTO t1 VALUES(1);
|
||||
|
||||
SELECT * FROM t1;
|
||||
SELECT * FROM t2;
|
||||
|
||||
--connect (wl2818_invoker_con,localhost,mysqltest_inv,,mysqltest_db1)
|
||||
--connection wl2818_invoker_con
|
||||
--echo
|
||||
--echo ---> connection: wl2818_invoker_con
|
||||
|
||||
use mysqltest_db1;
|
||||
|
||||
INSERT INTO t1 VALUES(2);
|
||||
|
||||
SELECT * FROM t1;
|
||||
SELECT * FROM t2;
|
||||
|
||||
#
|
||||
# Check that if definer lost some privilege required to execute (activate) a
|
||||
# trigger, the trigger will not be activated:
|
||||
# - create a trigger on insert into the first table, which will insert a row
|
||||
# into the second table;
|
||||
# - revoke INSERT privilege on the second table from the definer;
|
||||
# - insert a row into the first table;
|
||||
# - check that an error has been risen;
|
||||
# - check that no row has been inserted into the second table;
|
||||
#
|
||||
|
||||
--connection default
|
||||
--echo
|
||||
--echo ---> connection: default
|
||||
|
||||
use mysqltest_db1;
|
||||
|
||||
REVOKE INSERT ON mysqltest_db1.t2 FROM mysqltest_dfn@localhost;
|
||||
|
||||
--connection wl2818_invoker_con
|
||||
--echo
|
||||
--echo ---> connection: wl2818_invoker_con
|
||||
|
||||
use mysqltest_db1;
|
||||
|
||||
--error ER_TABLEACCESS_DENIED_ERROR
|
||||
INSERT INTO t1 VALUES(3);
|
||||
|
||||
SELECT * FROM t1;
|
||||
SELECT * FROM t2;
|
||||
|
||||
#
|
||||
# Check that if trigger contains NEW/OLD variables, the definer must have
|
||||
# SELECT/UPDATE privilege on the subject table:
|
||||
# - drop the trigger;
|
||||
# - create a new trigger, which will use NEW variable;
|
||||
# - create another new trigger, which will use OLD variable;
|
||||
# - revoke SELECT/UPDATE privilege on the first table from "definer";
|
||||
# - insert a row into the first table;
|
||||
# - analyze error code;
|
||||
#
|
||||
|
||||
#
|
||||
# SELECT privilege.
|
||||
#
|
||||
|
||||
--connection default
|
||||
--echo
|
||||
--echo ---> connection: default
|
||||
|
||||
use mysqltest_db1;
|
||||
|
||||
REVOKE SELECT ON mysqltest_db1.t1 FROM mysqltest_dfn@localhost;
|
||||
|
||||
--connection wl2818_definer_con
|
||||
--echo
|
||||
--echo ---> connection: wl2818_definer_con
|
||||
|
||||
use mysqltest_db1;
|
||||
|
||||
DROP TRIGGER trg1;
|
||||
|
||||
SET @new_sum = 0;
|
||||
SET @old_sum = 0;
|
||||
|
||||
# INSERT INTO statement; BEFORE timing
|
||||
|
||||
--echo ---> INSERT INTO statement; BEFORE timing
|
||||
|
||||
CREATE TRIGGER trg1 BEFORE INSERT ON t1
|
||||
FOR EACH ROW
|
||||
SET @new_sum = @new_sum + NEW.num_value;
|
||||
|
||||
--error ER_TABLEACCESS_DENIED_ERROR
|
||||
INSERT INTO t1 VALUES(4);
|
||||
|
||||
# INSERT INTO statement; AFTER timing
|
||||
|
||||
--echo ---> INSERT INTO statement; AFTER timing
|
||||
|
||||
DROP TRIGGER trg1;
|
||||
|
||||
CREATE TRIGGER trg1 AFTER INSERT ON t1
|
||||
FOR EACH ROW
|
||||
SET @new_sum = @new_sum + NEW.num_value;
|
||||
|
||||
--error ER_TABLEACCESS_DENIED_ERROR
|
||||
INSERT INTO t1 VALUES(5);
|
||||
|
||||
# UPDATE statement; BEFORE timing
|
||||
|
||||
--echo ---> UPDATE statement; BEFORE timing
|
||||
|
||||
DROP TRIGGER trg1;
|
||||
|
||||
CREATE TRIGGER trg1 BEFORE UPDATE ON t1
|
||||
FOR EACH ROW
|
||||
SET @old_sum = @old_sum + OLD.num_value;
|
||||
|
||||
--error ER_TABLEACCESS_DENIED_ERROR
|
||||
UPDATE t1 SET num_value = 10;
|
||||
|
||||
# UPDATE statement; AFTER timing
|
||||
|
||||
--echo ---> UPDATE statement; AFTER timing
|
||||
|
||||
DROP TRIGGER trg1;
|
||||
|
||||
CREATE TRIGGER trg1 AFTER UPDATE ON t1
|
||||
FOR EACH ROW
|
||||
SET @new_sum = @new_sum + NEW.num_value;
|
||||
|
||||
--error ER_TABLEACCESS_DENIED_ERROR
|
||||
UPDATE t1 SET num_value = 20;
|
||||
|
||||
# DELETE statement; BEFORE timing
|
||||
|
||||
--echo ---> DELETE statement; BEFORE timing
|
||||
|
||||
DROP TRIGGER trg1;
|
||||
|
||||
CREATE TRIGGER trg1 BEFORE DELETE ON t1
|
||||
FOR EACH ROW
|
||||
SET @old_sum = @old_sum + OLD.num_value;
|
||||
|
||||
--error ER_TABLEACCESS_DENIED_ERROR
|
||||
DELETE FROM t1;
|
||||
|
||||
# DELETE statement; AFTER timing
|
||||
|
||||
--echo ---> DELETE statement; AFTER timing
|
||||
|
||||
DROP TRIGGER trg1;
|
||||
|
||||
CREATE TRIGGER trg1 AFTER DELETE ON t1
|
||||
FOR EACH ROW
|
||||
SET @old_sum = @old_sum + OLD.num_value;
|
||||
|
||||
--error ER_TABLEACCESS_DENIED_ERROR
|
||||
DELETE FROM t1;
|
||||
|
||||
#
|
||||
# UPDATE privilege
|
||||
#
|
||||
# NOTE: At the moment, UPDATE privilege is required if the trigger contains
|
||||
# NEW/OLD variables, whenever the trigger modifies them or not. Moreover,
|
||||
# UPDATE privilege is checked for whole table, not for individual columns.
|
||||
#
|
||||
# The following test cases should be changed when full support of UPDATE
|
||||
# privilege will be done.
|
||||
#
|
||||
|
||||
--connection default
|
||||
--echo
|
||||
--echo ---> connection: default
|
||||
|
||||
use mysqltest_db1;
|
||||
|
||||
GRANT SELECT ON mysqltest_db1.t1 TO mysqltest_dfn@localhost;
|
||||
REVOKE UPDATE ON mysqltest_db1.t1 FROM mysqltest_dfn@localhost;
|
||||
|
||||
--connection wl2818_definer_con
|
||||
--echo
|
||||
--echo ---> connection: wl2818_definer_con
|
||||
|
||||
use mysqltest_db1;
|
||||
|
||||
DROP TRIGGER trg1;
|
||||
|
||||
SET @new_sum = 0;
|
||||
SET @old_sum = 0;
|
||||
|
||||
# INSERT INTO statement; BEFORE timing
|
||||
|
||||
--echo ---> INSERT INTO statement; BEFORE timing
|
||||
|
||||
CREATE TRIGGER trg1 BEFORE INSERT ON t1
|
||||
FOR EACH ROW
|
||||
SET @new_sum = @new_sum + NEW.num_value;
|
||||
|
||||
--error ER_TABLEACCESS_DENIED_ERROR
|
||||
INSERT INTO t1 VALUES(4);
|
||||
|
||||
# INSERT INTO statement; AFTER timing
|
||||
|
||||
--echo ---> INSERT INTO statement; AFTER timing
|
||||
|
||||
DROP TRIGGER trg1;
|
||||
|
||||
CREATE TRIGGER trg1 AFTER INSERT ON t1
|
||||
FOR EACH ROW
|
||||
SET @new_sum = @new_sum + NEW.num_value;
|
||||
|
||||
--error ER_TABLEACCESS_DENIED_ERROR
|
||||
INSERT INTO t1 VALUES(5);
|
||||
|
||||
# UPDATE statement; BEFORE timing
|
||||
|
||||
--echo ---> UPDATE statement; BEFORE timing
|
||||
|
||||
DROP TRIGGER trg1;
|
||||
|
||||
CREATE TRIGGER trg1 BEFORE UPDATE ON t1
|
||||
FOR EACH ROW
|
||||
SET @old_sum = @old_sum + OLD.num_value;
|
||||
|
||||
--error ER_TABLEACCESS_DENIED_ERROR
|
||||
UPDATE t1 SET num_value = 10;
|
||||
|
||||
# UPDATE statement; AFTER timing
|
||||
|
||||
--echo ---> UPDATE statement; AFTER timing
|
||||
|
||||
DROP TRIGGER trg1;
|
||||
|
||||
CREATE TRIGGER trg1 AFTER UPDATE ON t1
|
||||
FOR EACH ROW
|
||||
SET @new_sum = @new_sum + NEW.num_value;
|
||||
|
||||
--error ER_TABLEACCESS_DENIED_ERROR
|
||||
UPDATE t1 SET num_value = 20;
|
||||
|
||||
# DELETE statement; BEFORE timing
|
||||
|
||||
--echo ---> DELETE statement; BEFORE timing
|
||||
|
||||
DROP TRIGGER trg1;
|
||||
|
||||
CREATE TRIGGER trg1 BEFORE DELETE ON t1
|
||||
FOR EACH ROW
|
||||
SET @old_sum = @old_sum + OLD.num_value;
|
||||
|
||||
--error ER_TABLEACCESS_DENIED_ERROR
|
||||
DELETE FROM t1;
|
||||
|
||||
# DELETE statement; AFTER timing
|
||||
|
||||
--echo ---> DELETE statement; AFTER timing
|
||||
|
||||
DROP TRIGGER trg1;
|
||||
|
||||
CREATE TRIGGER trg1 AFTER DELETE ON t1
|
||||
FOR EACH ROW
|
||||
SET @old_sum = @old_sum + OLD.num_value;
|
||||
|
||||
--error ER_TABLEACCESS_DENIED_ERROR
|
||||
DELETE FROM t1;
|
||||
|
||||
#
|
||||
# Check DEFINER clause of CREATE TRIGGER statement.
|
||||
#
|
||||
# NOTE: there is no dedicated TRIGGER privilege for CREATE TRIGGER statement.
|
||||
# SUPER privilege is used instead. I.e., if one invokes CREATE TRIGGER, it should
|
||||
# have SUPER privilege, so this test is meaningless right now.
|
||||
#
|
||||
# - Check that SUPER privilege required to create a trigger with different
|
||||
# definer:
|
||||
# - try to create a trigger with DEFINER="definer@localhost" under
|
||||
# "invoker";
|
||||
# - analyze error code;
|
||||
# - Check that if the user specified as DEFINER does not exist, a warning is
|
||||
# emitted:
|
||||
# - create a trigger with DEFINER="non_existent_user@localhost" from
|
||||
# "definer";
|
||||
# - check that a warning emitted;
|
||||
# - Check that the definer of a trigger does not exist, the trigger will not
|
||||
# be activated:
|
||||
# - activate just created trigger;
|
||||
# - check error code;
|
||||
#
|
||||
|
||||
--connection wl2818_definer_con
|
||||
--echo
|
||||
--echo ---> connection: wl2818_definer_con
|
||||
|
||||
use mysqltest_db1;
|
||||
|
||||
DROP TRIGGER trg1;
|
||||
|
||||
# Check that SUPER is required to specify different DEFINER.
|
||||
# NOTE: meaningless at the moment
|
||||
|
||||
CREATE DEFINER='mysqltest_inv'@'localhost'
|
||||
TRIGGER trg1 BEFORE INSERT ON t1
|
||||
FOR EACH ROW
|
||||
SET @new_sum = 0;
|
||||
|
||||
# Create with non-existent user.
|
||||
|
||||
CREATE DEFINER='mysqltest_nonexs'@'localhost'
|
||||
TRIGGER trg2 AFTER INSERT ON t1
|
||||
FOR EACH ROW
|
||||
SET @new_sum = 0;
|
||||
|
||||
# Check that trg2 will not be activated.
|
||||
|
||||
--error ER_SPECIFIC_ACCESS_DENIED_ERROR
|
||||
INSERT INTO t1 VALUES(6);
|
||||
|
||||
#
|
||||
# Check that SHOW TRIGGERS statement provides "Definer" column.
|
||||
#
|
||||
|
||||
SHOW TRIGGERS;
|
||||
|
||||
#
|
||||
# Check that weird definer values do not break functionality. I.e. check the
|
||||
# following definer values:
|
||||
# - '';
|
||||
# - '@';
|
||||
# - '@abc@def@@';
|
||||
# - '@hostname';
|
||||
# - '@abc@def@@@hostname';
|
||||
#
|
||||
|
||||
DROP TRIGGER trg1;
|
||||
DROP TRIGGER trg2;
|
||||
|
||||
CREATE TRIGGER trg1 BEFORE INSERT ON t1
|
||||
FOR EACH ROW
|
||||
SET @a = 1;
|
||||
|
||||
CREATE TRIGGER trg2 AFTER INSERT ON t1
|
||||
FOR EACH ROW
|
||||
SET @a = 2;
|
||||
|
||||
CREATE TRIGGER trg3 BEFORE UPDATE ON t1
|
||||
FOR EACH ROW
|
||||
SET @a = 3;
|
||||
|
||||
CREATE TRIGGER trg4 AFTER UPDATE ON t1
|
||||
FOR EACH ROW
|
||||
SET @a = 4;
|
||||
|
||||
CREATE TRIGGER trg5 BEFORE DELETE ON t1
|
||||
FOR EACH ROW
|
||||
SET @a = 5;
|
||||
|
||||
--exec egrep --text -v '^definers=' $MYSQL_TEST_DIR/var/master-data/mysqltest_db1/t1.TRG > $MYSQL_TEST_DIR/var/tmp/t1.TRG
|
||||
--exec echo "definers='' '@' '@abc@def@@' '@hostname' '@abcdef@@@hostname'" >> $MYSQL_TEST_DIR/var/tmp/t1.TRG
|
||||
--exec mv $MYSQL_TEST_DIR/var/tmp/t1.TRG $MYSQL_TEST_DIR/var/master-data/mysqltest_db1/t1.TRG
|
||||
|
||||
--echo
|
||||
|
||||
SELECT trigger_name, definer FROM INFORMATION_SCHEMA.TRIGGERS ORDER BY trigger_name;
|
||||
|
||||
--echo
|
||||
|
||||
SELECT * FROM INFORMATION_SCHEMA.TRIGGERS ORDER BY trigger_name;
|
||||
|
||||
#
|
||||
# Cleanup
|
||||
#
|
||||
|
||||
--connection default
|
||||
--echo
|
||||
--echo ---> connection: default
|
||||
|
||||
DROP USER mysqltest_dfn@localhost;
|
||||
DROP USER mysqltest_inv@localhost;
|
||||
|
||||
DROP DATABASE mysqltest_db1;
|
@ -2081,7 +2081,7 @@ drop table t1, t2;
|
||||
#
|
||||
# DEFINER information check
|
||||
#
|
||||
-- error ER_NO_VIEW_USER
|
||||
-- error ER_MALFORMED_DEFINER
|
||||
create definer=some_user@`` sql security invoker view v1 as select 1;
|
||||
create definer=some_user@localhost sql security invoker view v1 as select 1;
|
||||
show create view v1;
|
||||
|
@ -24,7 +24,7 @@ grant create view,select on test.* to mysqltest_1@localhost;
|
||||
connect (user1,localhost,mysqltest_1,,test);
|
||||
connection user1;
|
||||
|
||||
-- error ER_VIEW_OTHER_USER
|
||||
-- error ER_SPECIFIC_ACCESS_DENIED
|
||||
create definer=root@localhost view v1 as select * from mysqltest.t1;
|
||||
create view v1 as select * from mysqltest.t1;
|
||||
# try to modify view without DROP privilege on it
|
||||
|
Reference in New Issue
Block a user