问题:
在运行 sqlpackage.exe 以应用 sql dacpac 时,它偶尔会在代理/SignalR 相关对象上失败,这会破坏构建:
*** Could not deploy package.
Error SQL72014: .Net SqlClient Data Provider: Msg 15151, Level 16, State 1, Line 1 Cannot drop the service 'Xxxxxx_xxxxx_0de7d69e-48ac-4a2b-95ef-d758d69b2a1e_Receiver', because it does not exist or you do not have permission.
Error SQL72045: Script execution error. The executed script:
DROP SERVICE [Xxxxxx_xxxxx_0de7d69e-48ac-4a2b-95ef-d758d69b2a1e_Receiver];
这是我们的sqlpackage.exe
命令行参数:
/p:TreatVerificationErrorsAsWarnings=True /p:DoNotAlterChangeDataCaptureObjects=True /p:DropIndexesNotInSource=True /p:DropObjectsNotInSource=True /p:ExcludeObjectTypes=Users;Logins;RoleMembership;Permissions;Credentials;DatabaseScopedCredentials;LinkedServerLogins;LinkedServers /p:BlockOnPossibleDataLoss=False
同样,失败率是每 10 次运行中的 1 次,并且没有人手动删除这些对象,因此我不知道为什么如果它知道它就无法删除该对象。有什么好的解决方案可以使其始终如一地应用吗?
尽管没有人手动删除这些对象,但它似乎
SqlDependency
用于检测数据库更改。SqlDependency 创建/删除临时对象,因此,如果应用程序在发布期间使用 with/p:DropObjectsNotInSource=True
选项运行,则当部署脚本由 sqlpackage 执行时,该对象可能不再存在。一种选择是在发布 dacpac 时停止应用程序。您还可以在发布期间排除问题对象(例如使用
DoNotDropObjectTypes
选项)。