MySQL 5.6.14 Source Code Document
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
is_triggers.inc
1 # suite/funcs_1/datadict/is_triggers.inc
2 #
3 # Check the layout of information_schema.triggers and the impact of
4 # CREATE/ALTER/DROP TABLE/VIEW/SCHEMA ... on it.
5 #
6 # Note:
7 # This test is not intended
8 # - to show information about the all time existing triggers
9 # (there are no in the moment) within the databases information_schema
10 # and mysql
11 # - for checking storage engine properties
12 # Therefore please do not alter $engine_type and $other_engine_type.
13 #
14 # Author:
15 # 2008-01-23 mleich WL#4203 Reorganize and fix the data dictionary tests of
16 # testsuite funcs_1
17 # Create this script based on older scripts and new code.
18 # Last Change:
19 # 2008-06-11 mleich Move t/is_triggers.test to this file and
20 # create variants for embedded/non embedded server.
21 #
22 
23 let $engine_type = MEMORY;
24 let $other_engine_type = MyISAM;
25 
26 let $is_table = TRIGGERS;
27 
28 # The table INFORMATION_SCHEMA.TRIGGERS must exist
29 eval SHOW TABLES FROM information_schema LIKE '$is_table';
30 
31 --echo #######################################################################
32 --echo # Testcase 3.2.1.1: INFORMATION_SCHEMA tables can be queried via SELECT
33 --echo #######################################################################
34 # Ensure that every INFORMATION_SCHEMA table can be queried with a SELECT
35 # statement, just as if it were an ordinary user-defined table.
36 #
37 --source suite/funcs_1/datadict/is_table_query.inc
38 
39 
40 --echo #########################################################################
41 --echo # Testcase 3.2.12.1: INFORMATION_SCHEMA.TRIGGERS layout
42 --echo #########################################################################
43 # Ensure that the INFORMATION_SCHEMA.TRIGGERS table has the following columns,
44 # in the following order:
45 #
46 # TRIGGER_CATALOG NULL
47 # TRIGGER_SCHEMA name of the database in which the trigger occurs
48 # TRIGGER_NAME
49 # EVENT_MANIPULATION event associated with the trigger
50 # ('INSERT', 'DELETE', or 'UPDATE')
51 # EVENT_OBJECT_CATALOG NULL
52 # EVENT_OBJECT_SCHEMA database in which the table associated with the
53 # trigger occurs
54 # EVENT_OBJECT_TABLE name of the table associated with the trigger
55 # ACTION_ORDER 0
56 # ACTION_CONDITION NULL
57 # ACTION_STATEMENT
58 # ACTION_ORIENTATION ROW
59 # ACTION_TIMING 'BEFORE' or 'AFTER'
60 # ACTION_REFERENCE_OLD_TABLE NULL
61 # ACTION_REFERENCE_NEW_TABLE NULL
62 # ACTION_REFERENCE_OLD_ROW OLD
63 # ACTION_REFERENCE_NEW_ROW NEW
64 # CREATED NULL (0)
65 # SQL_MODE server SQL mode that was in effect at the time
66 # when the trigger was created
67 # (also used during trigger execution)
68 # DEFINER who defined the trigger
69 #
70 --source suite/funcs_1/datadict/datadict_bug_12777.inc
71 eval DESCRIBE information_schema.$is_table;
72 --source suite/funcs_1/datadict/datadict_bug_12777.inc
73 eval SHOW CREATE TABLE information_schema.$is_table;
74 --source suite/funcs_1/datadict/datadict_bug_12777.inc
75 eval SHOW COLUMNS FROM information_schema.$is_table;
76 
77 
78 # Note: Retrieval of information within information_schema.columns about
79 # information_schema.tables is in is_columns_is.test.
80 
81 # Show that several columns are always NULL.
82 SELECT * FROM information_schema.triggers
83 WHERE trigger_catalog IS NOT NULL OR event_object_catalog IS NOT NULL
84  OR action_condition IS NOT NULL OR action_reference_old_table IS NOT NULL
85  OR action_reference_new_table IS NOT NULL;
86 
87 
88 --echo ##################################################################################
89 --echo # Testcase 3.2.18.2 + 3.2.18.3: INFORMATION_SCHEMA.TRIGGERS accessible information
90 --echo ##################################################################################
91 # 3.2.18.2: Ensure that the table shows the relevant information on every
92 # trigger on which the current user or PUBLIC has privileges.
93 # 3.2.18.3: Ensure that the table does not show any information on any trigger
94 # on which the current user and public have no privileges.
95 # The SUPER (before 5.1.22) or TRIGGER (since 5.1.22) privilege is required for
96 # - creation of triggers
97 # - retrieval in INFORMATION_SCHEMA.TRIGGERS (affects size of result set)
98 #
99 --disable_warnings
100 DROP DATABASE IF EXISTS db_datadict;
101 --enable_warnings
102 CREATE DATABASE db_datadict;
103 --error 0,ER_CANNOT_USER
104 DROP USER 'testuser1'@'localhost';
105 CREATE USER 'testuser1'@'localhost';
106 --error 0,ER_CANNOT_USER
107 DROP USER 'testuser2'@'localhost';
108 CREATE USER 'testuser2'@'localhost';
109 --error 0,ER_CANNOT_USER
110 DROP USER 'testuser3'@'localhost';
111 CREATE USER 'testuser3'@'localhost';
112 --error 0,ER_CANNOT_USER
113 DROP USER 'testuser4'@'localhost';
114 CREATE USER 'testuser4'@'localhost';
115 
116 GRANT TRIGGER ON *.* TO 'testuser1'@'localhost';
117 GRANT TRIGGER ON *.* TO 'testuser3'@'localhost';
118 GRANT TRIGGER ON *.* TO 'testuser4'@'localhost';
119 GRANT ALL ON db_datadict.* TO 'testuser1'@'localhost' WITH GRANT OPTION;
120 
121 let $my_select = SELECT * FROM information_schema.triggers
122 WHERE trigger_name = 'trg1';
123 let $my_show = SHOW TRIGGERS FROM db_datadict;
124 --echo # Establish connection testuser1 (user=testuser1)
125 --replace_result $MASTER_MYPORT MYSQL_PORT $MASTER_MYSOCK MYSQL_SOCK
126 connect (testuser1, localhost, testuser1, , db_datadict);
127 --replace_result $engine_type <engine_type>
128 eval
129 CREATE TABLE db_datadict.t1 (f1 INT, f2 INT, f3 INT)
130 ENGINE = $engine_type;
131 CREATE TRIGGER trg1 BEFORE INSERT
132 ON db_datadict.t1 FOR EACH ROW SET @test_before = 2, new.f1 = @test_before;
133 GRANT ALL ON db_datadict.t1 TO 'testuser2'@'localhost';
134 REVOKE TRIGGER ON db_datadict.t1 FROM 'testuser2'@'localhost';
135 GRANT SELECT ON db_datadict.t1 TO 'testuser3'@'localhost';
136 eval $my_select;
137 eval $my_show;
138 
139 --echo # Establish connection testuser2 (user=testuser2)
140 --replace_result $MASTER_MYPORT MYSQL_PORT $MASTER_MYSOCK MYSQL_SOCK
141 connect (testuser2, localhost, testuser2, , db_datadict);
142 SHOW GRANTS FOR 'testuser2'@'localhost';
143 --echo # No TRIGGER Privilege --> no result for query
144 eval $my_select;
145 eval $my_show;
146 
147 --echo # Establish connection testuser3 (user=testuser3)
148 --replace_result $MASTER_MYPORT MYSQL_PORT $MASTER_MYSOCK MYSQL_SOCK
149 connect (testuser3, localhost, testuser3, , test);
150 SHOW GRANTS FOR 'testuser3'@'localhost';
151 --echo # TRIGGER Privilege + SELECT Privilege on t1 --> result for query
152 eval $my_select;
153 eval $my_show;
154 
155 --echo # Establish connection testuser4 (user=testuser4)
156 --replace_result $MASTER_MYPORT MYSQL_PORT $MASTER_MYSOCK MYSQL_SOCK
157 connect (testuser4, localhost, testuser4, , test);
158 SHOW GRANTS FOR 'testuser4'@'localhost';
159 --echo # TRIGGER Privilege + no SELECT Privilege on t1 --> result for query
160 --disable_abort_on_error
161 SELECT * FROM db_datadict.t1;
162 DESC db_datadict.t1;
163 eval $my_select;
164 eval $my_show;
165 
166 --echo # Switch to connection default and close connections testuser1 - testuser4
167 connection default;
168 disconnect testuser1;
169 disconnect testuser2;
170 disconnect testuser3;
171 disconnect testuser4;
172 eval $my_select;
173 eval $my_show;
174 DROP USER 'testuser1'@'localhost';
175 DROP USER 'testuser2'@'localhost';
176 DROP USER 'testuser3'@'localhost';
177 DROP USER 'testuser4'@'localhost';
178 DROP DATABASE db_datadict;
179 
180 
181 --echo #########################################################################
182 --echo # 3.2.1.13+3.2.1.14+3.2.1.15: INFORMATION_SCHEMA.TRIGGERS modifications
183 --echo #########################################################################
184 # 3.2.1.13: Ensure that the creation of any new database object (e.g. table or
185 # column) automatically inserts all relevant information on that
186 # object into every appropriate INFORMATION_SCHEMA table.
187 # 3.2.1.14: Ensure that the alteration of any existing database object
188 # automatically updates all relevant information on that object in
189 # every appropriate INFORMATION_SCHEMA table.
190 # 3.2.1.15: Ensure that the dropping of any existing database object
191 # automatically deletes all relevant information on that object from
192 # every appropriate INFORMATION_SCHEMA table.
193 # FIXME: To be implemented
194 
195 
196 --echo ########################################################################
197 --echo # Testcases 3.2.1.3-3.2.1.5 + 3.2.1.8-3.2.1.12: INSERT/UPDATE/DELETE and
198 --echo # DDL on INFORMATION_SCHEMA tables are not supported
199 --echo ########################################################################
200 # 3.2.1.3: Ensure that no user may execute an INSERT statement on any
201 # INFORMATION_SCHEMA table.
202 # 3.2.1.4: Ensure that no user may execute an UPDATE statement on any
203 # INFORMATION_SCHEMA table.
204 # 3.2.1.5: Ensure that no user may execute a DELETE statement on any
205 # INFORMATION_SCHEMA table.
206 # 3.2.1.8: Ensure that no user may create an index on an
207 # INFORMATION_SCHEMA table.
208 # 3.2.1.9: Ensure that no user may alter the definition of an
209 # INFORMATION_SCHEMA table.
210 # 3.2.1.10: Ensure that no user may drop an INFORMATION_SCHEMA table.
211 # 3.2.1.11: Ensure that no user may move an INFORMATION_SCHEMA table to any
212 # other database.
213 # 3.2.1.12: Ensure that no user may directly add to, alter, or delete any data
214 # in an INFORMATION_SCHEMA table.
215 #
216 --disable_warnings
217 DROP DATABASE IF EXISTS db_datadict;
218 --enable_warnings
219 CREATE DATABASE db_datadict;
220 --replace_result $engine_type <engine_type>
221 eval
222 CREATE TABLE db_datadict.t1 (f1 BIGINT)
223 ENGINE = $engine_type;
224 CREATE TRIGGER db_datadict.trg1 BEFORE INSERT
225 ON db_datadict.t1 FOR EACH ROW SET @test_before = 2, new.f1 = @test_before;
226 
227 --error ER_DBACCESS_DENIED_ERROR
228 INSERT INTO information_schema.triggers
229 SELECT * FROM information_schema.triggers;
230 
231 --error ER_DBACCESS_DENIED_ERROR
232 UPDATE information_schema.triggers SET trigger_schema = 'test'
233 WHERE table_name = 't1';
234 
235 --error ER_DBACCESS_DENIED_ERROR
236 DELETE FROM information_schema.triggers WHERE trigger_name = 't1';
237 --error ER_DBACCESS_DENIED_ERROR
238 TRUNCATE information_schema.triggers;
239 
240 --error ER_DBACCESS_DENIED_ERROR
241 CREATE INDEX my_idx_on_triggers ON information_schema.triggers(trigger_schema);
242 
243 --error ER_DBACCESS_DENIED_ERROR
244 ALTER TABLE information_schema.triggers DROP PRIMARY KEY;
245 --error ER_DBACCESS_DENIED_ERROR
246 ALTER TABLE information_schema.triggers ADD f1 INT;
247 
248 --error ER_DBACCESS_DENIED_ERROR
249 DROP TABLE information_schema.triggers;
250 
251 --error ER_DBACCESS_DENIED_ERROR
252 ALTER TABLE information_schema.triggers RENAME db_datadict.triggers;
253 --error ER_DBACCESS_DENIED_ERROR
254 ALTER TABLE information_schema.triggers RENAME information_schema.xtriggers;
255 
256 # Cleanup
257 DROP DATABASE db_datadict;
258