如何在SQL Server中创建数据库的别名

Dmi*_*nov 30 sql database sql-server alias synonym

我们在大约10年前创建了一个非常古老的软件,我们没有源代码.

该软件使用两个数据库,DB01DB02在同一个SQL Server 2012实例上.

有SQL语句db01..table1 join db02..table2,但主要问题是我们的进程不允许我们使用db02数据库的名称.

问题是:我们如何为数据库创建别名?

我试图用 CREATE SYNONYM

CREATE SYNONYM [db02] FOR [db02_new_name];
Run Code Online (Sandbox Code Playgroud)

但它不适用于数据库名称.

如果不修补二进制文件来纠正SQL语句,请建议如何解决它.

小智 11

使用您要模拟的名称创建数据库.重新设置DDL代码生成器,为数据库中的每个表创建一个视图,该视图包含我需要通过硬编码名称访问的表.基本上,每个视图都有一个看起来像这样的语句.

CREATE VIEW schemaname.tablename as SELECT * FROM targetdbname.schemaname.tablename
Run Code Online (Sandbox Code Playgroud)

例:

将调用硬编码的目标数据库名称,ProdDBV1并命名您拥有的源数据库ProductDatabaseDatabaseV1,架构dbo名称和表名称customer

  1. 创建ProdDBV1使用SSMS或脚本调用的数据库.
  2. CREATE VIEW dbo.customer as SELECT * FROM ProductDatabaseDatabaseV1.dbo.customer

如果您可以枚举"源"数据库中的每个表,然后如上所述创建DDL.如果您愿意,我可以使用代码示例更新此帖子.(sp_msforeachtable如果可能,使用程序)

  • 这也不会处理功能。:( (2认同)

小智 11

我有类似的问题.
解决了这种解决方法,使用同义词.

简短版本:您使用您需要引用的每个对象的同义词来填充数据库.稍后,您将使用其他数据库名称重新创建每个同义词.

  • 人们普遍认为答案应该是答案,而不是指向可能包含相关信息的页面的链接.请参阅:http://meta.stackexchange.com/a/8259 (30认同)
  • 当博客在几年内消亡并消失? (29认同)
  • @DavidRoussel在这种情况下你使用web存档:-) https://web.archive.org/web/20150502091442/http://www.baud.cz/blog/database-alias-in-microsoft-sql-server (3认同)
  • 哇...这里的人肯定很挑剔。Max提供了一个指向基本正确答案的链接,它似乎已被否决,因为它提供了链接而不是书面答案? (2认同)
  • 感谢您的反馈,@DavidRoussel ...现在您提到了它,我以前遇到过链接损坏的问题,现在我明白了。感谢您的解释。作为一个侧边栏,在 Microsoft 文档中遇到损坏的链接确实令人沮丧(这是一个常见问题),所以我倍加理解。再次感谢。 (2认同)
  • _解决方法_链接已损坏。 (2认同)

Ada*_*rdy 5

这是一个执行此操作的存储过程。只需将其添加到您的数据库并使用目标数据库调用它即可。它将为目标数据库中的所有表创建同义词,并创建模式(如果它们不存在)。我留下了一个注释掉的部分,以防有人知道如何在没有光标的情况下创建模式。

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
Run Code Online (Sandbox Code Playgroud)

使用方法如下:

EXEC CreateSynonymsForTargetDatabase 'targetDbName'
Run Code Online (Sandbox Code Playgroud)