如何授予用户访问SQL Server中的所有视图但不访问表和存储过程?

时间:2017-12-05 23:12:25

标签: sql sql-server-2012

我正在尝试创建一个新的临时用户,该用户只能访问所有视图以进行只读。

用户不必读取对表和存储过程的访问权。

我尝试了以下查询,但它也可以访问表格。

EXEC sp_addrolemember db_datareader, 'user1'

GRANT VIEW DATABASE STATE TO  'user1'
GRANT VIEW DEFINITION TO 'user1'

2 个答案:

答案 0 :(得分:1)

执行此操作的主要方法是仅向视图对象授予权限。您可以使用以下内容遍历数据库中的所有视图:

DECLARE @sql VARCHAR(MAX)

SELECT GrantStatement = 'GRANT SELECT ON ' + TABLE_NAME + ' TO user1'
INTO #grants
FROM
INFORMATION_SCHEMA.Views

WHILE EXISTS (SELECT 1 FROM #grants)
BEGIN
    SELECT TOP 1 @sql = GrantStatement
    FROM #grants

    EXEC (@sql)

    DELETE #grants
    WHERE GrantStatement = @sql
END

第二种技术是创建仅用于视图的单独模式,然后为整个模式授予权限。这可以这样做:

GRANT SELECT ON SCHEMA::ViewSchema TO user1

答案 1 :(得分:1)

您可以使用 DENY 功能阻止用户访问表和存储过程。例如:

DENY SELECT on tablename to user1;

当您将user1添加到db_datareader数据库角色时,他们将能够对数据库中的对象执行 SELECT 语句,除非您 DENY 访问这些对象。