如何在sql server上创建一个数据库角色,在该角色中的用户只能从一个视图中选择,而不能从视图中使用的表中选择?

kse8i1jr  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(323)

我想创建一个角色,用户只能从一个视图中查看和选择,而不能从视图中使用的表中选择。
到目前为止我有这个代码:

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\u amounts”视图,但是当我想在这个视图上运行一个简单的select时,会出现以下错误:
对象“tbl\u fx”、数据库“enterprise\u product\u prod”、架构“sclr”的select权限被拒绝。
tbl\u fx是视图中使用的表之一。
我如何才能达到这个角色的用户只能看到和选择这个视图而没有这个错误?我不希望他们能够从原始表中进行选择。

7nbnzgx9

7nbnzgx91#

您将需要一个表函数而不是视图,或者将视图放在表函数上。然后,该表函数应该使用 EXECUTE AS OWNER 子句,以便能够单独授予该函数的执行权限。
下面是一个以execute为所有者的基本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" 你不能光凭风景就这么做。请参见sql server视图中的模拟?。

相关问题