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

Block access to column without changing query

我有一个 Microsoft SQL 服务器,其中包含需要保护的数据(某些 table 的某些敏感列)和一个查询该数据库的应用程序,如下所示:

SELECT BoringColumn, SensitiveColumn FROM Table

我有以下限制:

  1. 我有多个用户 (3-4),每个用户都有不同的列可见或不可见。 在此示例中,不应访问 SensitiveColumn。
  2. 我可以不能直接更新应用程序发送的查询

我已经尝试了什么:

我尝试使用 SQL Servers Dynamic Data Masking 功能。但是它不够精细,您可以针对每个用户打开或关闭它,而不仅仅是针对某些列。它可以在查询中泄漏数据,上面的 link 也解释了这一点。

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

我还有什么选择?

理想情况下,我想要一些东西来替换服务器端的查询并执行如下操作:

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

我想我找到了一个可能的解决方案:
更改 table 结构 - 将 SensitiveColumn 重命名为不同的名称,并添加一个具有 SensitiveColumn 旧名称的计算列,这将显示基于 current_user.

的结果
CREATE TABLE tblTest
(
    boringColumn int,
    SensitiveBase varchar(10), -- no user should have direct access to this column!
    SensitiveColumn as 
        case current_user 
            when 'Trusted login' then SensitiveBase
            else 'N/A' 
        end
)

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