我们在大约10年前创建了一个非常古老的软件,我们没有源代码。
该软件在同一个SQL Server 2012实例上使用两个数据库DB01
和DB02
。
有db01..table1 join db02..table2
等SQL语句,但主要问题是我们的流程不允许我们使用db02
作为数据库的名称。
问题是:我们如何为数据库创建别名?
我试图使用CREATE SYNONYM
CREATE SYNONYM [db02] FOR [db02_new_name];
但它不适用于数据库名称。
请建议如何在不修补二进制文件以纠正SQL语句的情况下解决问题。
答案 0 :(得分:11)
使用您要模拟的名称创建数据库。重新设置DDL代码生成器,为数据库中的每个表创建一个视图,该视图包含我需要通过硬编码名称访问的表。基本上,每个视图都有一个看起来像这样的语句..
CREATE VIEW schemaname.tablename as SELECT * FROM targetdbname.schemaname.tablename
示例:
硬编码的目标数据库名称称为ProdDBV1
,您拥有的源数据库名为ProductDatabaseDatabaseV1
,架构为dbo
,表名为customer
ProdDBV1
的数据库。CREATE VIEW dbo.customer as SELECT * FROM ProductDatabaseDatabaseV1.dbo.customer
如果您可以枚举"来源"中的每个表格。数据库,然后如上所述创建DDL。如果您愿意,我可以使用代码示例更新此帖子。 (如果可能,使用sp_msforeachtable
程序)
答案 1 :(得分:10)
我有类似的问题 解决了这个workaround,使用同义词。
简短版本:您使用您需要引用的每个对象的同义词来充满数据库。稍后,您将使用其他数据库名称重新创建每个同义词。
答案 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'
答案 3 :(得分:0)
我找到了查尔斯&#39;回答(以及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
别忘了在&lt; ...&gt;处输入Db名称斑点。
只需复制SynonymUpdateScript
列的内容并在同义词DB中执行 - 或者为此任务创建存储过程。
请注意,如果您具有引用表或其他数据库对象而没有2部分命名约定的视图,则会出现问题。这些同义词不起作用。您应该在原始对象/视图中修复此问题。
答案 4 :(得分:0)
转到您要创建别名的数据库,
使用首选设计
转到唯一ID表并检查所创建表的最后一个代码序列。
例如,如果最后一个代码是10,则将其更新为11。
打开橱柜表并向右下方创建所需的Alias文件柜名称。
答案 5 :(得分:-2)
您可以在SQL Server文件夹中的配置工具下的“SQL Server配置管理器”中创建别名。详细来源:http://www.mssqltips.com/sqlservertip/1620/how-to-setup-and-use-a-sql-server-alias/
答案 6 :(得分:-2)
问题是:我们如何为数据库创建别名?
我知道这是一个老帖子但是......
这就是为什么我只使用SQL对象的2部分命名约定。它允许我有两部分同义词指向不同命名的数据库,这取决于我所处的环境。有些地方它不能很好地工作,但是,在大多数情况下,这些地方是非常罕见的。
对于你没有源代码的软件,如果该软件使用3部分命名约定,你可能只是运气不好,除非你知道每个对象的3部分命名约定并创建每个对象的3部分同义词。