我正在尝试创建一个新的临时用户,该用户只能访问所有视图以进行只读。
用户不必读取对表和存储过程的访问权。
我尝试了以下查询,但它也可以访问表格。
EXEC sp_addrolemember db_datareader, 'user1'
GRANT VIEW DATABASE STATE TO 'user1'
GRANT VIEW DEFINITION TO 'user1'
答案 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 访问这些对象。