2017-10-18 67 views
1

当添加一个新列由行级安全性在MSSQL 2016保护的表,我得到的尝试发布使用SQL Server数据工具数据库时,下面的错误保护:涂改MSSQL表由RLS(SSDT)

当前操作将导致表X的数据移动的数据移动不能在该表上进行,因为它受政策Y.启用行级安全性要允许与选项/ p此操作使用SqlPackage.exe:AllowUnsafeRowLevelSecurityDataMovement

我怀疑它想重新创建表,这可能会导致数据丢失e部署用户没有被RLS谓词授予对数据的访问权限。不过,我无法找到任何关于此的文档。

更重要的是,处理这种部署场景的最佳做法是什么?

回答

1

有2个方面来这样的情景:

  • 为什么添加列导致发生数据移动操作?
  • Row Level Security引入的危险是什么?

最小化/避免数据运动

一般增加一个新的列不应该要求数据中的运动。如果添加到表定义的末尾,可以通过ALTER TABLE ADD COLUMN操作完成,而SSDT足够聪明,可以为您做到这一点。但是,如果在表格中间添加默认行为,则会执行完整的数据移动,这在大型表格上可能会非常昂贵。为了避免这种情况:

  • 总是尝试尽可能在最后添加列。
  • 如果这不可行,最新版本的SSDT & SqlPackage有一个IgnoreColumnOrder标志,它会将表格中间的列添加视为添加到最后。这可能会导致一些并发症(如模式比较必须有这一套太或者它会显示该表的源项目&数据库版本之间的差异),但通常是值得的,以避免在部署过程中不必要的数据移动

处理行级安全(RLS)+数据中的运动

如果你真的需要做出导致数据运动变化,与RLS的风险是,你的用户没有在表中获取所有行。由于数据移动将数据复制到临时表,然后删除原来的重命名,您将失去用户看不到的任何行。

解决方法是设置/p:AllowUnsafeRowLevelSecurityDataMovement标志,但要验证您的用户不是任何行级过滤方案的一部分。一个好的做法是只将这些方案应用于权限有限的用户(例如您的应用角色),而在部署(管理角色)时使用具有更高权限的角色。如果你这样做,你可以安全部署,但是旗帜至少可以警告这种情况/避免意外的数据丢失。

+0

所以我理解正确,使用IgnoreColumnOrder添加的列将被添加到最后,即使数据库项目定义,否则?通常,我倾向于在浏览表格数据时按顺序添加列。但是,如果需要特定的订单,也许应该使用视图? – Anders

+0

您是否还说应该在安全性谓词中构建一条规则,以允许某些“admin”SQL用户可见所有行?这还可以解决通过管理工作室查看数据时看似空表的问题。在当前项目中,会话上下文中设置了用户标识,用于确定单个应用程序用户(不是sql用户)的权限。要在管理工作室中查看数据,必须在上下文中设置适当的用户标识,这显然非常麻烦。 – Anders

+0

关于列顺序:你是对的,你应该使用视图来进行逻辑“有意义”排序。表格中间不能添加列。它们要么被添加到最后,要么创建一个全新的表格。是的,忽略列顺序意味着它们被放在最后,即使它在项目中看起来不那样 –