2017-09-12 17 views
0

我有許多存儲過程,函數,視圖和表的項目。T-SQL:在沒有限定的情況下訪問同一模式中的數據庫對象?

我目前已將項目部署在數據庫中,並且都在同一個模式中。在這個例子中,我們稱之爲「mainproject」

現在,我的任務是在同一個數據庫中創建一個重複項目。明顯的解決方案是將所有對象克隆到另一個模式中。我已經能夠使用一些SQL腳本來做到這一點。所以現在我有另一個叫做「secondproject」的模式,它包含了第一個模式中的所有對象。

問題是,在我所有的函數中,視圖和過程都引用了原始模式,例如, DECLARE @someVar INT = mainproject.getId(@someObject),SELECT someColumn FROM mainproject.someTable,UPDATE mainproject.someTable SET someColumn = @someValue WHERE someOtherColumn = @someOtherValue因此執行這些函數最終會引用不正確的模式。

通過數百個視圖,過程和函數來查找和替換模式mainproject的所有事件將是一個單調乏味且可能不可靠的過程。

我的問題是,有沒有辦法在引用任何對象時指定「在當前模式中」?

只是在DECLARE @someVar INT = getId(@someObject)結果'getId' is not a recognized built-in function name.,我甚至不能保存程序。


編輯:下面的第一個答案有助於瞭解情況。如果您沒有指定訪問某個對象的模式,它會認爲它在您的默認模式中。

問題是,在我將運行我的DDL腳本的生產服務器上,我的用戶帳戶的服務器默認架構是dbo。應用程序用戶只能訪問DML語句,因此我不能使用該帳戶來運行創建腳本。

我想,如果沒有辦法有一個存儲過程假定不合格的對象是駐留在同一個模式,我將不得不求助於查找/生成腳本後,更換....

回答

0

在SQL Server,你在談論模式。如果沒有指定,則數據庫引擎將默認爲當前用戶的默認模式。默認情況下,這是dbo。簡而言之,如果在不同模式中具有相同名稱的對象,則需要指定要在查詢中使用的模式。

+0

是的,你是對的,我指的是模式。看起來你是對的,問題是我在服務器上的「我的」帳戶下開發,默認架構設置爲「dbo」。我將嘗試在數據庫中創建另一個用戶帳戶,以使用默認模式集進行開發。 – fdmillion

+0

好吧,我發現的問題是,這將適用於我的本地實例,但它不會用於生產服務器。我只有一個用戶帳戶,其單個數據庫的默認模式設置爲'dbo'。 admin創建的應用程序用戶只能訪問DML語句,所以我不能用它來運行DDL查詢來創建數據庫。因爲SQL Server甚至不會讓我創建引用對象的存儲過程,它不相信存在,我仍然堅持... – fdmillion

+0

我想你可以使所有的查詢動態sql,動態部分是模式。我認爲這可能比尋找並替換模式並在之後運行模式更加費力和麻煩。無法爲您提供多次登錄會使這非常困難。 –

相關問題