2012-07-23 160 views
2

存儲過程我有兩個不同的SQL Server數據庫(在同一服務器上 - 如果它幫助)需要共享同一個存儲過程的邏輯。該解決方案我想實現這個樣子的:共享使用跨數據庫的同義詞

Database1 
    Table: TestTable 
    Synonym: sp_MyProc pointing at SharedDatabase.dbo.sp_MyProc 

Database2 
    Table: TestTable 
    Synonym: sp_MyProc pointing at SharedDatabase.dbo.sp_MyProc 

SharedDatabase 
    Proc: sp_MyProc which runs queries against TestTable 

我的希望是使用同義詞,因此如果我執行sp_MyProc而在數據庫1的情況下,它會使用Database2.TestTable。如果我在Database2的上下文中執行sp_MyProc,它將違背Database2.TestTable。但是,當我通過任一同義詞執行sp_MyProc時,它會忽略同義詞的上下文並執行查找TestTable的本地副本,但找不到該副本。

有沒有落實執行鍼對不同數據庫的表的不同副本的共享存儲過程的方式,無論是通過同義詞或一些其他的機制?

編輯
我要指出,在我的情況我找一個大組現有表和特效要做到這一點,這樣就要求修改本身是不理想的特效或表的任何解決方案。

+0

這也是我所期待的。 – Gisway 2016-08-25 22:34:25

回答

3

像這樣的工作對於過程的定義。由於這是動態構建的,因此一定要防範SQL注入。

CREATE PROCEDURE [dbo].dosomething 
    @databaseName sysname, 
    @schema sysname, 
    @tableName sysname 
    as 
    declare @cmd as nvarchar(max) 
    set @cmd = N'select * from ' + quotename(@schema) + N'.' + quotename(@tableName) 
    exec sp_executesql @cmd 

然後使用它是這樣的:

dosomething 'SampleDb', 'dbo', 'sampleTable' 
+0

對不起,我應該在我的問題,我看有一個非常龐大而複雜的一套現有特效的做到這一點已經提到。所以改變procs適應不是一種選擇。但是,這是對一般問題+1的有效答案。 – RationalGeek 2012-07-23 18:26:46

1

如果存儲過程是在SharedDatabase,那麼它會在SharedDatabase的情況下始終運行。爲了完成你正在嘗試做的,集中的代碼,我可能會在傳遞一個參數指定它是來自哪個服務器,這樣,那麼你可以執行對特定TestTable的查詢。基本上,你需要使用自己的全名是指每個表 - 即Database1.dbo.TestTable

 


    USE SharedDatabase 

    CREATE PROCEDURE [dbo].sp_MyProc 
    @dbsource varchar(50) 
    as 

    if(@dbsource == 'DB1') 
    begin 

    select * from Database1.dbo.TestTable 

    end 
    else 
    begin 

    select * from Database2.dbo.TestTable 

    end 


    GO 



 

另一種方法是使SharedDatabase視圖,其將被稱爲TestTableComposite,有一個額外的列以確定源數據的來源。然後將其作爲參數傳入,並且SharedDatabase上的SP始終在該DB的上下文中。

+0

這些都是選項,但不是理想的,因爲我試圖重構一個大的,現有的一組表/特效到這個解決方案。這需要很多變化和潛在的破壞。 – RationalGeek 2012-07-23 18:27:30

+0

那麼,爲什麼你不直接從兩個數據庫運行存儲的特效,但是從SharedDatabase ......即問題 使用DATABASE1 EXEC sp_myproc 或使用DATABASE2 EXEC sp_myproc – 2012-07-24 04:36:35

+0

似乎並沒有得以順利。 proc不會在db1或db2中看到表,並且會因「無法找到表」類型錯誤而失敗。也許我誤解了你的想法。你可以擴展它嗎? – RationalGeek 2012-07-24 11:45:22