gpt4 book ai didi

sql-server - 更改受 RLS (SSDT) 保护的 SQL 表

转载 作者:搜寻专家 更新时间:2023-10-30 22:29:29 25 4
gpt4 key购买 nike

在 MSSQL 2016 中向受行级安全性保护的表添加新列时,尝试使用 SQL Server Data Tools 发布数据库时出现以下错误:

The current operation will cause data motion on table X. Data motion can not be performed on this table because it has row level security enabled by policy Y. To allow this operation use SqlPackage.exe with option /p:AllowUnsafeRowLevelSecurityDataMovement

我怀疑它想要重新创建表,如果 RLS 谓词未授予部署用户访问数据的权限,这可能会导致数据丢失。但是我找不到任何关于此的文档。

更重要的是,处理此类部署场景的最佳实践是什么?

最佳答案

这个场景有两个方面:

  • 为什么添加列会导致发生数据移动操作?
  • 行级安全带来的危险是什么?

最小化/避免数据移动

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

  • 总是尽量在末尾添加列。
  • 如果这不可能,最新版本的 SSDT 和 SqlPackage 有一个 IgnoreColumnOrder 标志,它将处理表中间的列添加,就好像它们被添加到末尾一样。这可能会导致一些复杂情况(例如模式比较也必须具有此设置,否则它将显示源项目和表的数据库版本之间的差异),但通常值得这样做以避免部署期间不必要的数据移动

处理行级安全性 (RLS) + 数据移动

如果您确实需要进行导致数据移动的更改,则 RLS 的风险在于您的用户无法访问表中的所有行。由于数据移动将数据复制到临时表,然后删除原始数据并进行重命名,因此您会丢失用户看不到的所有行。

解决方案是设置 /p:AllowUnsafeRowLevelSecurityDataMovement 标志,但要验证您的用户不属于任何行级过滤方案。一个好的做法是仅将这些方案应用于权限有限的用户(例如您的应用程序角色),同时在部署时使用具有更大权限的角色(管理员角色)。如果您这样做,您就可以安全部署,但该标志至少是为了警告这一点/避免意外数据丢失。

关于sql-server - 更改受 RLS (SSDT) 保护的 SQL 表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46804919/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com