SSDT を使用してスクリプトの展開を管理し始めました。最初はスキーマ比較を使用し、展開したくない部分のチェックを外しました。パブリッシュ機能にのみ含まれる Pre-Deploy スクリプトと Post-Deploy スクリプトを使用する必要があり、除外していたビットをクリーンアップしようとしています。
パブリッシュには、スキーマ比較にはなかった 2 つの違いが追加されていますが、設定が可能な限り近いにもかかわらず、理解できないようです。
DropStatisticsNotInSource
1 つ目は、パブリッシュ スクリプトが、false に設定されていても、dacpac に存在しないテーブルの統計を削除することです。SSDT/SqlPackage drops statisticsの DeploymentFilterContributor の回答に基づいて、これを回避できました。
しかし、2番目は私を困惑させ続けています。ほとんどのアプリケーション セキュリティはロールへの付与によって行われ、環境に応じてさまざまなシステム アカウントがメンバーになりますが、開発データベースのロールに含まれていないユーザーもいます (多くの場合、管理者ですが、さまざまな権限を持つユーティリティも含まれます)。さまざまな環境にさまざまなユーザーがいます。ユーザーだけを役割にするという長期的な目標がありますが、まだそこには到達していません。それまでの間、ユーザーがドロップされないように除外する必要があります。スキーマ比較で使用したExclude Users
, ExcludeLogins
, を設定することから始めましたが、うまくいきました。ExcludeRoleMembership
ただし、パブリッシュ スクリプトでは、スクリプトを取得します(またはREVOKE CONNECT
ではありません)。DROP LOGIN
DROP USER
SqlPackage.exe を使用して DACPAC を公開するときにユーザーの削除を防止する を読み、SqlPackage.exe によって展開された dacpac でユーザーを作成すると、ログインに失敗した SqlException が発生します(これは、目的が異なる同様のスクリプトの結果のようで、回答もありません)。AgileSqlClub.DeploymentFilterContributorをIgnoreType(Login)
, IgnoreType(User)
, およびIgnoreType(RoleMembership)
,で使用しようとしましIgnoreType(Permissions)
たIgnoreSecurity
。最初の 3 つは効果がありませんでした。最後の 2 つ (同等の SSDT 構成オプションも試しました) ではGRANT
、db ロールに対して含めたいスクリプトも削除されました。
DeploymentContributor
カスタムを作成したり、デプロイ後にこれらすべてのユーザーのスクリプトを作成したりせずに、これを実行できるはずだと思います。REVOKE CONNECT
これらの呼び出しを取り除くにはどうすればよいですか?
また、Visual Studio が実際にそのパスで SqlPackage.exe を呼び出しているか、代わりにライブラリを使用しているかを誰かが知っている場合は、その情報をいただければ幸いです...自分のマシンで 5 つの SqlPackage.exe を動作させることができないようですVS が使用するビルド済みの .dacpac および .publish.xml ファイルを使用します。
参照用に完全な公開プロファイルを含めます。
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<AdditionalDeploymentContributors>AgileSqlClub.DeploymentFilterContributor</AdditionalDeploymentContributors>
<!--AdditionalDeploymentContributorArguments>SqlPackageFilter0=IgnoreType(Statistics);SqlPackageFilter1=IgnoreType(Login);SqlPackageFilter2=IgnoreType(User);SqlPackageFilter3=IgnoreType(RoleMembership);SqlPackageFilter4=IgnoreSchema(SEQUENCES)</AdditionalDeploymentContributorArguments-->
<!--AdditionalDeploymentContributorArguments>SqlPackageFilter4=IgnoreSchema(SEQUENCES)</AdditionalDeploymentContributorArguments-->
<AdditionalDeploymentContributorArguments>SqlPackageFilter0=IgnoreType(Statistics);SqlPackageFilter1=IgnoreSecurity</AdditionalDeploymentContributorArguments>
<IncludeCompositeObjects>True</IncludeCompositeObjects>
<TargetDatabaseName>BRM</TargetDatabaseName>
<DeployScriptFileName>BRM.sql</DeployScriptFileName>
<TargetConnectionString>Data Source=mydb;Integrated Security=True;Persist Security Info=False;Pooling=False;MultipleActiveResultSets=False;Connect Timeout=60;Encrypt=False;TrustServerCertificate=True</TargetConnectionString>
<BlockOnPossibleDataLoss>True</BlockOnPossibleDataLoss>
<ExcludeAggregates>False</ExcludeAggregates>
<ExcludeApplicationRoles>False</ExcludeApplicationRoles>
<ExcludeAssemblies>True</ExcludeAssemblies>
<ExcludeAsymmetricKeys>True</ExcludeAsymmetricKeys>
<ExcludeBrokerPriorities>True</ExcludeBrokerPriorities>
<ExcludeCertificates>True</ExcludeCertificates>
<ExcludeExternalDataSources>True</ExcludeExternalDataSources>
<ExcludeExternalFileFormats>True</ExcludeExternalFileFormats>
<ExcludeExternalTables>True</ExcludeExternalTables>
<ExcludeFilegroups>True</ExcludeFilegroups>
<ExcludeFileTables>True</ExcludeFileTables>
<ExcludeFullTextCatalogs>True</ExcludeFullTextCatalogs>
<ExcludeFullTextStoplists>True</ExcludeFullTextStoplists>
<ExcludePartitionFunctions>True</ExcludePartitionFunctions>
<ExcludePartitionSchemes>True</ExcludePartitionSchemes>
<ExcludeQueues>True</ExcludeQueues>
<ExcludeRemoteServiceBindings>True</ExcludeRemoteServiceBindings>
<IgnoreRoleMembership>True</IgnoreRoleMembership>
<ExcludeRules>True</ExcludeRules>
<ExcludeSecurityPolicies>True</ExcludeSecurityPolicies>
<ExcludeServices>True</ExcludeServices>
<ExcludeSignatures>True</ExcludeSignatures>
<ExcludeUserDefinedDataTypes>True</ExcludeUserDefinedDataTypes>
<ExcludeUserDefinedTableTypes>True</ExcludeUserDefinedTableTypes>
<ExcludeUsers>True</ExcludeUsers>
<ExcludeXmlSchemaCollections>True</ExcludeXmlSchemaCollections>
<DropObjectsNotInSource>True</DropObjectsNotInSource>
<DropPermissionsNotInSource>False</DropPermissionsNotInSource>
<DropRoleMembersNotInSource>False</DropRoleMembersNotInSource>
<DisableAndReenableDdlTriggers>False</DisableAndReenableDdlTriggers>
<IncludeTransactionalScripts>True</IncludeTransactionalScripts>
<ProfileVersionNumber>1</ProfileVersionNumber>
<DropStatisticsNotInSource>False</DropStatisticsNotInSource>
<ExcludeLogins>True</ExcludeLogins>
<ExcludeAudits>True</ExcludeAudits>
<ExcludeClrUserDefinedTypes>True</ExcludeClrUserDefinedTypes>
<ExcludeCredentials>True</ExcludeCredentials>
<ExcludeCryptographicProviders>True</ExcludeCryptographicProviders>
<ExcludeDatabaseScopedCredentials>True</ExcludeDatabaseScopedCredentials>
<ExcludeDatabaseAuditSpecifications>True</ExcludeDatabaseAuditSpecifications>
<ExcludeEndpoints>True</ExcludeEndpoints>
<ExcludeErrorMessages>True</ExcludeErrorMessages>
<ExcludeEventSessions>True</ExcludeEventSessions>
<ExcludeLinkedServerLogins>True</ExcludeLinkedServerLogins>
<ExcludeLinkedServers>True</ExcludeLinkedServers>
<ExcludeRoutes>True</ExcludeRoutes>
<ExcludeSearchPropertyLists>True</ExcludeSearchPropertyLists>
<ExcludeServerAuditSpecifications>True</ExcludeServerAuditSpecifications>
<ExcludeServerRoleMembership>True</ExcludeServerRoleMembership>
<ExcludeServerRoles>True</ExcludeServerRoles>
<ExcludeServerTriggers>True</ExcludeServerTriggers>
<DoNotDropLogins>True</DoNotDropLogins>
<DoNotDropUsers>True</DoNotDropUsers>
<DoNotDropRoleMembership>True</DoNotDropRoleMembership>
<DoNotDropServerRoleMembership>True</DoNotDropServerRoleMembership>
</PropertyGroup>
<ItemGroup>
<SqlCmdVariable Include="mscrm">
<Value>mscrm</Value>
</SqlCmdVariable>
<SqlCmdVariable Include="sysdb">
<Value>sysdb</Value>
</SqlCmdVariable>
</ItemGroup>
</Project>
VS2015 Update 3 および SSDT 14.0.61712.050 (最新だと思います)。