1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194
|
#
# WL#11864 Implement I_S.VIEW_TABLE_USAGE and I_S.VIEW_ROUTINE_USAGE
#
# Basic schema definition used by test cases.
CREATE DATABASE db1;
USE db1;
CREATE TABLE t1 (c1 INT);
CREATE FUNCTION f1() RETURNS INT RETURN 1;
CREATE FUNCTION f2() RETURNS INT RETURN 2;
CREATE VIEW v1 AS SELECT f1() AS f1;
CREATE VIEW v2 AS SELECT f1, f2() AS f2 FROM v1;
CREATE VIEW v3 AS SELECT c1, f2 FROM t1, v2;
# Case 1: Show table and views used by view v2 and v3.
SELECT * FROM INFORMATION_SCHEMA.VIEW_TABLE_USAGE
WHERE VIEW_SCHEMA='db1' ORDER BY VIEW_NAME, TABLE_NAME;
VIEW_CATALOG VIEW_SCHEMA VIEW_NAME TABLE_CATALOG TABLE_SCHEMA TABLE_NAME
def db1 v2 def db1 v1
def db1 v3 def db1 t1
def db1 v3 def db1 v2
# Case 2: Show routines used by views.
SELECT * FROM INFORMATION_SCHEMA.VIEW_ROUTINE_USAGE
WHERE TABLE_SCHEMA='db1';
TABLE_CATALOG TABLE_SCHEMA TABLE_NAME SPECIFIC_CATALOG SPECIFIC_SCHEMA SPECIFIC_NAME
def db1 v1 def db1 f1
def db1 v2 def db1 f2
# Case 3: Rename the column of t1 and list view dependency.
# The query should throw warning on view v3.
ALTER TABLE t1 RENAME COLUMN c1 TO c2;
SELECT * FROM INFORMATION_SCHEMA.VIEW_TABLE_USAGE
WHERE VIEW_SCHEMA='db1' AND VIEW_NAME='v3';
VIEW_CATALOG VIEW_SCHEMA VIEW_NAME TABLE_CATALOG TABLE_SCHEMA TABLE_NAME
def db1 v3 def db1 t1
def db1 v3 def db1 v2
Warnings:
Warning 1356 View 'db1.v3' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them
ALTER TABLE t1 RENAME COLUMN c2 TO c1;
SELECT * FROM INFORMATION_SCHEMA.VIEW_TABLE_USAGE
WHERE VIEW_SCHEMA='db1' AND VIEW_NAME='v3';
VIEW_CATALOG VIEW_SCHEMA VIEW_NAME TABLE_CATALOG TABLE_SCHEMA TABLE_NAME
def db1 v3 def db1 t1
def db1 v3 def db1 v2
# Case 4: Drop function f1 and list dependency.
# The query should throw warning on view v1.
DROP FUNCTION f1;
SELECT * FROM INFORMATION_SCHEMA.VIEW_ROUTINE_USAGE
WHERE TABLE_SCHEMA='db1' AND TABLE_NAME='v1';
TABLE_CATALOG TABLE_SCHEMA TABLE_NAME SPECIFIC_CATALOG SPECIFIC_SCHEMA SPECIFIC_NAME
Warnings:
Warning 1356 View 'db1.v1' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them
CREATE FUNCTION f1() RETURNS INT return 1;
SELECT * FROM INFORMATION_SCHEMA.VIEW_ROUTINE_USAGE
WHERE TABLE_SCHEMA='db1' AND TABLE_NAME='v1';
TABLE_CATALOG TABLE_SCHEMA TABLE_NAME SPECIFIC_CATALOG SPECIFIC_SCHEMA SPECIFIC_NAME
def db1 v1 def db1 f1
# Case 5: Access checks.
CREATE USER 'testuser'@'localhost';
# 5.1 Grant permission on v2, but not v1. VIEW_TABLE_USAGE will not
# list any entry because user has no permission on v1.
GRANT ALL ON db1.v2 TO 'testuser'@'localhost';
SELECT * FROM INFORMATION_SCHEMA.VIEW_TABLE_USAGE
WHERE VIEW_SCHEMA='db1' ORDER BY VIEW_NAME, TABLE_NAME;
VIEW_CATALOG VIEW_SCHEMA VIEW_NAME TABLE_CATALOG TABLE_SCHEMA TABLE_NAME
# 5.2 Give permission on v1 and that VIEW_TABLE_USAGE shows v2 entry.
GRANT ALL ON db1.v1 TO 'testuser'@'localhost';
SELECT * FROM INFORMATION_SCHEMA.VIEW_TABLE_USAGE
WHERE VIEW_SCHEMA='db1' ORDER BY VIEW_NAME, TABLE_NAME;
VIEW_CATALOG VIEW_SCHEMA VIEW_NAME TABLE_CATALOG TABLE_SCHEMA TABLE_NAME
def db1 v2 def db1 v1
# 5.3 VIEW_ROUTINE_USAGE does not list v1, as it have no grant on f1.
SELECT * FROM INFORMATION_SCHEMA.VIEW_ROUTINE_USAGE
WHERE TABLE_SCHEMA='db1';
TABLE_CATALOG TABLE_SCHEMA TABLE_NAME SPECIFIC_CATALOG SPECIFIC_SCHEMA SPECIFIC_NAME
# 5.4 Grant access to f1 and check that VIEW_ROUTINE_USAGE shows it.
GRANT EXECUTE ON FUNCTION db1.f1 TO 'testuser'@'localhost';
SELECT * FROM INFORMATION_SCHEMA.VIEW_ROUTINE_USAGE
WHERE TABLE_SCHEMA='db1';
TABLE_CATALOG TABLE_SCHEMA TABLE_NAME SPECIFIC_CATALOG SPECIFIC_SCHEMA SPECIFIC_NAME
def db1 v1 def db1 f1
# 5.5 Grant access on v3, see that dependency 't1' is not listed.
GRANT ALL ON db1.v3 TO 'testuser'@'localhost';
SELECT * FROM INFORMATION_SCHEMA.VIEW_TABLE_USAGE
WHERE VIEW_SCHEMA='db1' ORDER BY VIEW_NAME, TABLE_NAME;
VIEW_CATALOG VIEW_SCHEMA VIEW_NAME TABLE_CATALOG TABLE_SCHEMA TABLE_NAME
def db1 v2 def db1 v1
def db1 v3 def db1 v2
# 5.6 Grant access on t1, see that dependency 't1' is listed.
GRANT SELECT on db1.t1 TO 'testuser'@'localhost';
SELECT * FROM INFORMATION_SCHEMA.VIEW_TABLE_USAGE
WHERE VIEW_SCHEMA='db1' ORDER BY VIEW_NAME, TABLE_NAME;
VIEW_CATALOG VIEW_SCHEMA VIEW_NAME TABLE_CATALOG TABLE_SCHEMA TABLE_NAME
def db1 v2 def db1 v1
def db1 v3 def db1 t1
def db1 v3 def db1 v2
DROP USER 'testuser'@'localhost';
# Cleanup
DROP FUNCTION f1;
DROP FUNCTION f2;
DROP VIEW v1, v2, v3;
DROP TABLE t1;
# Case 6:
# 6.1 Rename table t1 to t2 and list view dependency.
# The query should throw warning on view v1.
CREATE TABLE t1 (c1 INT);
CREATE VIEW v1 AS SELECT c1 FROM t1;
SELECT * FROM INFORMATION_SCHEMA.VIEW_TABLE_USAGE
WHERE VIEW_SCHEMA='db1' ORDER BY VIEW_NAME, TABLE_NAME;
VIEW_CATALOG VIEW_SCHEMA VIEW_NAME TABLE_CATALOG TABLE_SCHEMA TABLE_NAME
def db1 v1 def db1 t1
RENAME TABLE t1 to t2;
SELECT * FROM INFORMATION_SCHEMA.VIEW_TABLE_USAGE
WHERE VIEW_SCHEMA='db1' ORDER BY VIEW_NAME, TABLE_NAME;
VIEW_CATALOG VIEW_SCHEMA VIEW_NAME TABLE_CATALOG TABLE_SCHEMA TABLE_NAME
def db1 v1 def db1 t1
Warnings:
Warning 1356 View 'db1.v1' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them
RENAME TABLE t2 to t1;
SELECT * FROM INFORMATION_SCHEMA.VIEW_TABLE_USAGE
WHERE VIEW_SCHEMA='db1' ORDER BY VIEW_NAME, TABLE_NAME;
VIEW_CATALOG VIEW_SCHEMA VIEW_NAME TABLE_CATALOG TABLE_SCHEMA TABLE_NAME
def db1 v1 def db1 t1
# 6.2 Drop table t1 and list view dependency.
DROP TABLE t1;
SELECT * FROM INFORMATION_SCHEMA.VIEW_TABLE_USAGE
WHERE VIEW_SCHEMA='db1' ORDER BY VIEW_NAME, TABLE_NAME;
VIEW_CATALOG VIEW_SCHEMA VIEW_NAME TABLE_CATALOG TABLE_SCHEMA TABLE_NAME
def db1 v1 def db1 t1
Warnings:
Warning 1356 View 'db1.v1' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them
DROP VIEW v1;
# Case 7: List dependent table and function names
# that are permitted to the current user.
CREATE USER testuser1@localhost;
GRANT CREATE ON db1.* TO testuser1@localhost;
GRANT SELECT ON db1.* TO testuser1@localhost;
GRANT CREATE VIEW ON db1.* TO testuser1@localhost;
GRANT CREATE ROUTINE ON db1.* TO testuser1@localhost;
GRANT DROP ON db1.* TO testuser1@localhost;
CREATE USER testuser2@localhost;
GRANT CREATE ON db1.* TO testuser2@localhost;
GRANT SELECT ON db1.* TO testuser2@localhost;
GRANT CREATE VIEW ON db1.* TO testuser2@localhost;
GRANT CREATE ROUTINE ON db1.* TO testuser2@localhost;
GRANT DROP ON db1.* TO testuser2@localhost;
CREATE TABLE t1(c1 INT);
CREATE VIEW v1 AS SELECT c1 FROM t1;
CREATE FUNCTION f1() RETURNS INT RETURN 1;
CREATE VIEW v2 AS SELECT f1();
CREATE TABLE t2(c1 INT);
CREATE VIEW v3 AS SELECT c1 FROM t2;
CREATE FUNCTION f2() RETURNS INT RETURN 1;
CREATE VIEW v4 AS SELECT f2();
SELECT * FROM INFORMATION_SCHEMA.VIEW_TABLE_USAGE
WHERE VIEW_SCHEMA='db1' ORDER BY VIEW_NAME, TABLE_NAME;
VIEW_CATALOG VIEW_SCHEMA VIEW_NAME TABLE_CATALOG TABLE_SCHEMA TABLE_NAME
def db1 v1 def db1 t1
SELECT * FROM INFORMATION_SCHEMA.VIEW_ROUTINE_USAGE
WHERE TABLE_SCHEMA='db1';
TABLE_CATALOG TABLE_SCHEMA TABLE_NAME SPECIFIC_CATALOG SPECIFIC_SCHEMA SPECIFIC_NAME
def db1 v2 def db1 f1
SELECT * FROM INFORMATION_SCHEMA.VIEW_TABLE_USAGE
WHERE VIEW_SCHEMA='db1' ORDER BY VIEW_NAME, TABLE_NAME;
VIEW_CATALOG VIEW_SCHEMA VIEW_NAME TABLE_CATALOG TABLE_SCHEMA TABLE_NAME
def db1 v3 def db1 t2
SELECT * FROM INFORMATION_SCHEMA.VIEW_ROUTINE_USAGE
WHERE TABLE_SCHEMA='db1';
TABLE_CATALOG TABLE_SCHEMA TABLE_NAME SPECIFIC_CATALOG SPECIFIC_SCHEMA SPECIFIC_NAME
def db1 v4 def db1 f2
DROP VIEW v1,v2;
DROP FUNCTION f1;
DROP TABLE t1;
DROP VIEW v3,v4;
DROP FUNCTION f2;
DROP TABLE t2;
DROP USER testuser1@localhost;
DROP USER testuser2@localhost;
# Case 8: Revoke view privilege
CREATE USER testuser1@localhost;
CREATE TABLE t1(c1 INT);
CREATE VIEW v1 AS SELECT c1 FROM t1;
GRANT ALL ON db1.v1 TO testuser1@localhost;
GRANT ALL ON db1.t1 TO testuser1@localhost;
SELECT * FROM INFORMATION_SCHEMA.VIEW_TABLE_USAGE
WHERE VIEW_SCHEMA='db1' ORDER BY VIEW_NAME, TABLE_NAME;
VIEW_CATALOG VIEW_SCHEMA VIEW_NAME TABLE_CATALOG TABLE_SCHEMA TABLE_NAME
def db1 v1 def db1 t1
REVOKE ALL ON db1.v1 FROM testuser1@localhost;
SELECT * FROM INFORMATION_SCHEMA.VIEW_TABLE_USAGE
WHERE VIEW_SCHEMA='db1' ORDER BY VIEW_NAME, TABLE_NAME;
VIEW_CATALOG VIEW_SCHEMA VIEW_NAME TABLE_CATALOG TABLE_SCHEMA TABLE_NAME
REVOKE ALL ON db1.t1 FROM testuser1@localhost;
DROP USER testuser1@localhost;
DROP VIEW v1;
DROP TABLE t1;
DROP DATABASE db1;
|