授予用户权限以仅查看 MySQL 视图而不查看其他内容

Posted

技术标签:

【中文标题】授予用户权限以仅查看 MySQL 视图而不查看其他内容【英文标题】:Grant a user permission to only view a MySQL view and nothing else 【发布时间】:2011-03-07 17:22:33 【问题描述】:

这个问题原本是使用 mysql 5.1.44,但也适用于 MySQL 8.0+。

假设我有一个表,其中包含由我的应用程序的不同用户插入的记录。如何授予特定用户访问权限以仅查看他/她在该表中的记录?我想过用他/她的记录创建一个VIEW,但我不知道如何创建一个只能看到VIEW的MySQL用户。

那么,是否可以创建一个只能访问单个VIEW 的 MySQL 用户?是否也可以让该用户拥有对该VIEW 的只读访问权限?

谢谢!

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

【问题讨论】:

没有触发器的视图是只读的。 要使视图可更新,视图中的行与基础表中的行之间必须存在一对一的关系。还有某些其他构造使视图不可更新。 【参考方案1】:

GRANT SELECT ON database1.view1 TO 'someuser'@'somehost';

【讨论】:

请注意,发出创建视图命令的用户(称为视图定义器)对此也有影响。如果定义者!= 使用该视图的用户,那么这可能会很混乱。例如,如果定义者仅对基础表具有选择权限,而另一个用户对视图具有更新权限,则尝试更新视图将导致权限被拒绝错误。【参考方案2】:

另外

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

最好也这样做

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

以便很多 SQL UI 工具可以获取视图定义并为视图正常工作。

【讨论】:

GRANT 命令中没有IDENTIFIED BY。 dev.mysql.com/doc/refman/8.0/en/grant.html【参考方案3】:
GRANT SELECT ON <database name>.<view name>
TO <user>@<host> IDENTIFIED BY '<password>'

来源:MySQL Documentation

【讨论】:

【参考方案4】:

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

您可以通过将 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;

【讨论】:

【参考方案5】:

如果你想让视图只读,我怀疑你这样做。然后您应该使用 ALGORITHM = TEMPTABLE 子句创建视图。

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

另一种实现只读的方法(这取决于您的数据)是粘贴聚合函数。例如,如果您有一个基于表格并显示所有列的视图,那么您可以将 distinct 粘贴到选择上。

【讨论】:

以上是关于授予用户权限以仅查看 MySQL 视图而不查看其他内容的主要内容,如果未能解决你的问题,请参考以下文章

向 SQL Server 用户授予执行权限以仅运行特定作业

SQL Server中授予用户查看对象定义的权限

SQL Server中授予用户查看对象定义的权限

SQL Server中授予用户查看对象定义的权限

MySQL的安全设置

mysql怎么查看用户权限