我正在努力通过 VS2013 部署 SQLProj(数据库项目),并且遇到一个问题,我可以使用一些反馈。
当我发布更改时,它会对表执行 CCRD(创建、复制、重命名、删除)操作。PreDeploy 脚本中的创建和复制以及 PostDeploy 脚本中的重命名、删除。我将这些语句封装在 Try...Catch 块中,并让它打印出错误消息。当部署前和部署后脚本遇到问题时,发布完成,显示发布成功。当这些脚本遇到错误时,我需要不同的行为。我希望这些脚本中遇到的任何错误都会导致发布失败。我尝试过使用 THROW 命令来引发错误,并且尝试过使用 RAISERROR 命令在执行时将严重性设置为 20,根据 BOL,该命令应该终止连接,但发布仍然以“成功”状态完成。
我经常使用SSDT数据比较工具将数据库数据从我们的集成环境同步到我们的生产环境。但是,我通常会遇到应该忽略列并且从不同步的情况。即使我检查 SSDT 发现的数据差异,同步操作也会发生在行级别,不幸的是我需要控制单元级别的同步。
大家有什么好的解决办法吗?
尝试在存储过程中使用 SQL Server 2016 STRING_SPLIT 函数。它在 SSMS 中解析正确。但在SSDT(最新版本)中,该函数无法解析,因此项目无法编译。有人知道如何解决这个问题吗?谢谢。
在我们的 VStudio 2015 解决方案中,我们有一系列 SSDT。其中之一是返回异常““SqlBuildTask”任务意外失败。Microsoft.Data.Tools.Schema.Sql.Build.BuildFailedException:具有相同键的条目已存在。” 。我进入 Microsoft.Data.Tools.Schema.SqlTasks.targets 并查看了(将其发布在下面)
<SqlBuildTask PostdeployItem="@(PostDeploy->'%(FullPath)')"
PredeployItem="@(PreDeploy->'%(FullPath)')"
RefactorLog="@(RefactorLog->'%(FullPath)')"
SqlTarget="@(SqlTarget)"
ContributorArguments="$(ContributorArguments)"
BuildExtensionConfiguration="@(BuildExtensionConfiguration)"
BuildContributors="$(BuildContributors)"
DeploymentExtensionConfiguration="@(DeploymentExtensionConfiguration)"
DeploymentContributors="$(DeploymentContributors)"
ConnectionString="$(TargetConnectionString)"
CreateScriptFileName="$(CreateScriptFileName)"
DacApplicationName="$(DacApplicationName)"
DacDescription="$(DacDescription)"
DacFile="@(DacFile)"
DacVersion="$(DacVersion)"
DatabaseName="$(TargetDatabase)"
DatabaseSchemaProviderName="$(DSP)"
DefaultSchema="$(DefaultSchema)"
DeploymentScriptName="$(DeployScriptFileName)"
DeployToDatabase="$(UpdateDatabase)"
GenerateCreateScript="$(GenerateCreateScript)"
GenerateDac="$(GenerateDac)"
ImplicitDllAssemblyName="$(AssemblyName)"
ImplicitDllAssemblyOwner="$(AssemblyOwner)"
ImplicitDllFileName="$(IntermediateTargetFullFileName)"
ImplicitDllSymbolsFileName="$(IntermediateSymbolsFullFileName)"
ImplicitDllGenerateSqlClrDdl="$(GenerateSqlClrDdl)"
ImplicitDllIsVisible="$(IsVisible)"
ImplicitDllPermissionSet="$(PermissionSet)"
IntermediateDirectory="$(GeneratedFilesIntermediatePath)"
ModelCollation="$(ModelCollation)"
OutputDirectory="$(TargetDir)"
PreserveHeaderComments="$(PreserveHeaderComments)"
Source="@(Build->'%(FullPath)')"
SqlCmdVariables="@(SqlCmdVariables)"
SqlReferencePath="@(SqlReferencePath)"
SuppressTSqlWarnings="$(SuppressTSqlWarnings)"
TreatTSqlWarningsAsErrors="$(TreatTSqlWarningsAsErrors)"
ValidateCasingOnIdentifiers="$(ValidateCasingOnIdentifiers)"
CmdLineInMemoryStorage="$(CmdLineInMemoryStorage)"
DefaultCollation="$(DefaultCollation)"
AnsiNullDefault="$(AnsiNullDefault)"
AnsiNulls="$(AnsiNulls)"
AnsiPadding="$(AnsiPadding)"
AnsiWarnings="$(AnsiWarnings)"
ArithAbort="$(ArithAbort)"
ConcatNullYieldsNull="$(ConcatNullYieldsNull)"
QuotedIdentifier="$(QuotedIdentifier)"
NumericRoundAbort="$(NumericRoundAbort)"
RecursiveTriggersEnabled="$(RecursiveTriggersEnabled)"
DatabaseChaining="$(DatabaseChaining)"
DatabaseState="$(DatabaseState)"
UpdateOptions="$(UpdateOptions)"
CloseCursorOnCommitEnabled="$(CloseCursorOnCommitEnabled)"
DefaultCursor="$(DefaultCursor)"
AutoClose="$(AutoClose)"
AutoCreateStatistics="$(AutoCreateStatistics)"
AutoShrink="$(AutoShrink)"
AutoUpdateStatistics="$(AutoUpdateStatistics)"
TornPageDetection="$(TornPageDetection)"
DatabaseAccess="$(DatabaseAccess)"
Recovery="$(Recovery)"
EnableFullTextSearch="$(EnableFullTextSearch)"
DefaultFilegroup="$(DefaultFilegroup)"
Trustworthy="$(Trustworthy)"
AutoUpdateStatisticsAsynchronously="$(AutoUpdateStatisticsAsynchronously)"
PageVerify="$(PageVerify)"
ServiceBrokerOption="$(ServiceBrokerOption)"
DateCorrelationOptimizationOn="$(DateCorrelationOptimizationOn)"
Parameterization="$(Parameterization)" …Run Code Online (Sandbox Code Playgroud) 我有一个在 Visual Studio 2015 和 TFS 源代码管理中使用 SSDT(SQL Server Data Tools)的数据库项目。
今天早上,当我尝试比较两个数据库(DB -> TFS)时,它不起作用,并且出现错误:
比较完成。检测到差异。有限的比较。详细信息请参见错误列表
错误列表窗口中的警告是:
严重性代码 描述 项目文件行抑制状态 警告 目标的登录名没有 VIEW ANY DEFINITION 权限。如果源是数据库,则比较将仅限于数据库范围的元素。
SSDT 的 SQL Server 用户是sa。
提前致谢
更新: 我通过以下查询修复了比较警告,但主要问题仍然存在:
USE [master]
GO
Grant VIEW ANY DEFINITION to [USERNAME];
GO
USE [DBNAME]
GO
GRANT CONNECT to [USERNAME]
GRANT VIEW DEFINITION TO [USERNAME]
Run Code Online (Sandbox Code Playgroud) 有没有一种方法可以在运行时导出 SQL Server 数据库项目 (Dacpac) 中的数据库引用?
我们正在构建一个使用 Dacpac 来部署数据库对象的产品。
我们的产品实施团队还使用 Dacpac 项目,方法是将数据库引用添加到产品 Dacpac 文件,然后将他们自己的附加对象添加到项目中。
我们面临的问题是 - 每次实现需要指向较新的产品发布版本时,必须手动更改实现 dacpac 中的父 dacpac 引用以引用新产品 dacpac 的新文件路径(在新版本)。我们在每个实施中都有多个实施团队和多个数据库项目。
有没有什么方法可以在运行时使用变量或参数或类似的东西导出数据库项目中的数据库引用(*.dacpac)?
我们有一个 DACPAC (sqlproj) 解决方案,其中包含一些表和一个运行一些 DML 查询的部署后脚本。如果 DML 查询失败(我提出严重性 = 20 的错误),我想回滚所有更改 - 包括 dacpac 完成的 DDL 更改和部署后文件更改。当我升级现有目标数据库时,这特别有用。
我正在努力在 DACPAC 发布时进行原子数据库升级 - 仅当部署后脚本中的所有内容都成功时,才应发布 DACPAC 解决方案中提到的所有 DDL 更改。
由于 DACPAC DDL 更改是在调用部署后脚本之前提交的,因此我认为使用 DacServices.GenerateDeployScript 将所有 DAC 更改生成为单个脚本文件将会有所帮助。看起来不太直截了当。
有没有人尝试过类似的事情(并且失败/通过)?
我面临着许多挑战,例如...创建/更改数据库不应该在事务中。回滚根本没有发生。
[编辑 11 月 10 日]:将 dacpac 生成的部署脚本粘贴到此处,以便我可以更好地解释我的问题(希望如此)
/*
Deployment script for 9Nov
This code was generated by a tool.
Changes to this file may cause incorrect behavior and will be lost if
the code is regenerated.
*/
GO
SET ANSI_NULLS, ANSI_PADDING, ANSI_WARNINGS, ARITHABORT, CONCAT_NULL_YIELDS_NULL, …Run Code Online (Sandbox Code Playgroud) 我有一个现有的数据库(SSDT 项目作为源),我必须在其中更新表。我只是将列类型从 更改nvarchar(MAX)为nvachar(256)。问题是,我有一个现有视图绑定到该表SCHEMABINDING。我无法编辑表列,因为SCHEMABINDING会阻止影响视图的更改。
以下脚本在 PreDeploymentScript 中执行。当我调用该DROP VIEW [base].[VIEW_DEPENDING_ON_TABLE]语句时,部署后视图丢失。我的想法是,在部署期间禁用SCHEMABINDING并在完成后启用它。这在 TSQL 脚本中怎么可能呢?或者有更好的方法来做到这一点吗?
IF EXISTS ( SELECT DATA_TYPE FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = N'base'
AND TABLE_NAME = 'TABLENAME'
AND COLUMN_NAME = 'Instance'
AND CHARACTER_MAXIMUM_LENGTH = -1)
AND NOT EXISTS (SELECT * FROM sys.indexes WHERE name='IX_TABLENAME_Instance' AND object_id = OBJECT_ID(N'[base].[TABLENAME]'))
BEGIN
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[base].[VIEW_DEPENDING_ON_TABLE]') AND type in (N'V'))
BEGIN
DROP VIEW [base].[VIEW_DEPENDING_ON_TABLE]
END
IF EXISTS …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
我每天必须导入大约50种不同类型的文件。其中一些只有几列,有些则多达250列。
平面文件连接始终将所有列默认为50个字符。某些列的长度可能超过50个字符,当然会导致错误。
目前,我正在使用记事本++进行愚蠢的搜索和替换-打开所有SISS程序包,替换为:
DTS:MaximumWidth="50"
Run Code Online (Sandbox Code Playgroud)
通过
DTS:MaximumWidth="500"
Run Code Online (Sandbox Code Playgroud)
这是一个烦人的解决方法。是否可以将Flatfile字符串列的默认长度设置为某个值?
我正在使用Microsoft Visual Studio Professional 2015和SQL Server数据工具14.0.61021.0开发
谢谢!
sql-server ×5
dacpac ×2
dac ×1
etl ×1
powershell ×1
sqlpackage ×1
sqlproj ×1
ssis ×1
ssis-2016 ×1
t-sql ×1