2014-02-12 88 views
24

我們有一個十年前創建的非常舊的軟件,我們沒有源代碼。如何在SQL Server中創建數據庫的別名

該軟件在同一SQL Server 2012實例上使用兩個數據庫,即DB01DB02

有SQL語句如db01..table1 join db02..table2,但主要問題是我們的進程不允許我們使用db02作爲數據庫的名稱。

問題是:我們如何創建數據庫的別名?

我試圖用CREATE SYNONYM

CREATE SYNONYM [db02] FOR [db02_new_name]; 

,但它並不適用於數據庫名稱的工作。

請建議如何在不修補二進制文件以糾正SQL語句的情況下解決此問題。

+4

我不相信你可以。目前的兩個答案都似乎缺少了這一點,並允許爲服務器實例提供一個別名,而「SYNONYM」僅適用於數據庫中的對象*。我不知道有任何方式來別名數據庫名稱。 –

回答

10

用你想模仿的名字創建一個數據庫。重新調試DDL代碼生成器爲數據庫中的每個表創建一個視圖,該表具有我需要通過硬編碼名稱訪問的表。基本上,每個視圖將有一個看起來像這樣的說法..

CREATE VIEW schemaname.tablename as SELECT * FROM targetdbname.schemaname.tablename 

例子:

目標數據庫名稱是硬編碼被稱爲並已被命名爲ProductDatabaseDatabaseV1源數據庫,架構是dbo和表名是customer

  1. 創建使用SSMS或腳本調用數據庫。
  2. CREATE VIEW dbo.customer as SELECT * FROM ProductDatabaseDatabaseV1.dbo.customer

如果你能列舉每個表中的「源」數據庫,然後創建DDL如上。如果你想我可以用代碼示例更新這篇文章。 (如果可能,使用sp_msforeachtable程序)

+0

假設你有一個SSRS報告,調用一個參數是數據庫名稱的SP(假設你有10個不同的客戶數據庫) - 我不認爲這種方法會讓你遠離在SP中使用動態SQL(即:sp_executesql @sql),其中@sql的數據庫名稱連接在運行時.....會嗎? – tbone

+1

這也不會處理函數。 :( – tbone

-3

的問題是:我們如何能夠創建的數據庫別名?

我知道這是一個老的文章,但...

這就是爲什麼我只使用SQL對象2部分命名約定。它允許我有兩部分同義詞,它們指向不同名稱的數據庫,這取決於我所處的環境。有些地方工作得不好,但大多數情況下,這些地方非常罕見。

對於沒有源代碼的軟件,如果該軟件使用3部分命名約定,則可能只是運氣不佳,除非您知道每個對象的3部分命名約定和爲每個對象創建一個3部分的同義詞。

+0

從downvotes判斷,有人認真地錯過了這一點。即使OP也發佈了他們最終使用同義詞方法。 –

7

我有類似的問題。
用此workaround解決,使用同義詞。

簡短版本:您可以用您需要引用的每個對象的同義詞氾濫您的數據庫。稍後,您可以使用其他數據庫名稱重新創建每個同義詞。

+1

哇......人們肯定在這裏挑剔,馬克斯提供了一個基本正確的答案的鏈接,它似乎被拒絕了,因爲它提供了一個鏈接,而不是一個書面的答案? –

+21

當博客去世,在幾年內消失? –

+2

@DavidRoussel在這種情況下你使用網絡存檔:-) https://web.archive.org/web/20150502091442/http://www.baud.cz/blog/database-alias- in-microsoft-sql-server –

0

我發現查爾斯的答案(以及由maxcastaneda評論中的鏈接解決方法)非常有用。我遵循這種方法,它適用於我。我簡化了一下,並創建了以下查詢,以提供所有需要的同義詞創建。

作爲此片段的先決條件,原始數據庫和同義詞/別名數據庫必須位於同一臺服務器上,否則在使用鏈接服務器的情況下,您必須稍微修改它。 把它放到一個小sp中以自動更新同義詞應該相當容易。

