我最近将我的一个项目更新到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
并且同一对象的客户端看起来像这样:
CREATE PROC MyCoolProc BEGIN --some code END
为什么是这样?当我使用Visual Studio 2010运行模式比较时没有发生这种情况.此外,我查看了sql比较工具的所有选项,但我找不到“忽略对象的权限声明”.有人可以帮忙吗?
编辑
为了确保这是Visual Studio的sql Compare工具而不是sql Server本身的问题,我在我的登台和生产数据库之间重新运行Visual Studio 2010中的比较,并且对象定义不像他们那样包含对象权限在Visual Studio 2013中.
解决方法
看来,在Visual Studio 2010的sql比较工具“模式比较选项”窗口的选项下,“对象类型”选项卡有一个复选框,表示您要忽略的所有对象类型.它默认选中“扩展属性”和“权限”.
与Visual Studio 2013的sql比较工具“架构比较选项”窗口相比,其选项卡“对象类型”具有要包含在比较中的所有对象类型的复选框.在“Application-scoped”树节点下,默认情况下会检查所有对象类型.取消选中“扩展属性”和“权限”会导致此sql比较工具的行为与Visual Studio 2010比较工具完全相同.
这可以防止服务器返回无关权限和扩展属性作为每个对象定义的一部分.希望这可以帮助遇到同样问题的其他人.