2014-02-12 8 views
24

У нас есть очень старое программное обеспечение, созданное около 10 лет назад, и у нас нет исходного кода.Как создать псевдоним базы данных в SQL Server

Программное обеспечение использует две базы данных: DB01 и DB02 на том же экземпляре SQL Server 2012.

Имеются инструкции SQL, такие как db01..table1 join db02..table2, но основная проблема заключается в том, что наши процессы не позволяют использовать db02 в качестве имени базы данных.

Вопрос в том, как мы можем создать псевдоним для базы данных?

Я пытался использовать CREATE SYNONYM

CREATE SYNONYM [db02] FOR [db02_new_name]; 

, но он не работает для имен баз данных.

Пожалуйста, предложите, как это можно решить, не исправляя двоичные файлы для исправления SQL-инструкций.

+4

Я не верю, что вы можете.Оба текущих ответа, похоже, не имеют точки и позволяют использовать псевдоним для экземпляра сервера, а 'SYNONYM' работает только для объектов * в * базе данных. Я не знаю, как изменить псевдоним имени базы данных. –

ответ

10

Создайте базу данных с именем, которое вы хотите олицетворять. Повторно создайте генератор кода DDL, чтобы создать представление для каждой таблицы в базе данных, в которой есть таблицы, которые мне нужны для доступа через жестко заданное имя. В принципе, каждый вид будет иметь заявление, которое выглядит следующим образом ..

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

Пример:

Имя целевой базы данных, которая является жёстко называется и источник DB вы называется ProductDatabaseDatabaseV1, схема является dbo и имя таблицы customer

  1. Создайте базу данных с именем с помощью SSMS или сценария.
  2. CREATE VIEW dbo.customer as SELECT * FROM ProductDatabaseDatabaseV1.dbo.customer

Если вы можете перечислить каждую таблицу в базе данных «источник», а затем создать DDL, как описано выше. Если вы хотите, я могу обновить эту публикацию с помощью примера кода. (с использованием процедуры sp_msforeachtable, если это возможно)

+0

Скажите, что у вас есть отчет SSRS, который вызывает SP, где один из параметров - это имя базы данных (например, у вас есть 10 различных клиентских баз данных). Я не думаю, что этот подход заставит вас отказаться от использования динамического sql в SP (т. Е. : sp_executesql @sql), где @sql имеет имя базы данных, объединенное во время выполнения ..... не так ли? – tbone

+1

Это также не будет обрабатывать функции. :( – tbone

-2

Вы можете создать псевдоним из «Диспетчера конфигурации 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

+1

То же самое здесь. Исправьте меня, если я ошибаюсь, но это будет псевдоним для сервера, а не псевдоним для базы данных. –

-3

Возникает вопрос: как мы можем создать псевдоним для базы данных?

Я знаю, что это старый пост, но ...

Вот почему я использую только 2 части именования для объектов SQL. Это позволяет мне иметь 2 части синонимов, которые указывают на разные именованные базы данных, в зависимости от того, в какой среде я нахожусь. Есть места, где это не работает так хорошо, но, по большей части, эти места очень редки.

Что касается программного обеспечения, в котором у вас нет исходного кода, и если это программное обеспечение использует соглашение об именовании 3-х частей, вам, вероятно, просто не повезло, если вы не знаете, что такое соглашение об именах 3-х частей для каждого объекта и создайте синоним из трех частей для каждого объекта.

+0

Судя по нисходящим, кто-то серьезно пропустил точку. Даже ОП опубликовали, что они закончили использование метода синонимов. –

7

У меня была аналогичная проблема.
Решено с этим workaround, используя синонимы.

Краткая версия: Вы наводняете свою базу данных синонимом каждого объекта, который вам когда-либо понадобится для ссылки. Позже вы воссоздаете каждый синоним с другим именем базы данных.

+1

Ничего себе ... люди уверены, придирчивы здесь. Макс предоставил ссылку на существенно правильный ответ, и, похоже, он был проголосован, потому что он предоставил ссылку вместо выписанного ответа? –

+21

И когда блог умирает и уходит через несколько лет? –

+2

@DavidRoussel в этом случае вы используете веб-архив :-) https://web.archive.org/web/20150502091442/http://www.baud.cz/blog/database-alias- in-microsoft-sql-server –

0

Я нашел ответ Чарльза (и связанное обходное решение в комментарии от 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 без соглашения об именовании частей. Эти синонимы не будут работать. Вы должны исправить это в исходных объектах/представлениях.

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' 
0
  1. Перейти к базе данных вы хотите создать псевдоним,

  2. Создать таблицу псевдонимов Папки с предпочтительной конструкции

  3. Перейдите в таблицу уникальных идентификаторов и проверьте последнюю последовательность кода для созданной таблицы.

    Например, если последний код 10, а затем обновить его до 11.

  4. Открытые полки стола и идти прямо на дно и создать имя кабинета Псевдонима вы хотите.