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

授予用户仅查看MySQL视图而不查看其他内容的权限,mysql,view,permissions,database-permissions,grant,Mysql,View,Permissions,Database Permissions,Grant,这个问题最初使用的是MySQL 5.1.44,但也适用于MySQL 8.0+ 假设我有一个表,其中记录由应用程序的不同用户插入。如何授予特定用户访问权限,使其只能查看该表中的记录?我考虑过用他/她的记录创建一个视图,但我不知道如何创建一个只能看到该视图的MySQL用户 那么,是否可以创建一个只能访问单个视图的MySQL用户?是否也可以使此用户以只读方式访问该视图 谢谢 注:在我的示例中,我所称的用户实际上是希望使用自己的应用程序访问其记录的附属办公室。将database1.view1上的SELE

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

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

那么,是否可以创建一个只能访问单个
视图的MySQL用户?是否也可以使此用户以只读方式访问该
视图

谢谢


注:在我的示例中,我所称的用户实际上是希望使用自己的应用程序访问其记录的附属办公室。

将database1.view1上的SELECT授予“someuser”@“somehost”

授权选择打开。
GRANT SELECT ON <database name>.<view name>
TO <user>@<host> IDENTIFIED BY '<password>'
由“”标识
资料来源:除此之外

GRANT SELECT ON <database_name>.<view_name>
TO <user>@<host>
GRANT选择打开。
到@
最好也这样做

GRANT SHOW VIEW
ON <database_name>.<view_name> TO <user>@<host>
GRANT SHOW视图
在…上到@

因此,许多SQL UI工具都可以获得视图定义,并适当地为视图工作。

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

可以通过将user()引用插入到数据表中,然后对其进行筛选来实现这一点

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

-- 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;

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

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


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

如果视图没有触发器,则它们是只读的。要使视图可更新,视图中的行与基础表中的行之间必须存在一对一的关系。还有一些其他构造使视图不可更新。请注意,发出create view命令(称为视图定义器)的用户也会对此产生影响。如果定义者!=使用该视图的用户可能会感到非常困惑。例如,如果定义人仅对基础表具有select权限,而另一个用户对视图具有update权限,则尝试更新视图将导致权限拒绝错误。在
GRANT
命令中没有由
标识的