我最近将我的一个项目更新到Visual Studio 2013.更新将我的.dbproj更改为.sqlproj,使其符合新的SQL项目格式.
在转换之后,我运行了一个与我的SQL项目和我的SQL 2008生产数据库进行模式比较,它现在认为每个对象都是不同的.通过模式比较工具进行调查后,看来差异在于每个对象定义还包括为该对象授予每个角色或用户的权限的语句.
因此,服务器端看起来像这样:
CREATE PROC MyCoolProc
BEGIN
--some code
END
GO
GRANT EXECUTE
ON OBJECT MyCoolProc TO MyAwesomeUser
AS [Schema];
GO
Run Code Online (Sandbox Code Playgroud)
并且同一对象的客户端看起来像这样:
CREATE PROC MyCoolProc
BEGIN
--some code
END
Run Code Online (Sandbox Code Playgroud)
为什么是这样?当我使用Visual Studio 2010运行模式比较时没有发生这种情况.此外,我查看了SQL比较工具的所有选项,但我找不到"忽略对象的权限声明".有人可以帮忙吗?
编辑
为了确保这是Visual Studio的SQL Compare工具而不是SQL Server本身的问题,我在我的登台和生产数据库之间重新运行Visual Studio 2010中的比较,并且对象定义不像他们那样包含对象权限在Visual Studio 2013中.
sql-server-2008 database-schema schema-compare visual-studio-2013 sqlproj
我有一个带有2个SQL项目DB1,DB2的Visual Studio 2013解决方案.
DB1有一个引用DB2的存储过程.
如果我在程序中使用.dacpac和同义词
SELECT * FROM [$(DB2)].[dbo].[Table1]
Run Code Online (Sandbox Code Playgroud)
然后将数据库中的Schema与SQL Project进行比较错误地将上述内容检测为更改,因为它不处理变量/同义词.
相反,我使用
SELECT * FROM DB2.[dbo].[Table1]
Run Code Online (Sandbox Code Playgroud)
并将存储过程构建类型更改为无(以便项目构建)然后从数据库到Proejct 进行架构比较**将"看不到"我的项目中的存储过程并在每个SQL数据库项目中添加新的过程相比
在模式比较后,我现在将看到
其中n =架构比较#!
如果有一种方法可以忽略构建错误SQL7501,那么它应该使用第二个选项,但它似乎不能被忽略.
另一种解决方案是保存模式比较并手动选择跳过所有引用DB2的过程但是我想检测这些过程中的更改.
这似乎是一个简单而常见的用例.有人为这个设计缺陷提出了解决方法吗?
在测试了凯文的答案之后,我已经确定了为什么我的一些观点没有正确处理SC.他的答案在技术上是正确的:
如果你在DB1中有一个视图:
SELECT * FROM DB1.dbo.Table1 T1
INNER JOIN DB2.dbo.Table2 T2
ON T2.Field1 = T1.Field1
Run Code Online (Sandbox Code Playgroud)
并在您的DB1 SQL Project中原始(没有自引用DB1)
SELECT * FROM dbo.Table1 T1
INNER JOIN [$(DB2)].dbo.Table2 T2
ON T2.Field1 = T1.Field1
Run Code Online (Sandbox Code Playgroud)
模式比较将无法正确替换变量并识别更改:[$(DB2)] - > $(DB2)
问题是自引用DB1.dbo.Table,在我的情况下,已插入大量连接的一半,其中许多是DB2引用.
这会导致SC错误地将所有[$(DB2)]标记为更改.可能是因为数据库sql没有在VS中"构建"并恢复到文本比较.
所以这不是一个真正的错误,但对于没有手动比较SQL的每一行的开发人员而言,这是一个令人困惑的结果.
我认为这个问题可以扩展到以下几点: …
sql schema database-project schema-compare visual-studio-2013
我正在使用Visual Studio 2017中的Schema Compare功能来比较数据库和数据库项目(.sqlproj)。如果我对项目进行了一些更改,它还会向某些模式文件中添加空白行。经过一番调查,我发现我并不是唯一面临此问题的人。从投票数来看,我猜想MS不会很快解决此问题。也许有人为此找到了任何解决方法?
sql-server database-project visual-studio schema-compare sql-server-data-tools
我发现在几乎所有情况下,我都将模式比较结果窗格的过滤器更改为"非跳过对象",以便我只看到那些已更改的对象.有没有办法将此过滤器设置为默认值(而不是"全部")?
我在Visual Studio 2012中使用SQL Server数据库项目,在比较和生成更新脚本时遇到以下问题:
在Visual Studio中,我添加了一个具有默认约束的列,例如:
[NewColumn] NVARCHAR(50) CONSTRAINT [DF_ExistingTable_NewColumn] NOT NULL DEFAULT N''
Run Code Online (Sandbox Code Playgroud)
不幸的是,默认约束的名称在以下情况下不会出现:
创建的更新脚本包含以下脚本(无约束名称):
ALTER TABLE [dbo].[ExistingTable]
ADD [NewColumn] NVARCHAR (50) DEFAULT N'' NOT NULL;
Run Code Online (Sandbox Code Playgroud)
这似乎是一个重大的疏忽,所以我想知道在哪里找到魔术开关在所有数据库操作中包含默认约束的名称.
sql-server constraints database-project schema-compare visual-studio-2012
看起来好像Visual Studio Database Project没有解析SQLCMD变量进行模式比较.
我所有的同义词都是这样的
CREATE SYNONYM [dbo].[addressesExtDB] FOR [$(ExtDB)].[dbo].[addresses];
Run Code Online (Sandbox Code Playgroud)
但是它们会被报告为与数据库不同.
当我使用正确'Specify SQLCMD Variabeles...'的-settings 进行模式更新时,将var ExtDB设置为'ExtDBnn'结果Synonym,数据库被正确设置为:
CREATE SYNONYM [dbo].[addressesExtDB] FOR [ExtDBnn].[dbo].[addresses];
Run Code Online (Sandbox Code Playgroud)
重新比较操作再次将所有同义词错误地显示为不同.因此比较应该解析sqlcmd-variabeles并使用结果与数据库进行比较.我是否想念这样做的选项,或者您是否遇到过同样的问题并找到了某种解决方案?
我有一个包含许多缓存/生成表的数据库。当我进行模式比较时,我想(永久)排除这些。有什么方法可以配置模式比较以忽略特定模式,或者更好的是,特定对象名称?例如,我想忽略名称以“XYZ”开头的“缓存”模式中的所有表。
我意识到如果我忽略一个对象一次,它的“忽略状态”就会持续存在。但是,我仍然会在比较结果中看到它(例如,图 1,000 被忽略的表)。我正在寻找一种永久隐藏或根本不显示被忽略对象的方法。
另一个例子是,如果我想将一个大型数据库拆分为多个可重用的项目。在运行模式比较时,我可能希望从每个项目中排除某些模式。
每次我尝试在Visual Studio 2015中对我的本地数据库进行架构比较时,Visual Studio都会崩溃并重新启动.
我已经尝试重新启动我的PC并删除并重新创建数据库(通过恢复它).
我在安装了SQL Server 2012的Windows 7 Ultimate x64计算机上运行Visual Studio 2015 Enterprise.
我有一个SQL Server数据库,其中包含默认架构和自定义架构.例如,两个表可能是database.dbo.table1和database.customschema.table2.
我想在源代码管理下保留"customschema"数据库对象,并且我已成功将这些对象加载到Visual Studio 2015 SQL Server数据库项目中.
但是,当我使用工具 - > SQL Server - >新架构比较...实用程序时,它会返回数据库中所有架构的差异.所以它会显示所有"dbo"表在数据库项目中不同/删除,即使我不"关心"那些表,因为我不打算将它们保存在源代码管理下的db项目中.
有没有办法限制结果只显示我的数据库项目和"customschema"对象的实际数据库之间的差异,并忽略与dbo对象的任何差异?
sql-server schema-compare visual-studio-2015 sql-server-data-project
我试图在同一台服务器上比较两个数据库的模式.
这两个数据库被命名为benchmarkdb和benchmarkdb_dev.
在Visual Studio 2017中,我转到工具> SQL Server>新架构比较...
从标有"选择源"和"选择目标"的下拉菜单(如下图所示),我想选择benchmarkdb作为源和bencmarkdb_dev目标.
单击选择源后,弹出"选择源模式",然后单击"选择连接..."按钮,这会弹出另一个弹出窗口.最新的弹出窗口(下图中右侧的弹出窗口)显示了我想要比较的两个数据库.
但是,在我为源或目标选择一个之后,所有弹出窗口关闭,但没有任何内容填充"选择源..."或"选择目标..."下拉菜单.事实上,它只是回到第一张图片.
有没有解决方案,所以我可以比较数据库之间的模式?
更新:
我在VS 2012,2015和2017上尝试了这一点.所有人都面临同样的问题.VS软件和系统软件是最新的.以下是我正在使用的某些版本的软件,如果有任何帮助的话.
Windows 7企业版SP1
VS 2012,2015和2017
SQL Server 2014
.NET Framework v4.7.02053
sql-server database-schema schema-compare visual-studio-2017