我有一个数据库,普通用户具有“公共”和“ db_datareader”权限,以便该用户可以从所有表/视图中进行选择。
现在我有一个特定的情况,即该数据库中只有一个表,只有特定的用户可以访问该表。
是否有一种简单的方法可以排除一个表,而不必在所有其他表/视图上授予通用用户特定的权限? 这个问题:Similar Question谈论“ DENY”规则
第二,如果我在视图中使用此表..如果您无权访问视图定义中的所有表,视图选择将失败吗?
感谢您的任何反馈!
答案 0 :(得分:2)
是的,DENY
是前往此处的方法。是的,如果在view
中使用了该表,则用户将能够查询该表。
以下示例代码对此进行了演示:
--DROP USER IF EXISTS [StackOverflow];
--DROP TABLE IF EXISTS [dbo].[Data];
--DROP TABLE IF EXISTS [dbo].[DataDeny];
--DROP VIEW IF EXISTS [dbo].[vw_Data];
CREATE USER [StackOverflow] WITHOUT LOGIN;
EXEC sp_addrolemember @rolename = 'db_datareader'
,@membername = 'StackOverflow';
GO
CREATE TABLE [dbo].[Data]
(
[column] INT
);
INSERT INTO [dbo].[Data]
VALUES (1);
GO
CREATE TABLE [dbo].[DataDeny]
(
[column] INT
);
INSERT INTO [dbo].[DataDeny]
VALUES (2);
GO
CREATE VIEW [dbo].[vw_Data]
AS
SELECT [column]
FROM [dbo].[Data]
UNION ALL
SELECT [column]
FROM [dbo].[DataDeny];
GO
DENY SELECT ON [dbo].[DataDeny] TO [StackOverflow]
GO
EXECUTE AS USER = 'StackOverflow';
SELECT [column] AS [read]
FROM [dbo].[Data];
SELECT [column] AS [not_Read]
FROM [dbo].[DataDeny]
SELECT [column] AS [read]
FROM [dbo].[vw_Data];
REVERT;