我需要限制(支持)用户查看表中的列(其他用户应该拥有对此表的完全访问权限)。
所以我只允许通过“GRANT SELECT ON dbo.TestTable (FirstCol, SecondCol, ThirdCol) TO HR_Intern;
”
但是当我运行“SELECT * FROM dbo.TestTable;
”时,表格中的每个其他列都出现了拒绝访问错误。
用户直接在数据库上使用MSSQL Management Studio进行客户支持,错误将不允许用户编辑数据。
是否可以只显示用户有权访问的列并忽略每个被拒绝的列?
感谢您的帮助:)
答案 0 :(得分:2)
最好创建一个VIEW
并为用户提供访问权限。仅在VIEW
中,这些用户可以看到的那些列应该是SELECT
语句的一部分。
答案 1 :(得分:0)
没有。这就是SQL中的安全性。基本上“SELECT *”不是一个好形式,一个应该提供一个字段列表。
如果结果集会根据登录的用户神奇地改变,这将导致很多糟糕的错误报告,因为应用程序突然无法正常工作。您询问了无法发送的所有字段,因此出现了错误报告。
一种解决方法是使视图具有有限数量的字段,并指示此用户使用视图。显然,在开发过程中需要花费时间和注意力。
答案 2 :(得分:0)
正如其他人所指出的,您需要用显式选择列表替换*
。
如果您担心必须两次指定事物,这里是一个查询,以从元数据中检索允许列的列表。
如果您愿意,可以使用其结果集为TestTable
上的查询生成(部分)选择列表。
SELECT c.name
FROM sys.columns c
INNER JOIN sys.database_permissions p
ON p.class = 1
AND p.major_id = c.object_id
AND p.minor_id = c.column_id
AND p.state = 'G'
AND p.grantee_principal_id = DATABASE_PRINCIPAL_ID('HR_Intern')
WHERE c.object_id = OBJECT_ID('dbo.TestTable')
将DATABASE_PRINCIPAL_ID('HR_Intern')
替换为DATABASE_PRINCIPAL_ID()
,以获取当前活跃用户的元数据。
查询仍然很粗糙;它无视表格范围的拨款,而且都拒绝。你可能想尝试一下。