sql-server - 使用 Azure Pipeline 中的 SqlPackage 部署 DACPAC 会忽略参数并删除用户
问题描述
我在 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.
这很明显,因为刚刚删除了用户对数据库的权限。有什么建议可以避免这种情况,或者我唯一的选择是在完成后重新创建用户/权限?或者不完全使用该标志并通过部署后脚本执行所有“删除对象管道”?
作为参考,在我的发布任务上设置的附加参数是(它看起来很奇怪,但没有办法只指定我想要删除的对象):
/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
推荐阅读
- datetime - TIMESTAMP 上的 BIGQUERY TIMEZONE 转换。CET 到 UTC
- db2 - 尝试使用 Python 连接 DB2 上的表时出错 (SQL0332N)
- laravel - laravel 表单未提交
- java - 我的 targetSDKVersion 是 28,我无法在这个 sdk 版本上实现“拍照”功能
- discord.js - 如何通过命令更改昵称?
- windows-subsystem-for-linux - WSL2 时钟与 Windows 不同步
- c# - 带有 WMIService 的硬盘驱动器序列号是否可以更改?
- intellij-idea - 用于语言识别的 IntelliJ IDEA Alias
- angular - 如何使用角度元素定义自定义元素方法
- node.js - 为什么 Node.js npm node-cache expire 缓存不能正常工作?