比方說,在一個多模式的數據庫,我們有這2個特效:如何從另一個架構運行模式PROC
Create proc S1004.proc1
As
Exec proc2
GO
Create proc S1004.proc2
As
Select 1
然後,當我嘗試從SA登錄時運行PROC1, sql發出錯誤:無法找到存儲過程'proc2'。
我知道如果我們將模式添加到proc1主體中的proc2,那麼它可以解析模式。
有沒有其他解決方案來解決這個問題。
比方說,在一個多模式的數據庫,我們有這2個特效:如何從另一個架構運行模式PROC
Create proc S1004.proc1
As
Exec proc2
GO
Create proc S1004.proc2
As
Select 1
然後,當我嘗試從SA登錄時運行PROC1, sql發出錯誤:無法找到存儲過程'proc2'。
我知道如果我們將模式添加到proc1主體中的proc2,那麼它可以解析模式。
有沒有其他解決方案來解決這個問題。
如果你可以在用戶「範圍」用你的架構(要知道,用戶和架構在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'
),並且模式解析將會成功。
但是,請注意,這會將執行範圍更改爲另一個用戶。這是一種解決方法,但在這種情況下,它是最好的選擇。
謝謝。聽起來是答案。你能解釋一下最後一行嗎?所以對於我們來說,一個schema proc只能在sa下運行或者其默認模式設置爲proc模式的任何用戶。這是否會導致你在那裏提到的問題?我懷疑它的確如此。 – Jami
你的方式,我相信它沒有。或者,只要您可以控制/管理您創建的任何用戶的特權,就不會發生這種情況。 – OzrenTkalcecKrznaric
好的,你回答了你自己的問題......或者? – OzrenTkalcecKrznaric
@OzrenTkalcecKrznaric,我不能那樣做,我只是在這裏簡化了我的問題。假設我們有另一個可以調用proc1等不同proc的proc。我們不能去任何一個proc並附加模式,因爲我們對每個proc都有多個模式。 – Jami