2012-10-23 69 views
0
的权限

是否可以授予用户访问视图但限制用户访问视图选择的表的权限?SQL Server:查看表

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架构。我登录到SQL Server Management Studio中为usrTenant1,并尝试执行此查询:

SELECT * FROM scmTenant1.vUsers 

给我的错误:

The SELECT permission was denied on the object 'tUsers', database 'Sandbox', schema 'dbo'.

如果我授予dbo架构查询执行罚款此帐户的访问。

我想我真的想授予表的查看权限。但我的问题是,你能授予用户访问视图并限制该用户访问视图选择的基础表吗?

回答

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() 
+0

谢谢你的建议,但我不认为这会在我的环境中工作。我计划为我的系统中的每个租户创建一个Schema和View。如果我将视图移至dbo,那么每个租户的视图都需要一个唯一的名称,这会破坏我的代码。 – jwdenny13

+0

@ jwdenny13请参阅上面的编辑 – podiluska

+0

用SUSER_SID()代替dbo.GetCurrentTenant()并更改了用SID替换TenantID的表。此列有一个默认值SUSER_SID()。非常好,谢谢! – jwdenny13