Как создать псевдоним базы данных в 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.
Ответы
Ответ 1
Создайте базу данных с именем, которое вы хотите олицетворять. Повторно создайте генератор кода DDL, чтобы создать представление для каждой таблицы в базе данных, в которой есть таблицы, которые мне нужны для доступа через жестко заданное имя. В принципе, у каждого представления будет утверждение, которое выглядит следующим образом.
CREATE VIEW schemaname.tablename as SELECT * FROM targetdbname.schemaname.tablename
Пример:
Имя целевой базы данных, которое является жестко запрограммированным, называется ProdDBV1
, а исходный DB имеет имя ProductDatabaseDatabaseV1
, схема dbo
, а имя таблицы customer
- Создайте базу данных под названием
ProdDBV1
с помощью SSMS или script.
-
CREATE VIEW dbo.customer as SELECT * FROM ProductDatabaseDatabaseV1.dbo.customer
Если вы можете перечислить каждую таблицу в своей "исходной" базе данных, а затем создать DDL, как указано выше. Если вы хотите, я могу обновить эту публикацию с помощью примера кода. (используя процедуру sp_msforeachtable
, если это возможно)
Ответ 2
У меня была аналогичная проблема.
Решенный с помощью обходной путь, используя синонимы.
Краткая версия:. Вы наводняете свою базу данных синонимом каждого объекта, который вам когда-либо понадобится для ссылки. Позже вы воссоздаете каждый синоним с другим именем базы данных.
Ответ 3
Здесь хранится 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'
Ответ 4
Я нашел ответ Чарльза (и связанное с ним обходное решение в комментарии от maxcastaneda) очень полезно. Я следовал этому подходу, и это работает для меня. Я немного упростил его и создал следующий запрос, который создает все необходимые синонимы для создания.
В качестве предпосылки для этого фрагмента исходная БД и синоним/псевдоним db должны находиться на одном сервере, иначе в случае использования связанного сервера или, следовательно, вам придется немного изменить его.
Должно быть довольно легко помещать это в маленький 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
Не забудьте ввести имена Db в области <... > .
Просто скопируйте содержимое столбца SynonymUpdateScript
и выполните его в БД синонимов - или создайте хранимую процедуру для этой задачи.
Помните, что существует проблема, если у вас есть представления, которые относятся к таблицам или другим объектам db без соглашения об именовании частей. Эти синонимы не будут работать. Вы должны исправить это в исходных объектах/представлениях.
Ответ 5
-
Перейдите в базу данных, которую вы хотите создать Alias,
-
Создайте таблицу псевдонимов с предпочтительным дизайном,
-
Перейдите в таблицу уникальных идентификаторов и проверьте последнюю последовательность кода для созданной таблицы.
Например, если последний код равен 10, обновите его до 11.
-
Откройте таблицу шкафов и идите прямо внизу и создайте имя шкафа Alias, которое вы хотите.
Ответ 6
Вы можете создать псевдоним из "Диспетчера конфигурации SQL Server" в разделе "Инструмент Configuartion" в папке 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
Ответ 7
Вопрос: как мы можем создать псевдоним для базы данных?
Я знаю, что это старый пост, но...
Вот почему я использую только соглашение об именах 2-х частей для объектов SQL. Это позволяет мне иметь 2 части синонимов, которые указывают на разные имена баз данных в зависимости от того, в какой среде я нахожусь. Есть места, где это работает не так хорошо, но по большей части эти места очень редки.
Что касается программного обеспечения, в котором у вас нет исходного кода, и если это программное обеспечение использует соглашение об именовании 3-х частей, вам, вероятно, просто не повезло, если вы не знаете, что такое соглашение об именах 3-х частей для каждого объекта и создать синоним из 3 частей для каждого объекта.