如何配置SQL Server DataTools项目,仅发布视图或存储过程不对比架构
完全可行!这是SQL Server数据库项目的典型场景之一
你完全可以只在项目里维护自己的视图和存储过程,不用管整个数据库的庞大架构,部署时也不需要做全量对比。下面是具体的实现方案:
1. 创建仅包含你对象的空数据库项目
- 在Visual Studio中新建一个SQL Server Database Project,一开始不用导入任何现有数据库对象,保持项目为空。
- 手动添加你的视图和存储过程:右键项目→「Add」→「New Item」,选择对应的模板(View/Stored Procedure),把你的代码粘贴进去;或者直接从现有数据库中生成这些对象的CREATE脚本,复制到项目的对应文件里就行。
2. 调整部署配置,跳过全架构对比
默认的部署会对比项目和目标数据库的完整架构,这不是我们要的。得改一下发布设置:
- 右键项目→「Properties」→「Deploy」选项卡,点击当前发布配置文件旁的「Edit」按钮。
- 在弹出的「Publish Database」窗口中切换到「Advanced」选项卡:
- 找到**「Drop objects in target but not in project」,把它设为False**——这是核心设置,能防止部署工具误删项目里没有的其他对象。
- 还可以勾选**「Do not alter database」**,避免修改数据库本身的属性(比如排序规则、恢复模式等)。
- 其他无关选项保持默认即可,重点就是让部署工具只关注你项目里的对象。
3. 部署时仅更新你的对象
当你需要修改视图或存储过程时,直接编辑项目里的对应文件,然后点击「Publish」按钮。部署工具会:
- 如果目标数据库里没有这个对象,就创建它;
- 如果对象已经存在,就用项目里的代码覆盖更新;
- 全程不会触碰任何不属于你的对象,也不需要做全架构对比。
额外小技巧:避免你的对象被意外覆盖
既然数据库所有者偶尔会覆盖你的修改,你可以给你的对象添加扩展属性来标识归属,比如:
EXEC sp_addextendedproperty @name = N'Owner', @value = N'你的名字/标识', @level0type = N'Schema', @level0name = N'dbo', @level1type = N'View', @level1name = N'你的视图名';
把这段代码也加到项目里,部署时会自动给对象加上标识,和所有者沟通时也有明确依据。
备选轻量化方案:直接用脚本部署
如果你不想用Visual Studio的数据库项目,也可以把你的视图和存储过程写成带CREATE OR ALTER的脚本:
CREATE OR ALTER VIEW dbo.你的视图名 AS SELECT ...; GO CREATE OR ALTER PROCEDURE dbo.你的存储过程名 AS BEGIN -- 存储过程逻辑 END GO
每次需要更新时,直接在SSMS或用sqlcmd执行这个脚本就行——不管对象是否存在,都能安全更新,完全不用管其他架构内容。
内容的提问来源于stack exchange,提问作者vanpersil




