我想为连接到特定 SQL Server 数据库(仅一个数据库)的任何 客户端实现行级安全性。我不想在客户端强加任何需要发生的特定设置(因为这意味着客户端可以设置自己以便它可以访问任何东西 - 这当然会很糟糕;顺便说一句,客户端是一个使用 Windows Auth 或 SQL Auth 连接的 WinApp)。我基本上希望这对任何客户都是透明的。客户甚至不应该知道正在发生这种情况。
行级安全性的实现将在表层之上的数据库内部 View 中执行(本质上:没有人能够直接对表执行 DML;相反,所有操作都应针对位于表顶部的 View 。这些 View 将具有 instead-of 触发器,在特定的“执行为”下运行,以确保 DML 操作可以正确执行)。
所以基本上,我想消除客户端通过将其烘焙到数据库本身来规避此安全模型的可能性。
我还想将授予用户的权限与应用于当前连接的有效权限分开(这样想:如果你连接到数据库,你有一个与你的连接相关联的安全上下文 - 维护在请注意,数据库 - 此安全上下文包含有关您有权访问哪些项目的信息。建立连接后,将创建此安全上下文并使用基于分配给您的权限的信息填充,以及当连接关闭时,信息在这个安全上下文中被删除;事实上,整个安全上下文应该被删除)。当然,安全上下文应该只在给定的连接中可用,连接甚至不应该有能力看到其他连接的安全上下文的存在。
(编辑:明确针对的场景之一,这解释了为什么安全上下文与“定义的权限”分开如下:如果您建立与数据库的连接,您将获得一个 SecContext;现在当您的连接是active/not closed,管理员给你分配了新的权限,这些新的权限不会应用到这个当前打开的连接。你必须关闭连接并重新建立连接才能让这些更改反射(reflect)在你的 SecContext 中)
我知道如何强制 View 只返回用户有权访问的信息。这是简单的部分...这个问题是关于我正在谈论的安全上下文的创建和删除。
- 应在建立连接时创建安全上下文。
- 它还应该驻留在只能由当前连接访问的工件中。
- 它必须在连接用户的连接生命周期内是可查询的。
- 最后,必须在连接关闭时删除/删除/删除安全上下文。
有没有人知道如何实现这一目标。
谢谢
最佳答案
SQL Server 临时表(名称以# 开头的表)仅对当前连接可用,并在结束时删除。您只需在创建新连接时处理建立它。
然而,听起来您正在重新实现 DBMS 已经为您完成的许多工作。我建议阅读更多有关 SQL Server 内置安全机制的内容,尤其是登录/用户/架构分离。
关于sql - 创建一个只能在当前连接中访问的(临时?)表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6267942/