BostonMacOSX Asked: 2020-12-18 19:23:20 +0800 CST2020-12-18 19:23:20 +0800 CST 2020-12-18 19:23:20 +0800 CST 当视图可以限制一个人对行和/或列的访问时,为什么需要行级访问? 772 所以我一直对vew的安全性和行级安全性之间的区别感到困惑。 所以我想我的一般问题是 当视图可以限制一个人对行和/或列的访问时,为什么需要行级访问? view row-level-security 2 个回答 Voted Best Answer J.D. 2020-12-19T04:43:23+08:002020-12-19T04:43:23+08:00 我假设您是在 Microsoft SQL Server 的上下文中提出这个问题的,因为行级安全性是他们提供的一项功能。虽然使用视图实现模拟行级安全性和使用 SQL Server 的行级安全性功能之间存在相似之处,但也有一些区别: 关注点分离-行级安全性从您的实体中抽象出安全部分,以允许更清洁和更简单的代码。 可管理性- 使用Row-Level Security,您可以创建一个可以添加用户的策略实体。该策略利用一个功能,您可以在其中定义安全策略的逻辑。这消除了使用自定义表来存储您的用户及其访问角色的需要。 可重用性- 您可以对多个表使用相同的策略,而无需编写重复的逻辑。 灵活性- 您可以通过设置策略轻松打开和关闭任何表STATE的策略。 性能- 通常,如果谓词过于复杂,用于在视图中模拟行级别安全性的自定义逻辑会对性能产生负面影响。通过从视图的谓词中删除此逻辑并使用与Policy for Row-Level Security中使用的完全相同的逻辑创建一个内联表值函数,我已经看到了巨大的性能改进。(我不完全知道为什么,但是通过查看这两种情况下的执行计划,肯定存在差异,我认为这与安全逻辑被抽象出来并与View中的谓词分开应用有关。) 有关更多信息,您可以阅读 Microsoft 的行级安全文档。 Peter Vandivier 2020-12-19T05:14:54+08:002020-12-19T05:14:54+08:00 恕我直言,将视图用作安全对象是错误的。视图是一个可重用的功能,可以让您不必记住和输入一系列连接来将规范化的数据放入更易于阅读的集合中。 在视图中使用连接逻辑或 where 子句是选择什么对您在视图中执行的数据转换有意义。这不是一种阻止人们看到他们不应该看到的东西的技术。 如果您希望允许用户凭据查看表中的某些行而不查看其他行,则行级安全性是更合适的实现选择。
我假设您是在 Microsoft SQL Server 的上下文中提出这个问题的,因为行级安全性是他们提供的一项功能。虽然使用视图实现模拟行级安全性和使用 SQL Server 的行级安全性功能之间存在相似之处,但也有一些区别:
关注点分离-行级安全性从您的实体中抽象出安全部分,以允许更清洁和更简单的代码。
可管理性- 使用Row-Level Security,您可以创建一个可以添加用户的策略实体。该策略利用一个功能,您可以在其中定义安全策略的逻辑。这消除了使用自定义表来存储您的用户及其访问角色的需要。
可重用性- 您可以对多个表使用相同的策略,而无需编写重复的逻辑。
灵活性- 您可以通过设置策略轻松打开和关闭任何表
STATE
的策略。性能- 通常,如果谓词过于复杂,用于在视图中模拟行级别安全性的自定义逻辑会对性能产生负面影响。通过从视图的谓词中删除此逻辑并使用与Policy for Row-Level Security中使用的完全相同的逻辑创建一个内联表值函数,我已经看到了巨大的性能改进。(我不完全知道为什么,但是通过查看这两种情况下的执行计划,肯定存在差异,我认为这与安全逻辑被抽象出来并与View中的谓词分开应用有关。)
有关更多信息,您可以阅读 Microsoft 的行级安全文档。
恕我直言,将视图用作安全对象是错误的。视图是一个可重用的功能,可以让您不必记住和输入一系列连接来将规范化的数据放入更易于阅读的集合中。
在视图中使用连接逻辑或 where 子句是选择什么对您在视图中执行的数据转换有意义。这不是一种阻止人们看到他们不应该看到的东西的技术。
如果您希望允许用户凭据查看表中的某些行而不查看其他行,则行级安全性是更合适的实现选择。