diff options
author | unknown <anozdrin@mysql.com> | 2006-01-24 20:15:12 +0300 |
---|---|---|
committer | unknown <anozdrin@mysql.com> | 2006-01-24 20:15:12 +0300 |
commit | 8f395ebbfa87f21cb7acf655876790df99389499 (patch) | |
tree | 8b864c683f6cc00900b0bf9a6b84bc78cb1cf3e8 /mysql-test/r/trigger-grant.result | |
parent | 9e0240d3661bd746a14eaa23531a2ccbab48f1ab (diff) | |
download | mariadb-git-8f395ebbfa87f21cb7acf655876790df99389499.tar.gz |
Fix for the following bugs:
- BUG#15166: Wrong update permissions required to execute triggers
- BUG#15196: Wrong select permission required to execute triggers
The idea of the fix is to check necessary privileges
in Item_trigger_field::fix_fields(), instead of having "special variables"
technique. To achieve this, we should pass to an Item_trigger_field instance
a flag, which will indicate the usage/access type of this trigger variable.
mysql-test/r/trigger-grant.result:
Update the result file.
mysql-test/t/trigger-grant.test:
Add test cases for BUG#15166 and BUG#15196
sql/item.cc:
Item_trigger_field: check appropriate (SELECT/UPDATE) privilege in fix_fields().
sql/item.h:
Add a flag to specify access type for trigger field.
sql/sql_trigger.cc:
"Special variable" technique of checking privileges for NEW/OLD variables
was replaced by checking table- and column-level privileges in
Item_trigger_field::fix_fields().
sql/sql_trigger.h:
"Special variable" technique of checking privileges for NEW/OLD variables
was replaced by checking table- and column-level privileges in
Item_trigger_field::fix_fields().
sql/sql_yacc.yy:
Specify access type for trigger fields.
Diffstat (limited to 'mysql-test/r/trigger-grant.result')
-rw-r--r-- | mysql-test/r/trigger-grant.result | 287 |
1 files changed, 184 insertions, 103 deletions
diff --git a/mysql-test/r/trigger-grant.result b/mysql-test/r/trigger-grant.result index 858cab7a04a..87e5e11d779 100644 --- a/mysql-test/r/trigger-grant.result +++ b/mysql-test/r/trigger-grant.result @@ -65,109 +65,6 @@ 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; @@ -229,3 +126,187 @@ 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. +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; +use mysqltest_db1; +CREATE TABLE t1(col CHAR(20)); +CREATE TABLE t2(col CHAR(20)); +CREATE TABLE t3(col CHAR(20)); +CREATE TABLE t4(col CHAR(20)); +CREATE USER mysqltest_u1@localhost; +REVOKE ALL PRIVILEGES, GRANT OPTION FROM mysqltest_u1@localhost; +GRANT SUPER ON *.* TO mysqltest_u1@localhost; +GRANT SELECT ON mysqltest_db1.t1 TO mysqltest_u1@localhost; +SET @mysqltest_var = NULL; + +---> connection: default +use mysqltest_db1; +REVOKE SELECT ON mysqltest_db1.t1 FROM mysqltest_u1@localhost; +GRANT DELETE ON mysqltest_db1.* TO mysqltest_u1@localhost; +SHOW GRANTS FOR mysqltest_u1@localhost; +Grants for mysqltest_u1@localhost +GRANT SUPER ON *.* TO 'mysqltest_u1'@'localhost' +GRANT DELETE ON `mysqltest_db1`.* TO 'mysqltest_u1'@'localhost' + +---> connection: bug15166_u1_con +use mysqltest_db1; +CREATE TRIGGER t1_trg_after_delete AFTER DELETE ON t1 +FOR EACH ROW +SET @mysqltest_var = 'Hello, world!'; + +---> connection: default +use mysqltest_db1; +GRANT UPDATE ON mysqltest_db1.t1 TO mysqltest_u1@localhost; +GRANT UPDATE ON mysqltest_db1.t2 TO mysqltest_u1@localhost; +GRANT UPDATE(col) ON mysqltest_db1.t3 TO mysqltest_u1@localhost; +GRANT UPDATE(col) ON mysqltest_db1.t4 TO mysqltest_u1@localhost; + +---> connection: bug15166_u1_con +use mysqltest_db1; +CREATE TRIGGER t1_trg_err_1 BEFORE INSERT ON t1 +FOR EACH ROW +SET @mysqltest_var = NEW.col; +DROP TRIGGER t1_trg_err_1; +CREATE TRIGGER t1_trg_err_2 BEFORE DELETE ON t1 +FOR EACH ROW +SET @mysqltest_var = OLD.col; +DROP TRIGGER t1_trg_err_2; +CREATE TRIGGER t2_trg_before_insert BEFORE INSERT ON t2 +FOR EACH ROW +SET NEW.col = 't2_trg_before_insert'; +CREATE TRIGGER t3_trg_err_1 BEFORE INSERT ON t3 +FOR EACH ROW +SET @mysqltest_var = NEW.col; +DROP TRIGGER t3_trg_err_1; +CREATE TRIGGER t3_trg_err_2 BEFORE DELETE ON t3 +FOR EACH ROW +SET @mysqltest_var = OLD.col; +DROP TRIGGER t3_trg_err_2; +CREATE TRIGGER t4_trg_before_insert BEFORE INSERT ON t4 +FOR EACH ROW +SET NEW.col = 't4_trg_before_insert'; + +---> connection: default +use mysqltest_db1; +REVOKE UPDATE ON mysqltest_db1.t1 FROM mysqltest_u1@localhost; +REVOKE UPDATE ON mysqltest_db1.t2 FROM mysqltest_u1@localhost; +GRANT SELECT ON mysqltest_db1.t1 TO mysqltest_u1@localhost; +GRANT SELECT ON mysqltest_db1.t2 TO mysqltest_u1@localhost; +REVOKE UPDATE(col) ON mysqltest_db1.t3 FROM mysqltest_u1@localhost; +REVOKE UPDATE(col) ON mysqltest_db1.t4 FROM mysqltest_u1@localhost; +GRANT SELECT(col) on mysqltest_db1.t3 TO mysqltest_u1@localhost; +GRANT SELECT(col) on mysqltest_db1.t4 TO mysqltest_u1@localhost; + +---> connection: bug15166_u1_con +use mysqltest_db1; +CREATE TRIGGER t1_trg_after_insert AFTER INSERT ON t1 +FOR EACH ROW +SET @mysqltest_var = NEW.col; +CREATE TRIGGER t1_trg_after_update AFTER UPDATE ON t1 +FOR EACH ROW +SET @mysqltest_var = OLD.col; +CREATE TRIGGER t2_trg_err_1 BEFORE UPDATE ON t2 +FOR EACH ROW +SET NEW.col = 't2_trg_err_1'; +DROP TRIGGER t2_trg_err_1; +CREATE TRIGGER t2_trg_err_2 BEFORE UPDATE ON t2 +FOR EACH ROW +SET NEW.col = CONCAT(OLD.col, '(updated)'); +DROP TRIGGER t2_trg_err_2; +CREATE TRIGGER t3_trg_after_insert AFTER INSERT ON t3 +FOR EACH ROW +SET @mysqltest_var = NEW.col; +CREATE TRIGGER t3_trg_after_update AFTER UPDATE ON t3 +FOR EACH ROW +SET @mysqltest_var = OLD.col; +CREATE TRIGGER t4_trg_err_1 BEFORE UPDATE ON t4 +FOR EACH ROW +SET NEW.col = 't4_trg_err_1'; +DROP TRIGGER t4_trg_err_1; +CREATE TRIGGER t4_trg_err_2 BEFORE UPDATE ON t4 +FOR EACH ROW +SET NEW.col = CONCAT(OLD.col, '(updated)'); +DROP TRIGGER t4_trg_err_2; + +---> connection: default +use mysqltest_db1; +REVOKE SELECT ON mysqltest_db1.t1 FROM mysqltest_u1@localhost; +REVOKE SELECT ON mysqltest_db1.t2 FROM mysqltest_u1@localhost; +GRANT UPDATE ON mysqltest_db1.t1 TO mysqltest_u1@localhost; +GRANT UPDATE ON mysqltest_db1.t2 TO mysqltest_u1@localhost; +REVOKE SELECT(col) ON mysqltest_db1.t3 FROM mysqltest_u1@localhost; +REVOKE SELECT(col) ON mysqltest_db1.t4 FROM mysqltest_u1@localhost; +GRANT UPDATE(col) ON mysqltest_db1.t3 TO mysqltest_u1@localhost; +GRANT UPDATE(col) ON mysqltest_db1.t4 TO mysqltest_u1@localhost; +INSERT INTO t1 VALUES('line1'); +ERROR 42000: SELECT command denied to user 'mysqltest_u1'@'localhost' for column 'col' in table 't1' +SELECT * FROM t1; +col +line1 +SELECT @mysqltest_var; +@mysqltest_var +NULL +INSERT INTO t2 VALUES('line2'); +SELECT * FROM t2; +col +t2_trg_before_insert +INSERT INTO t3 VALUES('t3_line1'); +ERROR 42000: SELECT command denied to user 'mysqltest_u1'@'localhost' for column 'col' in table 't3' +SELECT * FROM t3; +col +t3_line1 +SELECT @mysqltest_var; +@mysqltest_var +NULL +INSERT INTO t4 VALUES('t4_line2'); +SELECT * FROM t4; +col +t4_trg_before_insert + +---> connection: default +use mysqltest_db1; +REVOKE UPDATE ON mysqltest_db1.t1 FROM mysqltest_u1@localhost; +REVOKE UPDATE ON mysqltest_db1.t2 FROM mysqltest_u1@localhost; +GRANT SELECT ON mysqltest_db1.t1 TO mysqltest_u1@localhost; +GRANT SELECT ON mysqltest_db1.t2 TO mysqltest_u1@localhost; +REVOKE UPDATE(col) ON mysqltest_db1.t3 FROM mysqltest_u1@localhost; +REVOKE UPDATE(col) ON mysqltest_db1.t4 FROM mysqltest_u1@localhost; +GRANT SELECT(col) ON mysqltest_db1.t3 TO mysqltest_u1@localhost; +GRANT SELECT(col) ON mysqltest_db1.t4 TO mysqltest_u1@localhost; +INSERT INTO t1 VALUES('line3'); +SELECT * FROM t1; +col +line1 +line3 +SELECT @mysqltest_var; +@mysqltest_var +line3 +INSERT INTO t2 VALUES('line4'); +ERROR 42000: UPDATE command denied to user 'mysqltest_u1'@'localhost' for column 'col' in table 't2' +SELECT * FROM t2; +col +t2_trg_before_insert +INSERT INTO t3 VALUES('t3_line2'); +SELECT * FROM t3; +col +t3_line1 +t3_line2 +SELECT @mysqltest_var; +@mysqltest_var +t3_line2 +INSERT INTO t4 VALUES('t4_line2'); +ERROR 42000: UPDATE command denied to user 'mysqltest_u1'@'localhost' for column 'col' in table 't4' +SELECT * FROM t4; +col +t4_trg_before_insert +DELETE FROM t1; +SELECT @mysqltest_var; +@mysqltest_var +Hello, world! +DROP USER mysqltest_u1@localhost; +DROP DATABASE mysqltest_db1; |