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

时间:2012-03-01 19:56:21

标签: sql-server sql-server-2008 tsql

我有一个名为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

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

1 个答案:

答案 0 :(得分:5)

master数据库是一个系统数据库,用于存储有关服务器上其他所有信息的各种信息。

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

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

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

简而言之,不要这样做!使用三部分名称进行函数调用。