master数据库中的用户定义函数将不会执行

Chi*_*nho 3 t-sql sql-server sql-server-2008

我有这个函数调用fn_blah,它驻留在MasterSQL Server 2000框的数据库中.相同的函数驻留在masterSQL Server 2008框的数据库中.在SQL Server 2000框中,该函数在不指定所有者的情况下在不同的数据库上下文中运行正常(例如.dbo):

User OtherDB1;
EXEC fn_blah;
Run Code Online (Sandbox Code Playgroud)

但在SQL Server 2008框中,上述查询将无法正常工作.如果您将数据库上下文更改为master,那么将起作用,然后像上面那样运行它.或者您运行以下内容:

EXEC master.dbo.fn_blah
Run Code Online (Sandbox Code Playgroud)

以前有人见过这种行为吗?任何帮助表示赞赏.谢谢!

JNK*_*JNK 5

master数据库是存储各种关于你的服务器上的一切信息系统数据库.

将用户对象放入时master,您可以在没有数据库上下文的情况下访问它们.

这实际上是非预期的行为 - 引擎将在检查当前数据库上下文之前检查master中的某些对象(取决于对象名称和SQL Server的版本).

这是一个非常糟糕的主意,而不是设计流程的东西.可能会出现各种各样的问题,尤其是在升级或重新启动服务器时,master中的那些对象会被覆盖,因为master不是用来存储用户对象的!

总之,不要这样做! 使用三部分名称进行函数调用.

  • 或者使用您自己的实用程序数据库而不是master.如果您不想应用三部分名称,则可以创建同义词,然后引用两部分名称.你永远不应该*希望*为任何类型的对象,恕我直言写单部分名称. (3认同)