如何在Visual Studio中开发t-sql?
How to develop t-sql in Visual Studio?
我们使用 Visual Studio 2013 和 SSDT 主要用于版本控制 t-sql 代码,所以 sql 是在开发服务器上开发的,然后我们使用模式比较来传输脚本进入 visual studio(并签入 Git)。在部署之前(我们目前也使用模式比较)我们必须替换数据库和服务器引用(使用 [$(database)] 等)。如果我们在dev server中改代码再对比,这样的SQLCMD变量又丢失了。 (我希望 schema compare 足够聪明以保留 SQLCMD 变量,但我找不到实现此目的的方法)。
合乎逻辑的步骤是从一开始就在 visual studio 中发展 sql。但到目前为止,很难说服团队中的任何人这样做。一个人可以写sql并在VS中执行它,没问题。也可以切换成SQLCMD模式执行,就可以了。但是当你创建例如VS中的视图,必须写create语句,当然可以执行一次,但是改变视图再执行create语句会报错
所以我的问题是,是否有人有一些关于如何专门在 Visual Studio 中进行数据库开发的基本技巧。我们能够直接获取数据库引用等所有内容,但无法获取开发过程。
一个古老的挑战。多年来,我们一直尝试按照定义的方式使用数据项目,但 运行 遇到了几个问题,包括这些项目似乎随着 Visual Studio.[=11 的每次发布而改变。 =]
现在,我们仅使用数据项目与TFS 集成以进行工作项管理和源代码控制。为了在 Visual Studio 中构建 sprocs/views,我们采用的方法是使用 drop/create 模式编写每个脚本。我们的脚本还包含安全性(我们犯了使用默认架构的错误......如果我能回到过去,我们会隔离架构并执行基于架构的角色级别安全性)。
对于 table 模式,我们进行模式比较 to/from 版本化的模板数据库。
典型的存储过程如下所示:
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[sp_MyStoredProcedure]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[sp_MyStoredProcedure]
GO
CREATE PROCEDURE [dbo].[sp_MyStoredProcedure]
@MyParameter int
AS
BEGIN
-- Stored Procedure Guts
select 1
END
祝你好运......最终,它只需要为你的团队工作。
SSDT 已经足够成熟,可以使用它来创建脚本和部署更改,但与使用 sqlpackage.exe
进行部署相比,您应该放弃使用架构
该过程类似于:
-在vs/ssdt中编写代码
-build 生成 dacpac 的项目(在您的机器或 ci 服务器上)
- 将 dacpac 部署到数据库实例,如果需要可以使用变量,以使数据库保持最新状态。使用sqlpackage.exe部署或生成可以手动部署的脚本
应该很简单,但如果您有任何不确定的地方,请询问!
埃德
几年来,我一直在使用 Visual Studio 数据库项目简化本地数据库开发和部署。这里有一些提示。
一般...
使用本地数据库实例:每个开发人员都应该在本地安装自己的数据库实例。所有脚本(tables、视图、存储过程等)都应在 Visual Studio 中开发。创建用于将项目部署到本地数据库实例的发布配置文件。
使用发布功能:令人困惑的是Visual Studio同时提供部署和发布选项,它们最终做同样的事情。我建议只使用发布,因为它在 UI 中更为突出,并且您可以创建配置文件来配置各种数据库实例的部署过程。
保持本地数据库最新:当开发人员在数据库项目中进行更改并将其签入源代码管理时,其他开发人员应签出这些更改并重新发布项目到他们的本地数据库。
创建与更改语句
您的所有语句都应该是 Create 语句。不需要 Alter 语句或存在性检查。一切都应该像第一次创建数据库对象一样编写脚本。当你部署或发布时,VS 会知道是否对现有对象发出 Alter 语句。
数据
一些想法:
将您的数据编写成一系列插入语句。将它们包含在数据库项目的 post-部署脚本中。但这可能很乏味且容易出错。
保留一个包含所有测试数据的数据库备份。首次设置开发环境时,从备份创建数据库。在对数据进行重大更改后,创建一个新备份并让您的开发人员从备份中重新创建他们的数据库。在大多数情况下,如果备份与项目中定义的模式不同步也没关系——只需重新发布项目(确保关闭 "Re-create database" 设置,以便只发布差异,因此数据是没有丢失)。
可能有第 3 方工具可以执行此操作,在这种情况下它们值得研究。
创建您自己的数据部署解决方案。我的涉及以下内容并且工作得非常好(但需要大量时间和精力!):
- 所有数据存储在 XML 个文件中 - 每个 table 一个文件 - 其结构类似于 table
- 一个executable读取XML文件并为每行数据生成SQL合并(或insert/update)语句并将它们保存到SQL 脚本
- 数据库项目中的预构建事件 运行 executable 并将生成的 SQL 脚本复制到项目中的 post-部署脚本
- 发布项目,数据将在post-部署
期间推送
Test/Production 部署
发布功能:您可以为测试和生产环境创建发布配置文件。但是,它将包括您的预部署脚本和 post 部署脚本,您将无法获得其他选项提供的多功能性。
dacpacs: Ed Elliott 在他的回答中涵盖了它们。优点:不需要 Visual Studio 部署,它们可以通过 SQL Management Studio 或命令行使用 sqlpackage.exe 部署,它们比 T-[=97 更容易使用=]部署脚本。
模式比较: 如果您可以使用 Visual Studio 进行部署并且您希望仔细检查所有正在部署的更改,那么模式比较可能会很好。您还可以有选择地忽略更改,这在您没有足够幸运拥有完全反映生产环境的开发环境时很有用。
我们目前正在从 SSMT 迁移到 SSDT。我看到我们都面临着同样的问题,很奇怪网上没有好的教程(至少我还没有找到)。
首先是关于变量。我认为您需要更新到最新版本的 SSDT (20015.02) + DacFx。我们正在使用它,我们对变量没有任何问题。它还具有一些非常好的新功能,如果源中不存在某些对象,则不要将它们放在目标上。
但是我们找到了对所有跨数据库和链接服务器对象使用同义词的解决方案。例如,我们在 AnotherDatabase.dbo.NewTable 中有 table。我们为 [$(AnotherDatabase)].[dbo].[NewTable] 创建同义词 [dbo].[syn_AnotherDatabase_dbo_NewTable] 并在代码中使用它而不是引用其他数据库。与链接服务器相同:CREATE SYNONYM [syn_LinkedDatabase_dbo_NewTable] FOR [$(LinkedServer)].[$(LinkedDatabase)].[dbo].[NewTable].
现在谈谈开发过程。我们在项目属性中将调试设置为我们的开发数据库(稍后我们将为每个开发人员提供单独的数据库)。然后,当您修改存储的 procedures/views/functions/etc... 您打开脚本,将 CREATE 更改为 alter,您就可以像在 SSMT 中那样工作。您可以修改正文,执行它,在 window 中执行查询。但是,当您完成后,将其从 ALTER 改回 CREATE 并保存文件。
这里的问题是对象不支持 ALTER 语句。在这种情况下,您需要先发布代码。但实际上你这样做的频率并不高,所以我相信这没什么大不了的。
我们使用 Visual Studio 2013 和 SSDT 主要用于版本控制 t-sql 代码,所以 sql 是在开发服务器上开发的,然后我们使用模式比较来传输脚本进入 visual studio(并签入 Git)。在部署之前(我们目前也使用模式比较)我们必须替换数据库和服务器引用(使用 [$(database)] 等)。如果我们在dev server中改代码再对比,这样的SQLCMD变量又丢失了。 (我希望 schema compare 足够聪明以保留 SQLCMD 变量,但我找不到实现此目的的方法)。
合乎逻辑的步骤是从一开始就在 visual studio 中发展 sql。但到目前为止,很难说服团队中的任何人这样做。一个人可以写sql并在VS中执行它,没问题。也可以切换成SQLCMD模式执行,就可以了。但是当你创建例如VS中的视图,必须写create语句,当然可以执行一次,但是改变视图再执行create语句会报错
所以我的问题是,是否有人有一些关于如何专门在 Visual Studio 中进行数据库开发的基本技巧。我们能够直接获取数据库引用等所有内容,但无法获取开发过程。
一个古老的挑战。多年来,我们一直尝试按照定义的方式使用数据项目,但 运行 遇到了几个问题,包括这些项目似乎随着 Visual Studio.[=11 的每次发布而改变。 =]
现在,我们仅使用数据项目与TFS 集成以进行工作项管理和源代码控制。为了在 Visual Studio 中构建 sprocs/views,我们采用的方法是使用 drop/create 模式编写每个脚本。我们的脚本还包含安全性(我们犯了使用默认架构的错误......如果我能回到过去,我们会隔离架构并执行基于架构的角色级别安全性)。
对于 table 模式,我们进行模式比较 to/from 版本化的模板数据库。
典型的存储过程如下所示:
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[sp_MyStoredProcedure]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[sp_MyStoredProcedure]
GO
CREATE PROCEDURE [dbo].[sp_MyStoredProcedure]
@MyParameter int
AS
BEGIN
-- Stored Procedure Guts
select 1
END
祝你好运......最终,它只需要为你的团队工作。
SSDT 已经足够成熟,可以使用它来创建脚本和部署更改,但与使用 sqlpackage.exe
进行部署相比,您应该放弃使用架构该过程类似于:
-在vs/ssdt中编写代码 -build 生成 dacpac 的项目(在您的机器或 ci 服务器上) - 将 dacpac 部署到数据库实例,如果需要可以使用变量,以使数据库保持最新状态。使用sqlpackage.exe部署或生成可以手动部署的脚本
应该很简单,但如果您有任何不确定的地方,请询问!
埃德
几年来,我一直在使用 Visual Studio 数据库项目简化本地数据库开发和部署。这里有一些提示。
一般...
使用本地数据库实例:每个开发人员都应该在本地安装自己的数据库实例。所有脚本(tables、视图、存储过程等)都应在 Visual Studio 中开发。创建用于将项目部署到本地数据库实例的发布配置文件。
使用发布功能:令人困惑的是Visual Studio同时提供部署和发布选项,它们最终做同样的事情。我建议只使用发布,因为它在 UI 中更为突出,并且您可以创建配置文件来配置各种数据库实例的部署过程。
保持本地数据库最新:当开发人员在数据库项目中进行更改并将其签入源代码管理时,其他开发人员应签出这些更改并重新发布项目到他们的本地数据库。
创建与更改语句
您的所有语句都应该是 Create 语句。不需要 Alter 语句或存在性检查。一切都应该像第一次创建数据库对象一样编写脚本。当你部署或发布时,VS 会知道是否对现有对象发出 Alter 语句。
数据
一些想法:
将您的数据编写成一系列插入语句。将它们包含在数据库项目的 post-部署脚本中。但这可能很乏味且容易出错。
保留一个包含所有测试数据的数据库备份。首次设置开发环境时,从备份创建数据库。在对数据进行重大更改后,创建一个新备份并让您的开发人员从备份中重新创建他们的数据库。在大多数情况下,如果备份与项目中定义的模式不同步也没关系——只需重新发布项目(确保关闭 "Re-create database" 设置,以便只发布差异,因此数据是没有丢失)。
可能有第 3 方工具可以执行此操作,在这种情况下它们值得研究。
创建您自己的数据部署解决方案。我的涉及以下内容并且工作得非常好(但需要大量时间和精力!):
- 所有数据存储在 XML 个文件中 - 每个 table 一个文件 - 其结构类似于 table
- 一个executable读取XML文件并为每行数据生成SQL合并(或insert/update)语句并将它们保存到SQL 脚本
- 数据库项目中的预构建事件 运行 executable 并将生成的 SQL 脚本复制到项目中的 post-部署脚本
- 发布项目,数据将在post-部署 期间推送
Test/Production 部署
发布功能:您可以为测试和生产环境创建发布配置文件。但是,它将包括您的预部署脚本和 post 部署脚本,您将无法获得其他选项提供的多功能性。
dacpacs: Ed Elliott 在他的回答中涵盖了它们。优点:不需要 Visual Studio 部署,它们可以通过 SQL Management Studio 或命令行使用 sqlpackage.exe 部署,它们比 T-[=97 更容易使用=]部署脚本。
模式比较: 如果您可以使用 Visual Studio 进行部署并且您希望仔细检查所有正在部署的更改,那么模式比较可能会很好。您还可以有选择地忽略更改,这在您没有足够幸运拥有完全反映生产环境的开发环境时很有用。
我们目前正在从 SSMT 迁移到 SSDT。我看到我们都面临着同样的问题,很奇怪网上没有好的教程(至少我还没有找到)。
首先是关于变量。我认为您需要更新到最新版本的 SSDT (20015.02) + DacFx。我们正在使用它,我们对变量没有任何问题。它还具有一些非常好的新功能,如果源中不存在某些对象,则不要将它们放在目标上。
但是我们找到了对所有跨数据库和链接服务器对象使用同义词的解决方案。例如,我们在 AnotherDatabase.dbo.NewTable 中有 table。我们为 [$(AnotherDatabase)].[dbo].[NewTable] 创建同义词 [dbo].[syn_AnotherDatabase_dbo_NewTable] 并在代码中使用它而不是引用其他数据库。与链接服务器相同:CREATE SYNONYM [syn_LinkedDatabase_dbo_NewTable] FOR [$(LinkedServer)].[$(LinkedDatabase)].[dbo].[NewTable].
现在谈谈开发过程。我们在项目属性中将调试设置为我们的开发数据库(稍后我们将为每个开发人员提供单独的数据库)。然后,当您修改存储的 procedures/views/functions/etc... 您打开脚本,将 CREATE 更改为 alter,您就可以像在 SSMT 中那样工作。您可以修改正文,执行它,在 window 中执行查询。但是,当您完成后,将其从 ALTER 改回 CREATE 并保存文件。
这里的问题是对象不支持 ALTER 语句。在这种情况下,您需要先发布代码。但实际上你这样做的频率并不高,所以我相信这没什么大不了的。