我会展示它,可能需要进行一些编辑才能完成。因为我必须在底部附加控制台输出。
架构
create table users
( userId int auto_increment primary key,
userName varchar(100) not null
-- etc
);
insert users(userName) values ('Joe'),('Gertrude');
-- drop table secretdata;
create table SecretData
( id int auto_increment primary key,
userId int not null,
theKey varchar(100) not null,
theValue varchar(1000) not null,
key(userId),
CONSTRAINT fk_sd_users FOREIGN KEY (userId) REFERENCES users(userId)
);
insert secretdata(userId,theKey,theValue) values
(1,'FB Password','8*&Fjj_anchovieS'),
(1,'Proper response','I love the meal, just like I like it'),
(2,'thing7','goat');
视图
CREATE VIEW userSecrets AS
select u.userId,u.userName,s.theKey,s.theValue
from users u
join SecretData s
on s.userId=u.userId;
select * from userSecrets where userId=2; -- 目前在这里工作
注意我的数据库名称是so_gibberish。
以下是您要求授予查看权限的内容:
GRANT SELECT ON so_gibberish.userSecrets TO 'john'@'host';
↑ ↑ 如此配置的用户然后可以针对视图进行查询。 ↑ ↑
然而,
CREATE USER 'plebian2'@'localhost' IDENTIFIED BY 'mypass';
GRANT SELECT ON so_gibberish.userSecrets TO 'plebian2'@'localhost';
该用户确实有权使用视图,但没有直接访问基础表。
控制台输出:
OS Prompt>mysql -u plebian2 -p
Enter password: ******
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 938
Server version: 5.6.24-log MySQL Community Server (GPL)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| so_gibberish |
+--------------------+
2 rows in set (0.00 sec)
mysql> use so_gibberish;
Database changed
mysql> show tables;
+------------------------+
| Tables_in_so_gibberish |
+------------------------+
| usersecrets |
+------------------------+
1 row in set (0.00 sec)
mysql> select * from users;
ERROR 1142 (42000): SELECT command denied to user 'plebian2'@'localhost' for table 'users'
mysql> select * from usersecrets;
+--------+----------+-----------------+--------------------------------------+
| userId | userName | theKey | theValue |
+--------+----------+-----------------+--------------------------------------+
| 1 | Joe | FB Password | 8*&Fjj_anchovieS |
| 1 | Joe | Proper response | I love the meal, just like I like it |
| 2 | Gertrude | thing7 | goat |
+--------+----------+-----------------+--------------------------------------+
3 rows in set (0.00 sec)
最后,我希望看到标题为Access Control for Stored Programs and Views 的手册页,了解Definer 权限如何影响最终状态的有效权限。特别是,当定义者拥有比使用视图的用户帐户更少的权限时(这是一个相当奇怪的情况,但确实存在)。
角色
回应您在“答案”下的评论。
我基本上对 mysql 中缺少来自微软世界的嵌入角色感到不满。这意味着,有组成的角色,用户附加到角色,并且在角色级别(在 MSFT 世界中)执行授权。在那里,在 MSSQL 中,在每个创建任何块(存储过程等)的底部,将是我在角色级别进行授权的块。
所以进入 mysql,我必须创建该角色到用户映射。好消息,我只需要做一次。在我运行的块的末尾(如果存在删除/创建),它会调用直接操纵INFORMATION_SCHEMA.user_privileges 等。但在非常高的水平上,就像 MSFT 一样,最终结果就是我想要的。即授予的权限。
那是一整罐蠕虫。但没有它,祝你好运。
grant 等命令和其他一些命令可以在后台自行执行。他们几乎没有什么神圣之处。然而,它们的存在是为了保护新手程序员。而那些放弃那些警告标志说要小心的人往往会思考,
“我如何取回我的数据。我知道它在某个地方。也许我
我不应该在幕后做我刚刚做的事情”
但绝对是需要修补的东西,尤其是在一次性数据库中(你不关心的)。更好的是,在您不关心的 mysql 实例上执行此操作。因为我们在比数据库级别更高的级别讨论系统范围的影响。