我认为答案是否定的,但我希望让某人访问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,您可以使用登录下的用户映射选项卡,您可以创建仅具有“公共”访问权限的用户。然后,您可以转到数据库并授予该用户对特定表的 SELECT 访问权限(通过单击 Securables 选项卡下奇怪的“搜索”按钮)。
当然,这种方法也适用于脚本。
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
更好的方法是创建一个单独的,在那个中schema
创建一个。然后让用户去那个。而已。您可以在其中创建一个,这可能是您所追求的更多。proc
schema
EXEC
proc
view
schema