忽略“select * from”中的拒绝列

时间:2014-02-24 11:04:17

标签: sql sql-server access-denied

我需要限制(支持)用户查看表中的列(其他用户应该拥有对此表的完全访问权限)。 所以我只允许通过“GRANT SELECT ON dbo.TestTable (FirstCol, SecondCol, ThirdCol) TO HR_Intern;

访问我指定的列

但是当我运行“SELECT * FROM dbo.TestTable;”时,表格中的每个其他列都出现了拒绝访问错误。 用户直接在数据库上使用MSSQL Management Studio进行客户支持,错误将不允许用户编辑数据。

是否可以只显示用户有权访问的列并忽略每个被拒绝的列?

感谢您的帮助:)

3 个答案:

答案 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(),以获取当前活跃用户的元数据。

查询仍然很粗糙;它无视表格范围的拨款,而且都拒绝。你可能想尝试一下。