2015-07-21 29 views
0

比方說,在一個多模式的數據庫,我們有這2個特效:如何從另一個架構運行模式PROC

Create proc S1004.proc1 
As 
    Exec proc2 
GO 
Create proc S1004.proc2 
As 
    Select 1 

然後,當我嘗試從SA登錄時運行PROC1, sql發出錯誤:無法找到存儲過程'proc2'。

我知道如果我們將模式添加到proc1主體中的proc2,那麼它可以解析模式。

有沒有其他解決方案來解決這個問題。

+0

好的,你回答了你自己的問題......或者? – OzrenTkalcecKrznaric

+0

@OzrenTkalcecKrznaric,我不能那樣做,我只是在這裏簡化了我的問題。假設我們有另一個可以調用proc1等不同proc的proc。我們不能去任何一個proc並附加模式,因爲我們對每個proc都有多個模式。 – Jami

回答

1

如果你可以在用戶「範圍」用你的架構(要知道,用戶和架構在SQL Server是分開的),你可以不用它:

CREATE USER S1004 FOR LOGIN S1004 WITH DEFAULT_SCHEMA = S1004; 
GO 

CREATE PROCEDURE S1004.proc1 
WITH EXECUTE AS 'S1004' 
AS 
    EXECUTE proc2 
GO 

CREATE PROCEDURE S1004.proc2 
AS 
    SELECT 1 

EXEC S1004.proc1 

這裏會發生什麼事是,您使用具有相同名稱的默認架構創建用戶S1004。當在當前模式的範圍內沒有立即找到對象時,該模式將被搜索對象。

如果需要在過程中解析模式,請在該用戶的上下文中運行該過程(請參閱WITH EXECUTE AS 'S1004'),並且模式解析將會成功。

但是,請注意,這會將執行範圍更改爲另一個用戶。這是一種解決方法,但在這種情況下,它是最好的選擇。

+0

謝謝。聽起來是答案。你能解釋一下最後一行嗎?所以對於我們來說,一個schema proc只能在sa下運行或者其默認模式設置爲proc模式的任何用戶。這是否會導致你在那裏提到的問題?我懷疑它的確如此。 – Jami

+0

你的方式,我相信它沒有。或者,只要您可以控制/管理您創建的任何用戶的特權,就不會發生這種情況。 – OzrenTkalcecKrznaric

相關問題