6

SSDT を使用してスクリプトの展開を管理し始めました。最初はスキーマ比較を使用し、展開したくない部分のチェックを外しました。パブリッシュ機能にのみ含まれる Pre-Deploy スクリプトと Post-Deploy スクリプトを使用する必要があり、除外していたビットをクリーンアップしようとしています。

パブリッシュには、スキーマ比較にはなかった 2 つの違いが追加されていますが、設定が可能な限り近いにもかかわらず、理解できないようです。

DropStatisticsNotInSource1 つ目は、パブリッシュ スクリプトが、false に設定されていても、dacpac に存在しないテーブルの統計を削除することです。SSDT/SqlPackage drops statisticsの DeploymentFilterContributor の回答に基づいて、これを回避できました。

しかし、2番目は私を困惑させ続けています。ほとんどのアプリケーション セキュリティはロールへの付与によって行われ、環境に応じてさまざまなシステム アカウントがメンバーになりますが、開発データベースのロールに含まれていないユーザーもいます (多くの場合、管理者ですが、さまざまな権限を持つユーティリティも含まれます)。さまざまな環境にさまざまなユーザーがいます。ユーザーだけを役割にするという長期的な目標がありますが、まだそこには到達していません。それまでの間、ユーザーがドロップされないように除外する必要があります。スキーマ比較で使用したExclude Users, ExcludeLogins, を設定することから始めましたが、うまくいきました。ExcludeRoleMembershipただし、パブリッシュ スクリプトでは、スクリプトを取得します(またはREVOKE CONNECTではありません)。DROP LOGINDROP USER

SqlPackage.exe を使用して DACPAC を公開するときにユーザーの削除を防止する を読み、SqlPackage.exe によって展開された dacpac でユーザーを作成すると、ログインに失敗した SqlException が発生します(これは、目的が異なる同様のスクリプトの結果のようで、回答もありません)。AgileSqlClub.DeploymentFilterContributorIgnoreType(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 (最新だと思います)。

4

3 に答える 3

0

SSDT の create user ステートメントの後に「GRANT CONNECT TO [YourUser]」を追加できますか? 取り消し接続の実行をオーバーライドします。

CREATE USER [YourUser] FOR EXTERNAL PROVIDER
GO
GRANT CONNECT TO [YourUser]
GO
于 2020-11-30T23:45:08.407 に答える