授予用户仅查看MySQL视图的权限,而不允许其他任何操作。

40

这个问题最初使用的是MySQL 5.1.44,但也适用于MySQL 8.0+。

假设我有一个表,其中包含由应用程序的不同用户插入的记录。如何使特定用户只能看到该表中属于他/她的记录?我曾考虑过创建一个只包含他/她记录的 VIEW,但我不知道如何创建一个MySQL用户,使其只能看到那个 VIEW

所以,是否可能创建一个MySQL用户,只能访问单个 VIEW? 这个用户还能被设置为只读访问那个 VIEW 吗?

谢谢!

PS:在我的示例中,我所谓的“用户”实际上是希望使用自己的应用程序访问其记录的子公司。


如果视图没有触发器,它们就是只读的。 - Pentium10
1
为了使视图可更新,视图中的行与底层表中的行之间必须存在一对一的关系。还有一些其他结构会使视图不可更新。 - Naktibalda
5个回答

55

授予'someuser'@'somehost'对database1.view1的SELECT权限;


5
请注意,执行“创建视图”命令(即视图定义者)的用户也会对此产生影响。如果定义者与使用该视图的用户不同,则可能会导致相当混乱。例如,如果定义者只具有底层表的选择权限,而另一个用户则在视图上具有更新权限,则尝试更新视图将导致权限被拒绝的错误。 - Dominik Goltermann

17

此外

GRANT SELECT ON <database_name>.<view_name>
TO <user>@<host>

最好也这样做

GRANT SHOW VIEW
ON <database_name>.<view_name> TO <user>@<host>

这样许多SQL UI工具就可以获取视图定义,并适当地处理该视图。


1
GRANT 命令中没有 IDENTIFIED BY。https://dev.mysql.com/doc/refman/8.0/en/grant.html - QkiZ

6
GRANT SELECT ON <database name>.<view name>
TO <user>@<host> IDENTIFIED BY '<password>'

Source: MySQL Documentation


6

我相信原问题实际上是在询问如何将行限制为仅由给定用户拥有。 (创建每个用户的一个视图,然后仅授予该视图似乎是一种解决方法。)

您可以通过将user()引用插入到数据表中,然后对其进行过滤来实现此目的。

使用MySQL 5.6。创建一个视图,将SELECT限制为仅记录当前用户拥有的记录:

-- check the current user
select user();

create table t1 (myId int, mydata varchar(200), myName varchar(200));

insert t1 select 1, 'my data yes', user();
insert t1 select 2, 'my data yes2', user();
insert t1 select 3, 'my data no', 'joe';

select * from t1;

create or replace view v1 AS
select * from t1 where myName = user();

select * from v1;

0

如果您想使视图只读,我猜您是这样想的。那么,您应该使用ALGORITHM = TEMPTABLE子句创建视图。

这将使视图只读,因为它必须创建一个临时表。

另一种实现只读的方法(这取决于您的数据)是添加聚合函数。例如,如果您有一个基于表并显示所有列的视图,则可以在选择中添加DISTINCT。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接