2017-10-18 5 views
1

を変更、私は次のエラーを取得する:MSSQL 2016で行レベルのセキュリティで保護されたテーブルに新しい列を追加する場合は、SQL Serverのデータツールを使用してデータベースを公開しようとすると、RLSで保護さMSSQLテーブル(SSDT)

現在の操作が、それはオプション/ pは、この操作を使用SqlPackage.exeを許可するポリシーYで有効になって行レベルのセキュリティを持っているため、表X.データの動きのデータの動きは、このテーブル上で実行することができない原因になります。AllowUnsafeRowLevelSecurityDataMovement

テーブルを再作成したいと思うので、 e配備ユーザーは、RLS述部によるデータへのアクセスを許可されていません。しかし、私はこれについてのドキュメントを見つけることができません。

さらに重要なのは、このような展開シナリオを処理するためのベストプラクティスは何ですか?

答えて

1

このシナリオの2つの側面がある:

  • なぜカラムの添加はデータモーション操作が発生する原因となっていますか?
  • 行レベルセキュリティによって導入される危険性は何ですか?

最小化/データの動きを必要とすべきではない、新しい列を追加する一般的にはデータの動き

を回避することができます。テーブル定義の末尾に追加すると、これはALTER TABLE ADD COLUMN操作で行うことができ、SSDTはこれを行うのに十分スマートです。ただし、テーブルの中央に追加した場合、デフォルトの動作は完全なデータ移動を行い、大きなテーブルでは非常にコストがかかる場合があります。これを避けるには:

  • 可能であれば、最後に列を追加してください。
  • これが不可能な場合、最近のバージョンのSSDT & SqlPackageには、末尾に追加されたかのように列の追加をテーブルの中央で処理するIgnoreColumnOrderフラグがあります。これは、(例えば、スキーマがあまりにもこのセットを持っている必要があります比較したり、テーブルのソースプロジェクト&データベースのバージョンとの違いを紹介します)いくつかの合併症を引き起こすが、展開中の不要なデータの移動を避けるために、通常は価値があることができ

行レベルセキュリティ(RLS)+データの操作の処理

データの移動を引き起こす変更を実際に行う必要がある場合、RLSのリスクはユーザーがテーブルのすべての行にアクセスできないことです。データモーションはテンポラリテーブルにデータをコピーした後、オリジナルの名前を変更すると、ユーザが見ることができなかった行が失われます。

解決策は、/p:AllowUnsafeRowLevelSecurityDataMovementフラグを設定することですが、ユーザーが行レベルのフィルタリングスキームに含まれていないことを確認することです。良い方法は、制限された権限(例えば、あなたのアプリケーションの役割)を持つユーザーにしかそれらのスキームを適用するのではなく、展開時により大きな権限を持つ役割(管理者の役割)を使用することです。これを行うと安全に配備できますが、フラグは少なくともこれについて警告し、偶発的なデータ消失を防ぎます。

+0

データベースプロジェクトで別途定義されているにもかかわらず、IgnoreColumnOrderを使用して追加された列が最後に追加されるということを正しく理解していますか?通常、テーブルのデータをスキミングするときには、カラムを順番に追加する傾向があります。しかし、特定の注文が必要な場合は、そのビューを使用する必要がありますか? – Anders

+0

特定の「管理者」SQLユーザーがすべての行を表示できるようにするには、セキュリティ述語のルールを作成する必要がありますか?管理スタジオを介してデータを表示すると、空のテーブルのように見える問題も解決します。現在のプロジェクトでは、user-idがセッション・コンテキストに設定され、個々のアプリケーション・ユーザー(SQLユーザーではない)の権限を判断するために使用されます。管理スタジオでデータを表示するには、適切なユーザーIDをコンテキストに設定する必要がありますが、これは明らかに面倒です。 – Anders

+0

列の順序について:論理的な「合理的な」順序のビューを使用する必要があります。テーブルには、途中で列を追加することはできません。彼らは最後に追加されるか、まったく新しいテーブルを作成します。そして、はい、列の順序を無視することは、プロジェクトでそのように見えなくても最後に置かれることを意味します。 –

関連する問題