我有一个名为fn_blah
的函数,它驻留在SQL Server 2000框的Master
数据库中。相同的函数驻留在SQL Server 2008框的master
数据库中。在SQL Server 2000框中,该函数在不指定所有者的情况下在不同的数据库上下文中运行正常(例如.dbo):
User OtherDB1;
EXEC fn_blah;
但是在SQL Server 2008框中,上述查询将无效。如果您将数据库上下文更改为master
,然后像上面那样运行它将会起作用。或者您执行以下操作:
EXEC master.dbo.fn_blah
之前有人见过这种行为吗?任何帮助表示赞赏。谢谢!
答案 0 :(得分:5)
master
数据库是一个系统数据库,用于存储有关服务器上其他所有信息的各种信息。
当您将用户对象放入master
时,您可以在没有数据库上下文的情况下访问它们。
这基本上是非预期的行为 - 引擎会在检查当前数据库上下文之前检查master中的某些对象(取决于对象名称和SQL Server的版本)。
这是一个非常糟糕的主意,而不是设计流程的东西。可能会出现各种各样的问题,尤其是在升级或重新启动服务器时,master中的那些对象会被覆盖,因为master不是用来存储用户对象的!
简而言之,不要这样做!使用三部分名称进行函数调用。