首页 文章

SQL Server:查看表的权限

提问于
浏览
0

是否可以授予用户访问视图的权限,但限制用户访问视图选择的表?

CREATE TABLE [dbo].[tUsers](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [Username] [nvarchar](50) NULL,
    [Password] [nvarchar](50) NULL,
    [TenantID] int
) ON [PRIMARY]

CREATE VIEW [scmTenant1].[vUsers]
AS
SELECT     ID, Username, Password
FROM         dbo.tUsers
WHERE        TenantID = 1

SQL Server用户帐户( usrTenant1 )可以访问架构 scmTenant1 ,但无权访问 dbo 架构 . 我以 usrTenant1 身份登录SQL Server Management Studio并尝试执行此查询:

SELECT * FROM scmTenant1.vUsers

给我错误:

对象'tUsers',数据库'Sandbox',架构'dbo'上的SELECT权限被拒绝 .

如果我授予此帐户访问 dbo 架构的权限,则查询执行正常 .

我想我真的想要授予表的查看权限 . 但我的问题是,您是否可以授予用户访问视图的权限并限制该用户访问该视图所选择的基础表?

1 回答

  • 2

    如果您创建视图dbo的所有者而不是scmTenant - 或创建执行相同操作的中间视图 - 那么您可以向视图授予权限,而不授予对基础表的权限 .

    CREATE VIEW dbo.vUsers_T1
    AS 
    SELECT     ID, Username, Password 
    FROM         dbo.tUsers 
    WHERE        TenantID = 1
    
    CREATE VIEW [scmTenant1].[vUsers] as
    SELECT * FROM dbo.vUsers_T1
    

    或者,您可以创建一个函数,该函数返回当前租户的ID,并创建一个引用dbo中的视图的视图 .

    CREATE VIEW dbo.vUsers
    AS 
    SELECT     ID, Username, Password 
    FROM         dbo.tUsers 
    WHERE        TenantID = dbo.GetCurrentTenant()
    

相关问题