【问题标题】:Give permissions to Create/Drop views only仅授予创建/删除视图的权限
【发布时间】:2022-11-14 13:17:29
【问题描述】:

我正在与

Microsoft SQL Server 2019 (RTM-GDR) - 15.0.2095.3 (X64) Apr 29 2022 18:00:13   
Copyright (C) 2019 Microsoft Corporation  
Standard Edition (64-bit) on Windows Server 2016 Datacenter 10.0 <X64> (Build 14393: ) (Hypervisor) 

我想仅授予用户对 CREATEDROP VIEWS 的权限,并拒绝对 CREATEDROP 表、模式或整个数据库的权限。

是否有可用的权限级别组合来实现此目的?到目前为止,我发现创建视图需要架构上的 ALTER 权限,但是这也为用户提供了我想要拒绝他们的操作的权限。

背景是我们希望授予用户对数据库的只读权限,但创建和删除视图除外。

【问题讨论】:

    标签: sql-server permissions create-view


    【解决方案1】:

    正如我在我的(现已删除的)cmets 中提到的,使用模式可能是这里更简单的解决方案。尽管您可以将USER 权限明确授予CREATEVIEW,但ALTER 不能是细粒度的。但是,您可以让他们访问特定模式,然后他们可以创建(和ALTER)他们认为合适的视图。这是一个演示该方法的“快速”示例:

    USE master;
    GO
    CREATE DATABASE TestDB;
    GO
    
    USE TestDB;
    GO
    CREATE TABLE dbo.YourTable (ID int IDENTITY(1,1) CONSTRAINT PK_YourTable PRIMARY KEY,
                                SomeInt int NOT NULL);
    GO
    
    CREATE TABLE dbo.AnotherTable (ID int IDENTITY  CONSTRAINT PK_AnotherTable PRIMARY KEY,
                                   YourID int NOT NULL CONSTRAINT FK_AnotherTable_YourID FOREIGN KEY REFERENCES dbo.YourTable(ID),
                                   SomeDate date NULL);
    GO
    
    INSERT INTO dbo.YourTable (SomeInt)
    VALUES(1),(17),(12),(1634),(-5);
    GO
    
    INSERT INTO dbo.AnotherTable (YourID,
                                  SomeDate)
    VALUES(1,GETDATE()),(1,'20220101'),
          (3,GETDATE()),
          (4,'20221001'),(4,'20221002'),(4,'20221003'),
          (5,'20221215'),(5,'20221015');
    GO
    
    GO
    
    CREATE SCHEMA V; --V for Vende.... View
    GO
    
    CREATE USER SomeUser WITHOUT LOGIN;
    GO
    
    GRANT ALTER, CONTROL,SELECT ON SCHEMA::V TO SomeUser;
    GRANT CREATE VIEW TO SomeUser;
    GO
    
    EXECUTE AS USER = 'SomeUser';
    GO
    --This will fail
    CREATE VIEW dbo.NoAccess AS
    
        SELECT ID,
               YourID,
               SomeDate
        FROM dbo.AnotherTable;
    GO
    SELECT *
    FROM dbo.NoAccess;
    GO
    --This'll work
    CREATE VIEW V.RelatedRows AS
    
        SELECT Y.ID AS YourID,
               Y.SomeInt,
               A.ID AS AnotherID,
               A.SomeDate
        FROM dbo.YourTable Y
             JOIN dbo.AnotherTable A ON Y.ID = A.YourID;
    GO
    SELECT *
    FROM V.RelatedRows;
    GO
    --Alter the View to a LEFT JOIN
    CREATE OR ALTER VIEW V.RelatedRows AS
    
        SELECT Y.ID AS YourID,
               Y.SomeInt,
               A.ID AS AnotherID,
               A.SomeDate
        FROM dbo.YourTable Y
             LEFT JOIN dbo.AnotherTable A ON Y.ID = A.YourID;
    GO
    
    --For this example, they also have no direct access to the tables; you may need to change this.
    SELECT *
    FROM dbo.YourTable;
    
    GO
    REVERT;
    
    GO
    USE master;
    GO
    DROP DATABASE TestDB;
    

    以上将CREATEALTER VIEW V.RelatedRows,同时无法创建VIEW dbo.NoAccess。如前所述,我没有将dbo 架构的显式访问权限授予USER,他们只能通过权限链接访问数据。这可能不是所希望的,但我想证明用户实际上甚至不需要直接访问表就能够在这种情况下使用它。

    【讨论】:

      猜你喜欢
      • 2010-10-20
      • 1970-01-01
      • 1970-01-01
      • 2020-10-23
      • 2011-04-23
      • 1970-01-01
      • 2021-02-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多