我在Windows上运行SQL Server(13.01)上的数据库。我喜欢使用SSDT将它部署到Linux上的Docker Container。
我可以完美地连接到在Docker上运行的服务器,并手动创建/删除数据库并使用数据。
问题是我无法发布它。我正在Powershell上执行以下脚本
PS: SqlPackage.exe /Action:Publish /SourceFile:"d.dacpac" /TargetConnectionString:"server=containeraddress;database=thedatabase;user id=sa;password=thepassword;
并收到以下错误。
无法连接到主服务器或目标服务器'数据库'。您必须在主服务器或目标服务器“数据库”中拥有具有相同密码的用户。 (Microsoft.Data.Tools.Schema.Sql)
我在目标服务器和源服务器上拥有相同的用户和相同的密码。
有没有人有同样的问题,知道如何解决它?
答案 0 :(得分:2)
您使用的是哪个版本的SqlPackage.exe?只有最新的候选版本的SqlPackage.exe支持SQL Server vNext CTP。可以在此处下载SqlPackage候选发布版:https://www.microsoft.com/en-us/download/details.aspx?id=54273
答案 1 :(得分:1)
我将在此处发布该内容,因为大多数答案都涉及拥有一个已编译的dacpac文件,这可能并非总是可能的。我没有看到类似的想法在其他地方发布给我在这里建议的解决方案。
鉴于您使用的是docker,并且如果您希望在容器内编译Visual Studio项目,则鉴于容器基础操作系统和映像的某些组合,可能无法使用msbuild创建dacpac文件。
您可以使用一系列基于unix的命令来还原数据库,请注意,Visual Studio数据库项目通常只是一系列SQL文件,下面显示了一个示例,在其中将SQL文件合并为一个文件并调用sqlcmd来运行脚本;
FROM mcr.microsoft.com/mssql/server
WORKDIR /init
ENV ACCEPT_EULA=Y
ENV MSSQL_SA_PASSWORD=MyPassword
EXPOSE 1433:1433
RUN apt-get update && apt-get install dos2unix
COPY /solution_folder/database/Tables/*.sql /init/
WORKDIR /database
RUN echo "CREATE DATABASE [database_name];\nGO\nUSE [database_name];\n” >> /database/create.sql
RUN for f in /init/*.sql; do dos2unix $f; cat $f >> /database/create.sql; echo "\nGO\n" >> /database/create.sql; done
RUN ( /opt/mssql/bin/sqlservr --accept-eula & ) | grep -q "Service Broker manager has started" && /opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P ‘MyPassword’ -i /database/create.sql && pkill sqlservr
“ dos2unix”的原因是在Visual Studio中创建的SQL文件具有唯一的隐藏的cr / lf(和其他字符),而linux版本的sqlcmd无法成功解释该隐藏的cr / lf并会导致错误(这有点奇怪)而这正是您希望跨平台数据库能够应付的事情
此外,在最终运行命令中,您必须临时启动sql server服务,否则您将收到错误;这是一个变通办法,有点儿怪异,我不确定sql sql server linux容器是否设计得足够好,足以完成像这样还原数据库的简单任务,细微之处在于构建和升级之间的区别。运行一个容器,并且需要这两个概念之间有某种令人满意的中间点才能使其工作。
鉴于这里不是还原的完整解决方案,它只处理项目文件中的表,尽管扩展到标量函数和存储过程应该不那么容易。