使用 Azure Pipeline 中的 SqlPackage 部署 DACPAC 忽略参数并删除用户

Deploy DACPAC with SqlPackage from Azure Pipeline is ignoring arguments and dropping users

我在 Azure 中有一个发布管道,我在其中传递一个 .dacpac 工件(使用 VStudio 创建)以部署在本地 Sql Server 2016 中。它运行良好,但现在我想放弃通过 .dacpac 在我的服务器上存储表、视图、函数和存储过程。所以我在我的 VS 项目中这样做,然后尝试使用选项 /p:DropObjectsNotInSource=True 以及 /p:DoNotDropObjectType 甚至 /p:ExcludeObjectType 进行部署,以排除我不想删除的内容。

但是不管这些过滤器如何,一旦作业开始,表就会被删除(如预期的那样),但随后它会删除数据库用户。它还删除了我用于安装 Azure 代理的登录名的 db_owner 映射,然后尝试删除该登录名(这是配置为在部署期间进行身份验证的同一用户)。然后失败并出现此错误:

Error SQL72014: .Net SqlClient Data Provider: Msg 15151, Level 16, State 1, Line 1 Cannot drop the user '<Domain>\<User>', because it does not exist or you do not have permission.

这很明显,因为用户对数据库的权限刚刚被删除。有什么避免这种情况的建议,或者我唯一的选择是完成后重新创建 users/permissions?或者不完全使用该标志并通过 post-部署脚本执行所有 "drop objects plumbing"?

作为参考,在我的发布任务中设置的附加参数是(它看起来很奇怪,但无法仅指定我想要删除的对象):

/p:DropObjectsNotInSource=True /p:BlockOnPossibleDataLoss=false /p:DoNotDropObjectType="Aggregates,ApplicationRoles,Assemblies,AsymmetricKeys,BrokerPriorities,Certificates,ColumnEncryptionKeys,ColumnMasterKeys,Contracts,DatabaseRoles,DatabaseTriggers,Defaults,ExtendedProperties,ExternalDataSources,ExternalFileFormats,ExternalTables,Filegroups,FileTables,FullTextCatalogs,FullTextStoplists,MessageTypes,PartitionFunctions,PartitionSchemes,Permissions,Queues,RemoteServiceBindings,RoleMembership,Rules,SearchPropertyLists,SecurityPolicies,Sequences,Services,Signatures,SymmetricKeys,Synonyms,UserDefinedDataTypes,UserDefinedTableTypes,ClrUserDefinedTypes,Users,XmlSchemaCollections,Audits,Credentials,CryptographicProviders,DatabaseAuditSpecifications,DatabaseScopedCredentials,Endpoints,ErrorMessages,EventNotifications,EventSessions,LinkedServerLogins,LinkedServers,Logins,Routes,ServerAuditSpecifications,ServerRoleMembership,ServerRoles,ServerTriggers" /p:ExcludeObjectType="Aggregates,ApplicationRoles,Assemblies,AsymmetricKeys,BrokerPriorities,Certificates,ColumnEncryptionKeys,ColumnMasterKeys,Contracts,DatabaseRoles,DatabaseTriggers,Defaults,ExtendedProperties,ExternalDataSources,ExternalFileFormats,ExternalTables,Filegroups,FileTables,FullTextCatalogs,FullTextStoplists,MessageTypes,PartitionFunctions,PartitionSchemes,Permissions,Queues,RemoteServiceBindings,RoleMembership,Rules,SearchPropertyLists,SecurityPolicies,Sequences,Services,Signatures,SymmetricKeys,Synonyms,UserDefinedDataTypes,UserDefinedTableTypes,ClrUserDefinedTypes,Users,XmlSchemaCollections,Audits,Credentials,CryptographicProviders,DatabaseAuditSpecifications,DatabaseScopedCredentials,Endpoints,ErrorMessages,EventNotifications,EventSessions,LinkedServerLogins,LinkedServers,Logins,Routes,ServerAuditSpecifications,ServerRoleMembership,ServerRoles,ServerTriggers"

所以,我对自己说:我最初的尝试有两处错误:

  • 当您想在一个参数中使用多个值时,必须用分号 (;) 代替冒号将它们分隔开。
  • 如果要排除多个对象,参数名称必须是复数:/p:ExcludeObjectTypes

所以,通过类似下面的内容,我实现了我想要的:

/p:ExcludeObjectTypes=Users;Logins;RoleMembership;Permissions;Credentials;DatabaseScopedCredentials