SQL Server:授予对架构中所有视图的访问权限,但不授予对表的访问权限

mla*_*tis 6 sql-server

我在特定模式下的单个数据库中有表和视图。为简单起见,下面是一个示例:

  • [DBXYZ].[SCHEMAXYZ].[具有限制数据的表]
  • [DBXYZ].[SCHEMAXYZ].[SAFEVIEW1]
  • [DBXYZ].[SCHEMAXYZ].[SAFEVIEW2]

我想向特定用户组授予对模式“SCHEMAXYZ”中视图的 SELECT 访问权限,但不授予对表的 SELECT 访问权限。我不想授予对特定视图的访问权限,因为这意味着将来添加新视图时需要进行更多的管理维护。

我意识到一种选择就是简单地为视图使用不同的模式名称(例如“SCHEMAXYZ_VIEWS”),但这不是我的偏好。

这可能吗?

Joh*_*ner 10

需要将视图移动到不同的模式才能利用这种安全愚蠢的做法。

基本上,您可以GRANT SELECT对架构授予权限,但无法将权限SELECT仅限于视图。

正如您所确定的,解决方法是创建一个仅拥有相关视图的架构。该架构也由拥有表所在的基本架构的同一主体拥有,因此您的权限更容易管理。

下面是一个分解它的示例脚本:

-- Create Test Table
CREATE TABLE dbo.Test
(
      ID INT IDENTITY(1,1)
    , VALUE NVARCHAR(50)
)
GO

-- Test Data
INSERT INTO dbo.Test (VALUE)
VALUES
    ('blah'), ('blah'), ('blah'), ('yackity'), ('schmackity')
GO

-- Create Special Schema that will "Own" all the Views
CREATE SCHEMA viewSchema AUTHORIZATION dbo
GO

-- Create a new DB Role
CREATE ROLE db_viewreader
GO

-- Grant SELECT to all objects in the viewSchema schema to the new DB role
GRANT SELECT ON SCHEMA::viewSchema TO db_viewreader
GO

-- Create a View on top of the Test Table AFTER the role was
--  defined/created to show this applies to any new views made under this schema
CREATE VIEW viewSchema.testView 
AS
SELECT    ID
        , VALUE
  FROM dbo.Test
GO

-- Create a new Test User
CREATE USER testuser WITHOUT LOGIN
GO
ALTER ROLE db_viewreader ADD MEMBER testuser
GO


-- Execute the following block of code as the testuser account
EXECUTE AS USER = 'testuser'

    SELECT *
    FROM dbo.Test

    SELECT *
    FROM viewSchema.testView

-- Revert security context back to sa
REVERT;

-- Cleanup
ALTER ROLE [db_viewreader] DROP MEMBER [testuser]
DROP ROLE db_viewreader
DROP VIEW viewSchema.testView 
DROP SCHEMA viewSchema
DROP TABLE dbo.Test
DROP USER [testuser]
GO
Run Code Online (Sandbox Code Playgroud)

您的输出应如下所示,确认您无法从基表中进行选择,但从引用它的视图中进行选择时没有问题:

(5 row(s) affected)
Msg 229, Level 14, State 5, Line 58
The SELECT permission was denied on the object 'Test', database 'TestDB', schema 'dbo'.

(5 row(s) affected)
Run Code Online (Sandbox Code Playgroud)

这里的美妙之处在于,属于该db_viewreader角色一部分的任何用户都将SELECT有权访问您自动放入viewSchema架构中的任何新视图,这就是我假设您正在寻找的。