USE <SYNONYMDB> 
SELECT 
'[' + TABLE_NAME + ']', 
'[' + TABLE_SCHEMA + '].[' + TABLE_NAME + ']', 
'IF EXISTS (SELECT * FROM sys.synonyms WHERE name = ''' + TABLE_NAME + ''') DROP SYNONYM ['+ TABLE_NAME + ']; CREATE SYNONYM [' + TABLE_NAME + '] FOR <ORIGINALDB>.' + TABLE_SCHEMA + '.[' + TABLE_NAME + ']' AS SynonymUpdateScript FROM <ORIGINALDB>.INFORMATION_SCHEMA.TABLES 

不要忘了輸入你的Db名字< ...>斑點。

只需複製SynonymUpdateScript列的內容並在同義詞DB中執行它,或者爲此任務創建一個存儲過程。

請注意,如果您有適當的視圖來引用表或其他沒有2部分命名約定的數據庫對象,則會出現問題。這些同義詞不起作用。您應該在原始對象/視圖中修復此問題。

3

這是一個存儲過程來做到這一點。只需將其添加到您的數據庫中,並用目標數據庫調用它。它將爲目標數據庫中的所有表創建同義詞,如果它們不存在,則創建模式。如果有人知道如何讓創建模式在沒有光標的情況下工作,我已經留下了註釋部分。

CREATE PROCEDURE CreateSynonymsForTargetDatabase (
    @databaseName sysname 
) 
AS BEGIN 
DECLARE @TSQL nvarchar(max) = N'' 
DECLARE @rn char(2), 
    @SchemaName sysname; 

    SET @rn = char(13) + char(10) 

    CREATE TABLE #DBSynonym(  
     [Schema] sysname NOT NULL, 
     [Table] sysname NOT NULL 
    ) 

    SET @TSQL = N' 
     INSERT INTO #DBSynonym ([Schema], [Table]) 
     SELECT Schemas.name, Tables.name 
     FROM [' + @databaseName + '].sys.tables 
     INNER JOIN [' + @databaseName + '].sys.schemas on tables.schema_id = schemas.schema_id  
    ' 

    EXEC (@TSQL) 
    SET @TSQL = N'' 

    DECLARE MissingSchemasCursor CURSOR 
    READ_ONLY 
    FOR 
     SELECT newSchemas.[Schema] 
     FROM #DBSynonym newSchemas 
     LEFT JOIN sys.schemas on newSchemas.[Schema] = schemas.name 
     WHERE schemas.schema_id is null 
     GROUP BY newSchemas.[Schema] 

    OPEN MissingSchemasCursor 
    FETCH NEXT FROM MissingSchemasCursor INTO @SchemaName 
    WHILE (@@fetch_status <> -1) 
    BEGIN 
     IF (@@fetch_status <> -2) 
     BEGIN 
      SET @TSQL = N'CREATE SCHEMA ' + QUOTENAME(@SchemaName) + N';' 

      EXEC sp_executesql @TSQL 
     END 
     FETCH NEXT FROM MissingSchemasCursor INTO @SchemaName 
    END 
    CLOSE MissingSchemasCursor 
    DEALLOCATE MissingSchemasCursor 

    /* 
    SELECT @TSQL = @TSQL + 
     N' 
     GO 
     CREATE SCHEMA ' + QUOTENAME([Schema]) + N';' 
    FROM #DBSynonym newSchemas 
    LEFT JOIN sys.schemas on newSchemas.[Schema] = schemas.name 
    WHERE schemas.schema_id is null 
    GROUP BY newSchemas.[Schema] 

    PRINT 'CREATE SCHEMAS : ' + ISNULL(@TSQL,'') 
    EXEC sp_executesql @TSQL 
    */ 
    SET @TSQL = N'' 

    SELECT @TSQL = @TSQL + 
     N' 
     CREATE SYNONYM ' + QUOTENAME([Schema]) + N'.' + QUOTENAME([Table]) + N' 
     FOR ' + QUOTENAME(@databaseName) + N'.' + QUOTENAME([Schema]) + N'.' + QUOTENAME([Table]) + N';' 
    FROM #DBSynonym 


    EXEC sp_executesql @TSQL 
    SET @TSQL = N'' 

END 
GO 

使用它,如下所示:

EXEC CreateSynonymsForTargetDatabase 'targetDbName' 
0
  1. 轉到您要創建別名數據庫,

  2. 與優選設計創建別名文件夾表,

  3. 轉到唯一ID的表並檢查創建的表的最後一個代碼序列。

    例如,如果最後的代碼是10,然後將其更新到11

  4. 開櫃表和向右走在底部,創造你想要的別名櫃的名稱。

相關問題