20

我认为答案是否定的,但我希望让某人访问SQL Server数据库,但我真的只希望他们能够访问一个表。

限制某人仅访问一个数据库很容易,但不知道我是否可以限制为单个表。

我的想法是用另一个表的同义词创建另一个数据库,然后限制对该数据库的访问,但我想知道是否有人能想到更好的方法。

我也不相信它会起作用,因为我认为会有权限冲突。

4

7 回答 7

38

是的。

exec sp_msforeachtable "DENY SELECT ON ? TO [username];"
GO

GRANT SELECT ON [schemaName].[tableName] to [username]
Go 

虽然这可行,但您最好使用角色和 AD 组来管理权限。

于 2012-03-20T12:51:41.517 回答
12

循环遍历所有表并拒绝访问的问题是如果您添加一个新表。

重要的是不要让用户“db_datareader”访问整个数据库。使用 UI,您可以使用登录下的用户映射选项卡,您可以创建仅具有“公共”访问权限的用户。然后,您可以转到数据库并授予该用户对特定表的 SELECT 访问权限(通过单击 Securables 选项卡下奇怪的“搜索”按钮)。

当然,这种方法也适用于脚本。

于 2013-04-16T02:07:55.203 回答
3
GRANT SELECT ON [SchemaName].[TableName] to [UserName]
于 2012-03-20T12:51:23.467 回答
2

当然。 授予您想要的权限。

当您授予用户访问数据库的权限时,请查看为他们分配的角色以及这些角色拥有的权限。

问题是人们通常在一开始就授予太宽泛的权限。

于 2012-03-20T12:52:58.567 回答
0

你当然可以。创建用户并授予他们对数据库的访问权限后,仅授予对该表的选择访问权限(或他们需要的任何级别)。

于 2012-03-20T12:52:34.560 回答
0

这是可能的,而且很容易。以下代码适用于我的 SQL 2019:

USE [master]
GO
-- Create test login deny rights on server layer
IF NOT EXISTS (SELECT NULL FROM sys.server_principals WHERE [name] = 'UserRightTest')
  CREATE LOGIN [UserRightTest] WITH PASSWORD=N'abc1234$', DEFAULT_DATABASE=[master], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF;
GO
--DENY VIEW ANY DATABASE TO [UserRightTest]; -- optional, depends on how the login access the table
DENY VIEW SERVER STATE TO [UserRightTest];
GO

-- Grant only permissions to two tables
USE [MyTestDb]
GO
IF NOT EXISTS (SELECT NULL FROM sys.database_principals WHERE [type] = 'S' AND [name] = N'UserRightTest')
  CREATE USER [UserRightTest] FOR LOGIN [UserRightTest] WITH DEFAULT_SCHEMA = [dbo];
GO
GRANT SELECT ON OBJECT::[dbo].[TestParentTable] TO [UserRightTest];
GRANT SELECT,INSERT,UPDATE,DELETE ON OBJECT::[dbo].[TestChildTable] TO [UserRightTest];
GO
于 2022-01-21T06:01:11.907 回答
-1

更好的方法是创建一个单独的,在那个中schema创建一个。然后让用户去那个。而已。您可以在其中创建一个,这可能是您所追求的更多。procschemaEXECprocviewschema

于 2014-10-13T18:26:15.337 回答