我想我需要一些关于 SQL Server 安全性的指针。我试图限制我们的一些最终用户访问表上的某些列(即 SSN)。
我以为我可以只使用列级安全性来限制对列的访问。这成功地阻止了用户直接访问该表,但令我惊讶的是,他们仍然可以通过访问该表的视图访问这些列。
我遵循了这里的提示:http ://www.mssqltips.com/sqlservertip/2124/filtering-sql-server-columns-using-column-level-permissions/ 这些非常有帮助,但是当我最后创建一个视图时,实习生默认可以访问该列
我读过视图是完成此任务的最佳方式,但我真的不想通过并更改所有视图和遗留前端应用程序。我宁愿只在表上限制它一次,如果视图试图访问该列,它就会失败。
这是可能的还是我误解了 SQL Server 中的安全性如何工作?
列级安全性不是这样工作的。我知道没有任何机制可以全局拒绝给定用户对特定列的访问。GRANT/DENY 仅适用于结合给定对象的特定语句,如 SELECT、UPDATE 等。
因此,在您的情况下,如果您删除了对表 Y 上列 X 的 SELECT 访问,用户仍然可以愉快地在该表上执行“选择 *”视图,因为该视图是不同的对象并且不受此安全设置的影响!
好消息是您也可以对视图使用列权限。它与表的工作方式相同,但您必须对包含 SSN 列的每个视图设置权限。
请注意,在 SQL 2016+ 中有一个数据屏蔽功能,可以隐藏特定列的完整详细信息。这可以防止用户看到某些列的实际值,除非他们具有特定的“取消屏蔽”权限。
请注意,用户仍然可以通过 WHERE 子句间接查找数据——例如,即使“Salary”被屏蔽,您仍然可以查询薪水介于 X 和 Y 之间的用户。
例如:
ALTER COLUMN [Social Security Number] ADD MASKED WITH (FUNCTION = 'partial(0,"XXX-XX-",4)')
文档: https ://learn.microsoft.com/en-us/sql/relational-databases/security/dynamic-data-masking?view=sql-server-2016