首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Server中创建数据库别名

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

Stack Overflow用户
提问于 2014-02-12 08:08:40
回答 6查看 89K关注 0票数 35

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

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

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

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

我试着用CREATE SYNONYM

代码语言:javascript
复制
CREATE SYNONYM [db02] FOR [db02_new_name];

但它不适用于数据库名。

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

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2014-06-17 17:27:36

创建一个具有要模拟的名称的数据库。重新定义DDL代码生成器,为数据库中的每个表创建视图,这些表具有我需要通过硬编码的名称访问的表。基本上,每个视图都会有一个如下所示的语句。

代码语言:javascript
复制
CREATE VIEW schemaname.tablename as SELECT * FROM targetdbname.schemaname.tablename

示例:

硬编码的目标数据库名称为ProdDBV1,您拥有的源DB名为ProductDatabaseDatabaseV1,模式为dbo,表名为customer

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

如果您可以枚举“源”数据库中的每个表,然后按照上面的方式创建DDL。如果您需要,我可以使用代码示例更新此公告。(如果可能的话使用sp_msforeachtable过程)

票数 14
EN

Stack Overflow用户

发布于 2014-12-17 19:32:30

我也有过类似的问题。

用这个解决办法解决,使用同义词。

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

票数 12
EN

Stack Overflow用户

发布于 2016-03-03 03:07:49

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

代码语言:javascript
复制
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

请按以下方式使用:

代码语言:javascript
复制
EXEC CreateSynonymsForTargetDatabase 'targetDbName'
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21722066

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档