我有一个数据库,其中通用用户具有“public”和“db_datareader”权限,以便用户可以从所有表/ View 中进行选择。
现在我有一个特定的情况,其中该数据库中有一个表,只有特定用户有权访问。
是否有一种简单的方法可以排除该一个表,而不必授予通用用户对所有其他表/ View 的特定权限? 本问题:Similar Question谈论“DENY”规则
其次,如果我在 View 中使用此表..如果您无权访问 View 定义中的所有表, View 的选择会失败吗?
感谢您的反馈!
最佳答案
是的,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;
关于sql - MSSQL - 授予除一个表之外的所有表的选择权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51608294/