我有一个结构如此的表(简化)
Name, EMail, LastLoggedInAt
我在 SQL Server (RemoteUser) 中有一个用户应该只能看到 LastLoggdInAt 字段不为空的数据(通过选择查询)。
看起来我可以做到这一点?可能吗?
我有一个结构如此的表(简化)
Name, EMail, LastLoggedInAt
我在 SQL Server (RemoteUser) 中有一个用户应该只能看到 LastLoggdInAt 字段不为空的数据(通过选择查询)。
看起来我可以做到这一点?可能吗?
SQL Server 安全模型允许您授予对视图的访问权限而不授予对基础表的访问权限。
由于示例代码是展示概念的好方法,请考虑以下内容,以及
LoginDetails
表格和相应的视图:我们将创建一个登录名和一个用户,然后为该用户分配从视图中选择行的权限,但没有任何查看表本身的权限。
现在,我们将插入两个测试行:
这将测试安全模型。第一条
SELECT
语句成功,因为它是从视图中进行选择,而第二SELECT
条语句失败,因为用户没有直接访问表的权限。请注意,根据您的问题的要求,视图的结果排除了
LastLoggedInAt
值为的行。NULL
针对基础表的第二条
SELECT
语句返回错误:清理:
或者,如果您有 SQL Server 2016 或更新版本,则可以使用行级安全谓词来防止某些用户看到具有 NULL
LastLoggedInAt
值的行。行级别安全性的 Microsoft 文档在此处。首先,我们创建表、登录名、该登录名的用户,然后授予对表的访问权限:
接下来,我们插入几个示例行。一行具有 null
LastLoggedInAt
,另一行具有该列的非空值。在这里,我们创建了一个模式绑定的表值函数,该函数根据传入函数的
@LastLoggedInAt
和变量的值返回一行 0 或 1。@username
过滤器谓词将使用此函数来消除我们想要对某些用户隐藏的行。SELECT
这是从针对表运行的语句中删除行的安全过滤器dbo.LoginDetails
:上面的过滤器通过传入当前用户的名称以及表中列的
dbo.fn_LoginDetailsRemoteUserPredicate
每一行的值来使用该函数。LastLoggedInAt
dbo.LoginDetails
如果我们以普通用户身份查询表:
我们看到所有行:
但是,如果我们测试为
RemoteUser
:我们只看到“有效”行:
而且,我们清理:
请注意,以这种方式将函数模式绑定到表确实使得在不先删除过滤谓词和
dbo.fn_LoginDetailsRemoteUserPredicate
函数的情况下无法修改表的定义。