2017-10-18 70 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

關於列順序:你是對的,你應該使用視圖來進行邏輯「有意義」排序。表格中間不能添加列。它們要麼被添加到最後,要麼創建一個全新的表格。是的,忽略列順序意味着它們被放在最後,即使它在項目中看起來不那樣 –