#
# Test DENY representation as JSON in mysql.global_priv table
#
SET @q_show_denies =
'SELECT User, Host,
JSON_PRETTY(JSON_EXTRACT(Priv, '' $.denies'' )) AS denies_pretty
FROM mysql.global_priv
WHERE JSON_LENGTH(JSON_EXTRACT(Priv, '' $.denies'' )) > 0
ORDER BY User, Host';
PREPARE show_denies FROM @q_show_denies;
CREATE USER u;
CREATE DATABASE d;
DENY SELECT,INSERT ON mysql.* TO u;
DENY UPDATE ON d.* TO u;
EXECUTE show_denies;
User Host denies_pretty
u % [
{
"type" : "db" ,
"db" : "mysql" ,
"bits" : 3
},
{
"type" : "db" ,
"db" : "d" ,
"bits" : 4
}
]
REVOKE DENY SELECT ON mysql.* FROM u;
EXECUTE show_denies;
User Host denies_pretty
u % [
{
"type" : "db" ,
"db" : "mysql" ,
"bits" : 2
},
{
"type" : "db" ,
"db" : "d" ,
"bits" : 4
}
]
REVOKE DENY INSERT ON mysql.* FROM u;
EXECUTE show_denies;
User Host denies_pretty
u % [
{
"type" : "db" ,
"db" : "d" ,
"bits" : 4
}
]
REVOKE DENY UPDATE ON d.* FROM u;
EXECUTE show_denies;
User Host denies_pretty
# Table level
DENY SELECT,INSERT ON mysql.global_priv TO u;
EXECUTE show_denies;
User Host denies_pretty
u % [
{
"type" : "table" ,
"db" : "mysql" ,
"table" : "global_priv" ,
"bits" : 3
}
]
REVOKE DENY INSERT,SELECT ON mysql.global_priv FROM u;
EXECUTE show_denies;
User Host denies_pretty
DENY SELECT(USER) ON mysql.global_priv TO u;
EXECUTE show_denies;
User Host denies_pretty
u % [
{
"type" : "column" ,
"db" : "mysql" ,
"table" : "global_priv" ,
"column" : "USER" ,
"bits" : 1
}
]
DENY UPDATE(USER) ON mysql.global_priv TO u;
EXECUTE show_denies;
User Host denies_pretty
u % [
{
"type" : "column" ,
"db" : "mysql" ,
"table" : "global_priv" ,
"column" : "USER" ,
"bits" : 5
}
]
DENY SELECT ON *.* TO u;
EXECUTE show_denies;
User Host denies_pretty
u % [
{
"type" : "column" ,
"db" : "mysql" ,
"table" : "global_priv" ,
"column" : "USER" ,
"bits" : 5
},
{
"type" : "global" ,
"bits" : 1
}
]
CREATE TABLE sensitive_data (
id INT,
public_info VARCHAR(50 ),
salary DECIMAL(10 ,2 ),
ssn VARCHAR(11 ),
address VARCHAR(100 )
);
DENY SELECT(salary,ssn) ON sensitive_data TO u;
EXECUTE show_denies;
User Host denies_pretty
u % [
{
"type" : "column" ,
"db" : "mysql" ,
"table" : "global_priv" ,
"column" : "USER" ,
"bits" : 5
},
{
"type" : "global" ,
"bits" : 1
},
{
"type" : "column" ,
"db" : "test" ,
"table" : "sensitive_data" ,
"column" : "salary" ,
"bits" : 1
},
{
"type" : "column" ,
"db" : "test" ,
"table" : "sensitive_data" ,
"column" : "ssn" ,
"bits" : 1
}
]
GRANT ALL PRIVILEGES on *.* TO u WITH GRANT OPTION;
REVOKE ALL PRIVILEGES, GRANT OPTION FROM u;
# REVOKE ALL PRIVILEGES clears DENY entries
SHOW GRANTS FOR u;
Grants for u@%
GRANT USAGE ON *.* TO `u`@`%`
# END SHOW GRANTS
EXECUTE show_denies;
User Host denies_pretty
#
# Identifiers that require JSON escaping (double-quotes, backslash, etc.)
#
CREATE DATABASE `a"b\c`;
CREATE TABLE `a"b\c`.`t" 1 ` (
`col"x` INT,
normal_col INT
);
DENY SELECT ON `a"b\c`.* TO u;
EXECUTE show_denies;
User Host denies_pretty
u % [
{
"type" : "db" ,
"db" : "a\" b\\c",
"bits" : 1
}
]
DENY INSERT ON `a"b\c`.`t" 1 ` TO u;
EXECUTE show_denies;
User Host denies_pretty
u % [
{
"type" : "db" ,
"db" : "a\" b\\c",
"bits" : 1
},
{
"type" : "table" ,
"db" : "a\" b\\c",
"table" : "t\" 1 ",
"bits" : 2
}
]
DENY UPDATE(`col"x`) ON `a" b\c`.`t"1` TO u;
EXECUTE show_denies;
User Host denies_pretty
u % [
{
"type" : "db" ,
"db" : "a\" b\\c",
"bits" : 1
},
{
"type" : "table" ,
"db" : "a\" b\\c",
"table" : "t\" 1 ",
"bits" : 2
},
{
"type" : "column" ,
"db" : "a\" b\\c",
"table" : "t\" 1 ",
"column" : "col\" x",
"bits" : 4
}
]
# Verify SHOW GRANTS round-trips the special names
SHOW GRANTS FOR u;
Grants for u@%
GRANT USAGE ON *.* TO `u`@`%`
DENY SELECT ON `a"b\c`.* TO `u`@`%`
DENY INSERT, UPDATE (`col"x`) ON `a" b\c`.`t"1` TO `u`@`%`
# Verify REVOKE works with the special names
REVOKE DENY UPDATE(`col"x`) ON `a" b\c`.`t"1` FROM u;
EXECUTE show_denies;
User Host denies_pretty
u % [
{
"type" : "db" ,
"db" : "a\" b\\c",
"bits" : 1
},
{
"type" : "table" ,
"db" : "a\" b\\c",
"table" : "t\" 1 ",
"bits" : 2
}
]
REVOKE DENY INSERT ON `a"b\c`.`t" 1 ` FROM u;
REVOKE DENY SELECT ON `a"b\c`.* FROM u;
EXECUTE show_denies;
User Host denies_pretty
DROP TABLE `a"b\c`.`t" 1 `;
DROP DATABASE `a"b\c`;
DEALLOCATE PREPARE show_denies;
DROP USER u;
DROP DATABASE d;
DROP TABLE sensitive_data;
Messung V0.5 in Prozent C=80 H=100 G=90
¤ Dauer der Verarbeitung: 0.8 Sekunden
(vorverarbeitet am 2026-10-08)
¤
*© Formatika GbR, Deutschland