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

问题描述 投票:0回答:7

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

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

DB01
DB02

有诸如

db01..table1 join db02..table2
之类的SQL语句,但主要问题是我们的流程不允许我们使用
db02
作为数据库名称。

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

我正在尝试使用

CREATE SYNONYM

CREATE SYNONYM [db02] FOR [db02_new_name];

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

请建议如何在不修补二进制文件以更正 SQL 语句的情况下解决该问题。

sql sql-server database alias synonym
7个回答
15
投票

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

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

示例:

硬编码的目标数据库名称称为

ProdDBV1
,您拥有的源数据库名为
ProductDatabaseDatabaseV1
,架构为
dbo
,表名称为
customer

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

如果您可以枚举“源”数据库中的每个表,然后按上述方式创建 DDL。如果您愿意,我可以用代码示例更新此帖子。 (如果可能的话,使用

sp_msforeachtable
程序)


12
投票

我也有类似的问题。
使用同义词解决了这个解决方法

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


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

按如下方式使用:

EXEC CreateSynonymsForTargetDatabase 'targetDbName'

1
投票

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

我知道这是一篇旧帖子,但是......

这就是为什么我只对 SQL 对象使用两部分命名约定。 它允许我拥有两部分同义词,根据我所处的环境,指向不同名称的数据库。有些地方它工作得不太好,但在大多数情况下,这些地方非常罕见。

对于您没有源代码的软件,如果该软件使用 3 部分命名约定,那么您可能会运气不好,除非您知道每个对象的 3 部分命名约定是什么并创建一个 3每个对象的部分同义词。


0
投票

您可以从 SQL Server 文件夹中配置工具下的“SQL Server 配置管理器”创建别名。

详细来源:http://www.mssqltips.com/sqlservertip/1620/how-to-setup-and-use-a-sql-server-alias/

http://technet.microsoft.com/en-us/library/ms190445.aspx


0
投票

我发现 Charles 的答案(以及 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

不要忘记在 <...> 处输入您的数据库名称。

只需复制

SynonymUpdateScript
列的内容并在同义词数据库中执行它 - 或者为此任务创建一个存储过程。

请注意,如果您的视图引用表或其他数据库对象而没有两部分命名约定,则会出现问题。这些同义词将不起作用。您应该在原始对象/视图中修复此问题。


0
投票
  1. 转到您要创建别名的数据库,

  2. 使用首选设计创建别名文件夹表,

  3. 转到唯一 ID 表并检查创建的表的最后一个代码序列。

    例如,如果最后一个代码是10,则将其更新为11。

  4. 打开 Cabinets 表,然后转到底部并创建您想要的 Alias 橱柜的名称。

© www.soinside.com 2019 - 2024. All rights reserved.