Sql server 在不更改查询的情况下阻止对列的访问

Sql server 在不更改查询的情况下阻止对列的访问,sql-server,tsql,permissions,user-permissions,Sql Server,Tsql,Permissions,User Permissions,我有一个Microsoft SQL Server,其中的数据需要保护某些表的某些敏感列,还有一个应用程序可以像这样查询该数据库: SELECT BoringColumn, SensitiveColumn FROM Table SELECT BoringColumn, 'N/A' as SensitiveColumn FROM Table 我有以下限制: 我有3-4个用户,每个用户都有不同的列可见或不可见。 在此示例中,不应访问SensiveColumn。 我不能直接更新应用程序发送的查询 我

我有一个Microsoft SQL Server,其中的数据需要保护某些表的某些敏感列,还有一个应用程序可以像这样查询该数据库:

SELECT BoringColumn, SensitiveColumn FROM Table
SELECT BoringColumn, 'N/A' as SensitiveColumn FROM Table
我有以下限制:

我有3-4个用户,每个用户都有不同的列可见或不可见。 在此示例中,不应访问SensiveColumn。
我不能直接更新应用程序发送的查询 我已经尝试了什么:

我试着使用这个功能。但是,它不够精细,您可以根据每个用户打开或关闭它,而不仅仅是针对某些列。上面的链接也解释了它可能会在查询中泄漏数据

我知道我可以拒绝用户在Table.SensitiveColumn上选择。 但是,任何请求表的现有查询都会因权限错误而中断

我还有什么其他选择

理想情况下,我希望在服务器端替换查询并执行如下操作:

SELECT BoringColumn, SensitiveColumn FROM Table
SELECT BoringColumn, 'N/A' as SensitiveColumn FROM Table

我想我找到了一个可能的解决办法: 更改表结构-将SensitiveColumn重命名为其他名称,并使用SensitiveColumn的旧名称添加一个计算列,该列将显示基于的结果

我不确定的一件事是,您是否可以拒绝对SensitiveBase列的访问,但将其授予SensitiveColumn。 我让你自己测试一下。
如果无法做到这一点,您只需将SensiveBase列上的select权限授予trusted login,并拒绝其他人的权限。

我无法直接更新应用程序发送的查询。你能控制数据库结构吗?我的意思是,重命名对象,更改表,诸如此类的好问题,是的,我可以做到。我建议你让应用程序在视图中执行这些操作。这样你就更容易维护安全问题是的,修改应用程序是最简单的方法,但这不是一个选项,因为这个应用程序是共享的,很难修改。这有点不方便,但是你能更改表名吗,添加一个名为表名的视图,并在该视图上添加一个instead of触发器。不好,我知道这是个好主意。我还可以将SensitiveBase列设置为HIDDEN,这样即使是SELECT*FROM tblTest也可以工作。我会在接下来的几天里尝试,然后再回来找你!如果拒绝对SensiveBase的权限,select*将失败,因为“SensiveBase”列上的select权限被拒绝。你可以采取上面的方法,然后遮罩sensitivebase@Bluuu“隐藏”仅适用于系统生成的列。@SteveFord是的,没错。要克服这一问题,另一种选择是重命名表,并创建一个仅包含与旧表名同名的相关列的视图-尽管这可能会带来其他问题,如与现有命名约定的兼容性、视图的可更新性(可以使用而不是触发器来解决),但是可能需要很多代码