MSSQL-授予除一个表以外的所有表的选择权限

时间:2018-07-31 07:59:53

标签: sql sql-server tsql permissions

我有一个数据库,普通用户具有“公共”和“ db_datareader”权限,以便该用户可以从所有表/视图中进行选择。

现在我有一个特定的情况,即该数据库中只有一个表,只有特定的用户可以访问该表。

是否有一种简单的方法可以排除一个表,而不必在所有其他表/视图上授予通用用户特定的权限? 这个问题:Similar Question谈论“ DENY”规则

第二,如果我在视图中使用此表..如果您无权访问视图定义中的所有表,视图选择将失败吗?

感谢您的任何反馈!

1 个答案:

答案 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;

enter image description here

相关问题