【发布时间】: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 是视图中使用的表之一。
我如何才能使该角色的用户只能从该视图中查看和选择而不会出现此错误?我不希望他们能够从原始表格中进行选择。
【问题讨论】:
-
看看这里的第三种解决方案是否适合你,stackoverflow.com/questions/368414/… 问题不在于你不能将阅读限制在视图中,而是你不能用视图来做到这一点跨模式而不会遇到问题。
标签: sql sql-server database roles