2012-03-01 55 views
3

我有這個功能稱爲fn_blah駐留在Master數據庫的SQL Server 2000框。同一個函數駐留在SQL Server 2008框的master數據庫中。在SQL Server 2000中框,函數運行在不同的數據庫環境下就好了,而無需指定所有者(例如DBO):用戶定義的函數將不執行

User OtherDB1; 
EXEC fn_blah; 

但在SQL Server 2008中框,上面的查詢將無法正常工作。如果將數據庫上下文更改爲master,那麼運行起來就像上面那樣運行。或者你執行以下操作:

EXEC master.dbo.fn_blah 

以前有人看過這種行爲嗎?任何幫助表示讚賞。謝謝!

+3

**不要把用戶對象放在主內。**問題解決了! – JNK 2012-03-01 19:59:25

+0

有變化,如何架構和所有者的處理從SQL Server 2000將SQL Server 2005的,我不記得他們,但如果你看看微軟的網頁上的兩個(應該有文檔之間的變化你應該能夠看到它爲什麼會發生變化,但是既然你知道如何讓它在兩個方面都起作用,它真的值得你付出什麼努力? – David 2012-03-01 20:01:54

+0

你的上下文有點混亂。你在說你正在用* EXEC *調用*函數? – 2012-03-01 20:08:43

回答

5

master數據庫是存儲各種關於你的服務器上的一切信息系統數據庫。

當你把用戶對象爲master,您可以訪問他們沒有數據庫上下文。

這實質上是意外行爲 - 引擎會在檢查當前數據庫上下文之前檢查master中的某些對象(取決於對象名稱和SQL Server的版本)。

這是一個非常糟糕的主意,不是圍繞你的設計過程。可能會出現各種問題,尤其是升級或重新啓動服務器時,主服務器中的這些對象會被覆蓋,因爲主服務器並非用於存儲用戶對象!

總之,不這樣做!使用三部分名稱進行函數調用。

+3

或者使用您自己的實用程序數據庫而不是主人。如果您不想應用三部分名稱,則可以創建同義詞,然後引用兩部分名稱。您絕不應*想*爲任何類型的對象(即恕我直言)編寫單部分名稱。 – 2012-03-01 20:07:56

+0

那麼是否有任何範圍級別的權限可以授予的功能,可以使它從任何數據庫上下文看到或調用,而根本不使用部分名稱? – Chinesinho 2012-03-01 20:48:09

+0

@Chinesinho我不確定,但我告訴你,這是一個可怕的想法。它可能導致各種問題。假設你有'master.dbo.fn_stuff'和'somedatabase.dbo.fn_stuff'。如果你使用'somedatabase'作爲當前上下文執行'fn_stuff'(但沒有指定它),你將運行一些你不希望運行的東西。圍繞此行爲設計流程是一種反模式,應予以避免。 – JNK 2012-03-01 20:52:31