我认为答案是否定的,但我想让某人访问一个 SQL Server
数据库,但我只想让他们访问一张表。
要限制某人只能访问一个数据库很容易,但我不知道是否可以仅限于一张表。
我的想法是创建另一个带有对其他表的同义词的数据库,然后限制对该数据库的访问,但我想知道是否有更好的方法。
我也不确定它是否有效,因为我认为权限会发生冲突。
我认为答案是否定的,但我想让某人访问一个 SQL Server
数据库,但我只想让他们访问一张表。
要限制某人只能访问一个数据库很容易,但我不知道是否可以仅限于一张表。
我的想法是创建另一个带有对其他表的同义词的数据库,然后限制对该数据库的访问,但我想知道是否有更好的方法。
我也不确定它是否有效,因为我认为权限会发生冲突。
exec sp_msforeachtable "DENY SELECT ON ? TO [username];"
GO
GRANT SELECT ON [schemaName].[tableName] to [username]
Go
虽然这样可以工作,但是你最好使用角色和AD组来管理权限。
重要的是不要为用户提供对整个数据库的'db_datareader'访问权限。使用UI,您可以在登录名下使用User Mapping选项卡,仅创建具有“public”访问权限的用户。然后,您可以进入数据库,并授予该用户特定表的SELECT访问权限(通过单击Securables选项卡下方的奇怪命名的“Search”按钮)。
当然,这种方法也适用于脚本。
GRANT SELECT ON [SchemaName].[TableName] to [UserName]
这是可能的,而且非常容易。以下代码适用于我的 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