私たちは、開発、テスト、本番を通じてデータベースの展開を自動化しようとしています。 SSDTを使用する私たちのアプローチは、異なる環境のDACPACを比較して更新スクリプトを生成し、最後の手順として、正しいWindowsログインを正しいユーザーにマッピングすることです。
SqlPackage.exeのドキュメント を見ると、マッピングが無視されることを意味するように見えるプロパティIgnoreUserLoginMappings
があるため、それらはdacpacに含まれていないため、更新中に更新されません。比較とスクリプト生成。ただし、抽出中にこのプロパティを使用すると、生成されるユーザーはログインなしで、dacpacで次のようになります。
<Element Type="SqlUser" Name="[Domain\Account]">
<Property Name="IsWithoutLogin" Value="True" />
<Relationship Name="DefaultSchema">
<Entry>
<Annotation Type="PersistedResolvableAnnotation" Name="[Domain\Account]">
<Property Name="TargetTypeStorage" Value="SqlSchema" />
</Annotation>
</Entry>
</Relationship>
</Element>
これは私たちが望むものではありません!その後に生成される更新は次のようになります。
CREATE USER [Domain\Account] WITHOUT LOGIN
WITH DEFAULT_SCHEMA = [Domain\Account];
私たちは何か悪いことをしていますか、これはバグですか?私は検索しましたが、このプロパティに関する多くの情報を見ることができませんか?
関連質問: ここ
SqlPackage.exeを使用すると、セキュリティオブジェクトが削除されません。
私も同じ問題を抱えていました。今後は、DACPACを使用してデータベースの変更を展開します。ターゲットSQL Serverから削除されないように、ユーザー、ロール、ログインを更新プロセスから除外する方法が必要です。
私たちのデータベースは数百のクライアントサイトにインストールされており、多くのSQL Serverインストールでは、その会社のDBAによってセキュリティが設定されています。多くの場合、彼らは独自のドメインログインとユーザーを追加し、場合によってはデフォルトよりも役割を厳しく制限します。
SQL Server Management Studio 2012内で「データ層アプリケーションのアップグレード」のオプションを選択すると、セキュリティオブジェクトを無視するオプションがないことに気付きました。レビューでは、ユーザーとロールが削除されることが実際に示されていました。
しかし、SqlPackage.exeを使用すると、セキュリティオブジェクトが削除されませんでした。これは、パラメーター "DropObjectsNotInSource"がデフォルトでfalseに設定されているためです。
"C:\Program Files (x86)\Microsoft SQL Server\110\DAC\bin\SqlPackage.exe" /Action:Publish /SourceFile:.\bin\debug\SandBox.dacpac /TargetServerName:sandboxserver /TargetDatabaseName:SandBox
唯一の欠点は、非推奨のオブジェクトをデータベースから削除する場合、展開後のスクリプトに削除を追加する必要があることです。
マイクロソフトが将来この機能を追加することを望みます。これらのオブジェクトは多くの場合、開発者ではなくDBAによって管理されます。