如何在 SQL Server 上创建一个数据库角色,其中该角色的用户只能从一个视图中选择,而不能从视图中使用的表中选择?
Posted
技术标签:
【中文标题】如何在 SQL Server 上创建一个数据库角色,其中该角色的用户只能从一个视图中选择,而不能从视图中使用的表中选择?【英文标题】:How to create a database role on SQL server where a user in that role can only select from one view, and not from the tables used in the view? 【发布时间】:2020-11-10 20:24:12 【问题描述】:我想创建一个角色,用户只能从 1 个单一视图中查看和选择,而不能从视图中使用的表中进行选择。
到目前为止我有这个代码:
use enterprise_product_prod
go
DECLARE @SQL NVARCHAR(3000)
DECLARE @RoleName NVARCHAR(100) = 'only_view_test2';
DECLARE @Schema NVARCHAR(100) = 'Ignite';
DECLARE @Name NVARCHAR(100) = 'GAN_Amounts';
DECLARE GrantExec_Cursor CURSOR FAST_FORWARD READ_ONLY
for
SELECT 'GRANT SELECT ON [' + @Schema + '].[' +
@Name + '] TO [' + @RoleName + ']; ' AS SQLstatement
FROM INFORMATION_SCHEMA.VIEWS
OPEN GrantExec_Cursor
FETCH NEXT FROM GrantExec_Cursor INTO @SQL
WHILE @@FETCH_STATUS = 0
BEGIN --Grant Permissions
EXEC(@SQL)
FETCH NEXT FROM GrantExec_Cursor INTO @SQL
END --Grant Permissions
CLOSE GrantExec_Cursor
DEALLOCATE GrantExec_Cursor
GO
它工作正常,如果我向这个角色添加一个测试用户,我只能看到视图“Ignite.Gan_amounts”,但是当我想在这个视图上运行一个简单的选择时,我得到以下错误:
对象“Tbl_FX”、数据库“ENTERPRISE_PRODUCT_PROD”、架构“SCLR”的 SELECT 权限被拒绝。
Tbl_FX 是视图中使用的表之一。
我如何才能使该角色的用户只能从该视图中查看和选择而不会出现此错误?我不希望他们能够从原始表格中进行选择。
【问题讨论】:
看看这里的第三种解决方案是否适合你,***.com/questions/368414/… 问题不在于你不能将阅读限制在视图中,而是你不能用视图来做到这一点跨模式而不会遇到问题。 【参考方案1】:您将需要一个表函数而不是视图,或者将视图放在表函数上。然后,该表函数应使用EXECUTE AS OWNER
子句,以便能够单独授予对该函数的执行权限。
这是一个基本的TVF,以所有者身份执行:
create function testTVF() returns @testTable table (a int)
with execute as owner as
begin
insert into @testTable select 1 a union all select 2 a;
return;
end;
go
我尝试创建内联 TVF,但以 An invalid option was specified for the statement "CREATE/ALTER FUNCTION"
失败
你不能只用视图来做到这一点。见Impersonation in SQL Server Views?。
【讨论】:
以上是关于如何在 SQL Server 上创建一个数据库角色,其中该角色的用户只能从一个视图中选择,而不能从视图中使用的表中选择?的主要内容,如果未能解决你的问题,请参考以下文章