SQL Server:你能限制访问仅限于一个表吗?

26

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

要限制某人只能访问一个数据库很容易,但我不知道是否可以仅限于一张表。

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

我也不确定它是否有效,因为我认为权限会发生冲突。


8
如果你愿意,可以让其他人访问表格中的某一列,创建他们的登录账户,然后仅授予选择权限。请注意,在此过程中不要改变原文的意思。 - Alex K.
7个回答

43
是的。
exec sp_msforeachtable "DENY SELECT ON ? TO [username];"
GO

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

虽然这样可以工作,但是你最好使用角色和AD组来管理权限。


19
循环遍历所有表并拒绝访问的问题在于如果添加新表,则需要修改代码。

重要的是不要为用户提供对整个数据库的'db_datareader'访问权限。使用UI,您可以在登录名下使用User Mapping选项卡,仅创建具有“public”访问权限的用户。然后,您可以进入数据库,并授予该用户特定表的SELECT访问权限(通过单击Securables选项卡下方的奇怪命名的“Search”按钮)。

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


这比被采纳的答案更有帮助。我不明白为什么这个答案的投票数较少。 - Muzaffer Galata

5
GRANT SELECT ON [SchemaName].[TableName] to [UserName]

2
这如何保护其余的表? - Aaron Bertrand
这并不是原因,这就是为什么答案没有被标记为被接受的,而被接受的那个答案则有。我不确定你是否问我这个问题是为了指出我错了,几个月后我早已忘记了这个答案,无论如何,希望我的评论能够帮到你。 - Ta01
2
抱歉,这个问题是在聊天中引起我的注意的。当我发表评论时,我实际上没有意识到这个问题有多久了。尽管如此,我认为质疑答案方面与原始问题相关的方面仍然是有效的,无论其接受状态或投票计数如何。许多问题没有被接受的答案,而这个问题之所以还在这里,是因为答案旨在帮助OP和未来的读者。其中许多人可能会认为页面上的任何答案都是答案。 - Aaron Bertrand
2
这可能不完全符合提问者的要求,但这正是我要找的 :) - jahu

3
当你授予用户对数据库的访问权限时,需要查看其所分配的角色以及这些角色拥有的权限。确保授权不要过于宽泛,因为通常情况下人们在最初授权时会授予过多的权限。可以使用GRANT来授予所需的权限。

2

这是可能的,而且非常容易。以下代码适用于我的 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

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

-2
更好的方法是创建一个单独的“schema”,在该“schema”中创建一个“proc”。然后允许用户执行该“proc”。就这样。您可以在该“schema”中创建一个“view”,这可能更符合您的要求。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接