我有一个 Visual Studio sql 项目,其表定义如下:
CREATE TABLE [dbo].[Hoerses]
(
[HoersId] INT NOT NULL PRIMARY KEY,
[DatePurchased] datetime NOT NULL CONSTRAINT [DF_Hoerses_DatePurchased] DEFAULT DATETIMEFROMPARTS(1985,01,01,0,0,0,0)
)
Run Code Online (Sandbox Code Playgroud)
当我使用“脚本”命令定位预先存在的 SQL 数据库时
sqlpackage.exe /Action:Script /SourceFile:DatabaseProject1.dacpac /Profile:publish.xml /OutputPath:deployscript_test.sql /TargetPassword:redacted
Run Code Online (Sandbox Code Playgroud)
然后,即使约束前后具有相同的名称和定义,我也会得到以下生成的 SQL:
PRINT N'Dropping [dbo].[DF_Hoerses_DatePurchased]...';
GO
ALTER TABLE [dbo].[Hoerses] DROP CONSTRAINT [DF_Hoerses_DatePurchased];
GO
PRINT N'Creating [dbo].[DF_Hoerses_DatePurchased]...';
GO
ALTER TABLE [dbo].[Hoerses]
ADD CONSTRAINT [DF_Hoerses_DatePurchased] DEFAULT DATETIMEFROMPARTS(1985,01,01,0,0,0,0) FOR [DatePurchased];
GO
PRINT N'Update complete.';
GO
Run Code Online (Sandbox Code Playgroud)
(我对试图阻止这种多余的重新创建的主要担忧是因为当它试图在实际部署/发布期间删除约束时,我偶尔会看到“超出锁定请求超时期限。”错误)
在尝试通过SqlPackage.exe部署DACPAC时,我们间歇性地看到以下错误:
An unexpected failure occurred: Object reference not set to an instance of an object..
Unhandled Exception: System.NullReferenceException: Object reference not set to an instance of an object.
at Microsoft.Data.Tools.Schema.Sql.SchemaModel.ReverseEngineerPopulators.Sql90TableBaseColumnPopulator`1.InsertElementIntoParent(SqlColumn element, TElement parent, ReverseEngineerOption option)
at Microsoft.Data.Tools.Schema.Sql.SchemaModel.ReverseEngineerPopulators.ChildModelElementPopulator`2.CreateChildElement(TParent parent, EventArgs e, ReverseEngineerOption option)
at Microsoft.Data.Tools.Schema.Sql.SchemaModel.ReverseEngineerPopulators.ChildModelElementPopulator`2.PopulateAllChildrenFromCache(IDictionary`2 cache, SqlReverseEngineerRequest request, OrdinalSqlDataReader reader, ReverseEngineerOption option)
at Microsoft.Data.Tools.Schema.Sql.SchemaModel.ReverseEngineerPopulators.TopLevelElementPopulator`1.Populate(SqlReverseEngineerRequest request, OrdinalSqlDataReader reader, ReverseEngineerOption option)
at Microsoft.Data.Tools.Schema.Sql.SchemaModel.SqlReverseEngineerImpl.ExecutePopulators(ReliableSqlConnection conn, IList`1 populators, Int32 totalPopulatorsCount, Int32 startIndex, Boolean progressAlreadyUpdated, ReverseEngineerOption option, SqlReverseEngineerRequest request)
at Microsoft.Data.Tools.Schema.Sql.SchemaModel.SqlReverseEngineerImpl.ExecutePopulatorsInPass(SqlReverseEngineerConnectionContext context, ReverseEngineerOption option, SqlReverseEngineerRequest request, …Run Code Online (Sandbox Code Playgroud) sql-server sql-server-2008-r2 sqlpackage sql-server-data-tools
我正在尝试创建bacpac文件以将我的数据库导出到azure.
在创建导出包(sqlpackage /a:Export)的同时,是否会让它忽略用户?
我正在尝试使用sqlpackage工具来发布想法CMD:
sqlpackage /action:Publish /SourceFile:"Database Services\bin\Release\Database Services.dacpac" /TargetDatabaseName:test /TargetConnectionString:"Data Source=TEST05,123;Integrated Security=True;Persist Security Info=False;Pooling=False;MultipleActiveResultSets=False;Connect Timeout=60;Encrypt=False;TrustServerCertificate=False"
Run Code Online (Sandbox Code Playgroud)
我得到了这个例外:
** The TargetConnectionString argument cannot be used in conjunction with any other Target database arguments.
Run Code Online (Sandbox Code Playgroud)
我不明白这是什么意思,我可以使用以下命令提前部署它msbuild:
msbuild "Database Services\Database Services.sqlproj" /t:deploy /p:Configuration=Release /p:TargetConnectionString="Data Source=TEST05,123;Integrated Security=True;Persist Security Info=False;Pooling=False;MultipleActiveResultSets=False;Connect Timeout=60;Encrypt=False;TrustServerCertificate=False" /p:BlockOnPossibleDataLoss=False /p:TargetDatabase="test"
Run Code Online (Sandbox Code Playgroud)
我发现了一个可能相关的线程:
我们一直使用.sqlproj扩展使用VS2012 SSDT进行数据库设计和开发,并使用带有DACPAC的SQLPackage部署到SQL Server ...或者从Visual Studio设置发布规则.
我们已将数据库迁移到Amazon RDS SQL Server.
我们最近对数据库设计做了一些更改,并且我尝试发布更改,但是我收到了这个错误.
Error SQL72014: .Net SqlClient Data Provider: Msg 15151, Level 16, State 1, Line 1 Cannot find the user 'dbo', because it does not exist or you do not have permission.
Error SQL72045: Script execution error. The executed script:
REVOKE INSERT
ON OBJECT::[dbo].[table_name] TO [database_role] CASCADE
AS [dbo];
Run Code Online (Sandbox Code Playgroud)
我到处搜索了如何将这种类型的数据库项目发布到亚马逊,除了为模式维护本地SQL Server数据库并购买Red-Gate SQL Compare以迁移更改..我很难过...
任何建议将不胜感激.
amazon-web-services amazon-rds sqlproj sqlpackage sql-server-data-tools
我正在尝试生成一个输出dacpac文件,然后我可以将其部署到不同的环境中.到目前为止,我使用目标发布直接从msbuild进行部署,例如:
msbuild dbproject.sqlproj /t:Build;Publish /p:SqlPublishProfilePath=test.publish.xml /p:UpdateDatabase=True /p:PublishScriptFileName=test.sql
Run Code Online (Sandbox Code Playgroud)
生成的输出脚本的大小(仅供参考,因为UpdateDatabase设置为true)为2.5MB.
我的新方法是只构建项目,存储dacpac然后使用sqlpackage进行部署,并执行"发布"操作.这个新方法报告了msbuild SqlPublishTask未报告的一些警告.
作为参考,我运行了下一个命令:
sqlpackage.exe /action:script /outputpath:test.sql /sourcefile:dbproject.dacpac /pr:test.publish.xml
Run Code Online (Sandbox Code Playgroud)
并且输出脚本的大小现在是4.9MB.
报告的具体警告不在此关注,关注的是脚本不同,我的问题是有什么区别的?
更重要的是哪一个是最好/最安全的部署方法?
Visual Studio 2013 具有允许在 SSDT 项目和目标数据库之间执行数据比较的功能。
考虑到这些要求,我想做这样的事情作为我们构建和部署过程的一部分:
目前,我有一个脚本来处理子弹号。1 通过使用 DACPAC 通过sqlpackage.exe进行模式比较。不过,似乎无法使用 sqlpackage 执行数据比较,而且我还没有找到任何其他替代方案。在 VS 2010 中,可以通过命令窗口运行数据比较,但我在 VS 2013 中没有看到任何关于此的文档......
因此,我的问题是是否存在允许通过例如 Powershell 脚本以编程方式运行数据比较的 API 和/或其他工具。
我正在尝试自动化 SQL 部署,包括用户和角色。当我在 Sql Management Studio 中创建用户时它可以工作,但是当我部署 dacpack 时我得到 SqlException: Login Failed for user 'MyUser'
我在本地主机上安装了 SQL Server 2016,同时启用了 Sql Server 和 Windows 身份验证。
我在 Visual Studio 中有包含这些文件的 Sql 数据库项目:
MyUser.sql [构建操作=构建]
CREATE USER [MyUser] WITH Password='$(MyUserPassword)';
Run Code Online (Sandbox Code Playgroud)RolesMembership.sql [构建动作=构建]
ALTER ROLE [db_datareader] ADD MEMBER [MyUser]
GO
ALTER ROLE [db_datawriter] ADD MEMBER [MyUser]
Run Code Online (Sandbox Code Playgroud)我构建它并使用命令行部署创建的 dacpac:
SqlPackage.exe /Action:Publish
/SourceFile:"MyDatabase.dacpac"
/Profile:"MyDatabase.publish.xml"
/v:MyUserPassword=c2Aaaaaaaaaaaa`
Run Code Online (Sandbox Code Playgroud)当我在 sql management studio 中执行此脚本时,它会起作用。但是当我使用 SqlPackage 部署它时,它会导致
SqlException: 用户“MyUser”登录失败
编辑:
我调查了生成的 sql 脚本,其中包括REVOKE CONNECT:
CREATE USER [MyUser] …Run Code Online (Sandbox Code Playgroud) sql-server database-project dacpac sqlpackage sql-server-2016
我们已经开始使用SSDT来管理脚本部署。最初,我们使用Schema Compare并取消选中了我们不想部署的部分。现在,我们需要使用仅包含在“发布”功能中的“预部署”和“部署后”脚本,并且我们还尝试清理排除的部分。
在发布中添加了2个差异,但没有在“模式比较”中添加这些差异,即使设置与我可以设置的相近,我似乎也无法弄清。
首先是Publish脚本想要删除dacpac中不存在的表的统计信息,即使DropStatisticsNotInSource将其设置为false。我能够根据SSDT / SqlPackage丢弃统计信息中的DeploymentFilterContributor答案来解决此问题。
第二个继续让我难过。大多数应用程序安全性都是通过授予角色来实现的,并且取决于环境,使各个系统帐户成为成员,但是在dev数据库中,也没有角色的用户(通常是管理员,但具有各种权限的实用程序)。我们在不同的环境中有不同的用户。我的长期目标是仅让用户担任角色,但我们还没有。同时,我们需要将用户排除在外。我从设置Exclude Users,开始ExcludeLogins,ExcludeRoleMembership这是我们在“模式比较”中使用的功能,并且效果很好。但是,在“发布”脚本中,我们获得了REVOKE CONNECT脚本(但不是DROP LOGIN或DROP USER)。
我已经阅读了使用SqlPackage.exe发布DACPAC时防止用户掉线,以及在SqlPackage.exe部署的dacpac中创建用户时导致登录失败SqlException(这看起来像是类似的脚本结果,目的不同,也没有答案)。我曾尝试使用AgileSqlClub.DeploymentFilterContributor有IgnoreType(Login),IgnoreType(User),IgnoreType(RoleMembership),以及IgnoreType(Permissions),IgnoreSecurity。前3个无效。最后2个(我也尝试过等效的SSDT config选项)也删除GRANT了我想针对数据库角色包含的脚本。
我觉得我应该能够执行此操作而无需创建自定义项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> …Run Code Online (Sandbox Code Playgroud) 我正在使用 sqlpackage 实用程序和 MSBuild 从我们的数据库和数据库项目生成源和目标 .dacpac 文件。我知道我可以生成发布脚本,甚至可以制作部署报告,但这些报告只是高级别的报告。我想要做的是能够提供一份报告,准确地向我展示这两个 dacpac 之间的差异。例如,生成的发布脚本和 DeployReport.xml 向我显示特定的存储过程已更改并将被覆盖,但它没有向我显示存储过程的哪些行已更改,并且由于它是一个非常长的存储过程,手动解决这个问题需要相当多的努力。
到目前为止,我已经尝试从 .dacpac 文件中提取包含的 model.xml 并使用 Diff 工具将我的 source.dacpac 中的 model.xml 与 target.dacpac 进行比较,但是如果一个是从实时数据库生成的,并且其他是从数据库项目构建的,不幸的是,它们差异太大,无法向我展示有用的视觉效果。
在 Visual Studio 中,我当然可以打开“架构比较”工具并以这种方式比较我的 dacpac,但这过于手动,我正在寻找更自动化的解决方案。至少,从命令行触发此“模式比较”的方法会很好。
比较两个 dacpac 文件并详细显示它们之间的差异的最佳方法是什么?即这 5 个存储过程发生了变化,并直观地向我展示这 5 个存储过程中的每一个中哪些行发生了变化?我可以将某种解决方案用管道胶带粘在一起,但我无法购买任何第三方工具,我受制于 MS 提供的功能和我自己有限的功能。
sql-server powershell visual-studio sqlpackage sql-server-data-tools
sqlpackage ×10
sql-server ×6
msbuild ×2
amazon-rds ×1
azure ×1
bacpac ×1
cmd ×1
dacpac ×1
powershell ×1
sql ×1
sqlproj ×1