Как создать псевдоним базы данных в SQL Server
у нас есть очень старое программное обеспечение было создано около 10 лет назад и у нас нет исходного кода.
программное обеспечение использует две базы данных,DB01
и DB02
на том же экземпляре SQL Server 2012.
есть операторы SQL, такие как db01..table1 join db02..table2
, но главная проблема в том, что наши процессы не позволяют нам использовать db02
имя базы данных.
вопрос: как мы можем создать псевдоним для БД?
Я пытался использовать CREATE SYNONYM
CREATE SYNONYM [db02] FOR [db02_new_name];
но это не работает для имен базы данных.
пожалуйста, предложите, как это можно решить без исправления двоичных файлов для исправления операторов SQL.
7 ответов
создать базу данных с именем, которое вы хотите подражать. Re-jigg генератор кода DDL для создания представления для каждой таблицы в базе данных, которая имеет таблицы, необходимые для доступа через жестко закодированное имя. В принципе, каждое представление будет иметь оператор, который выглядит следующим образом..
CREATE VIEW schemaname.tablename as SELECT * FROM targetdbname.schemaname.tablename
пример:
имя базы данных, которая жестко называется ProdDBV1
и источник БД называется ProductDatabaseDatabaseV1
, схема dbo
и имя таблицы customer
- создайте базу данных под названием
ProdDBV1
использование SSMS или скрипта. CREATE VIEW dbo.customer as SELECT * FROM ProductDatabaseDatabaseV1.dbo.customer
если вы можете перечислить каждую таблицу в своей базе данных "источник", а затем создать DDL, как указано выше. Если вы хотите, я могу обновить эту публикацию с помощью примера кода. (используя sp_msforeachtable
процедура, если это возможно)
У меня была аналогичная проблема.
Решается с помощью этого решение, используя синонимы.
короткая версия: вы наводняете свою базу данных синонимом каждого объекта, на который вам когда-либо понадобится ссылаться. Позже вы повторно создаете каждый синоним с другим именем базы данных.
вот сохраненный proc, чтобы сделать это. Просто добавьте его в свою базу данных и вызовите его с целевой базой данных. Он создаст синонимы для всех таблиц в целевой базе данных и создаст схемы, если они не существуют. Я оставил раздел с комментариями на случай, если кто-то знает способ заставить схемы создания работать без курсора.
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'
Я нашел ответ Чарльза (и связанный обходной путь в комментарии 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
столбец и выполните его в БД синонимов - или создайте хранимую процедуру для этой задачи.
имейте в виду, что существует проблема, если у вас есть представления, которые ссылаются на таблицы или другие объекты БД без соглашения об именовании 2 частей. Эти синонимы не сработают. Вы должны исправить это в оригинале объекты / представления.
перейдите в базу данных, которую вы хотите создать псевдоним,
создайте таблицу папок псевдонимов с предпочтительным дизайном,
-
перейдите в таблицу уникальных идентификаторов и проверьте последнюю кодовую последовательность для созданной таблицы.
например, если последний код равен 10, обновите его до 11.
откройте таблицу шкафов и перейдите справа внизу и создайте имя шкафа псевдонима, который вы хотеть.
вы можете создать псевдоним из "SQL Server Configuration Manager" в разделе Configuartion Tool в папке SQL Server.
подробный источник : http://www.mssqltips.com/sqlservertip/1620/how-to-setup-and-use-a-sql-server-alias/
вопрос: как мы можем создать псевдоним для БД?
Я знаю, это старый пост, но...
вот почему я использую только соглашение об именовании 2 частей для объектов SQL. Это позволяет мне иметь 2 части синонимов, которые указывают на разные именованные базы данных в зависимости от того, в какой среде я нахожусь. Есть некоторые места, где он не работает так хорошо, но, по большей части, эти места очень редки.
что касается программного обеспечения, которое вы у вас нет исходного кода, и если это программное обеспечение использует соглашение об именовании 3 частей, вам, вероятно, просто не повезло, если вы не знаете, что такое соглашение об именовании 3 частей для каждого объекта и создать синоним 3 частей для каждого объекта.