Как создать псевдоним базы данных в 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.


person Dmitriy Sosunov    schedule 12.02.2014    source источник
comment
Я не верю, что ты можешь. Оба текущих ответа, похоже, упускают суть и разрешают псевдоним для экземпляра сервера, а SYNONYMs работают только для объектов внутри базы данных. Я не знаю, как использовать псевдоним для имени базы данных.   -  person Damien_The_Unbeliever    schedule 12.02.2014


Ответы (7)


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

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

Пример:

Имя целевой базы данных, которое жестко запрограммировано, называется ProdDBV1, а исходная БД, которая у вас есть, называется ProductDatabaseDatabaseV1, схема — dbo, а имя таблицы — customer.

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

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

person Charles    schedule 17.06.2014
comment
Скажем, у вас есть отчет SSRS, который вызывает SP, где одним из параметров является имя базы данных (скажем, у вас есть 10 разных баз данных клиентов). Я не думаю, что этот подход избавит вас от использования динамического sql в SP (т.е.: sp_executesql @sql), где @sql объединяет имя базы данных во время выполнения... не так ли? - person tbone; 05.04.2016
comment
Это также не будет обрабатывать функции. :( - person tbone; 25.05.2016
comment
Как этот ответ принят, когда вы сказали: ... наши процессы не позволяют нам использовать db02 в качестве имени базы данных. Разрешено ли вам иметь базу данных с именем db02, в которой нет данных, но есть набор представлений, указывающих на какую-то другую базу данных? - person JeffO; 12.06.2020

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

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

person maxcastaneda    schedule 17.12.2014
comment
Вау... люди здесь очень разборчивы. Макс предоставил ссылку на по существу правильный ответ, и, похоже, за него проголосовали, потому что он предоставил ссылку вместо письменного ответа? - person Jeff Moden; 30.12.2014
comment
А когда блог умрет и исчезнет через несколько лет? - person David Roussel; 20.02.2015
comment
@DavidRoussel, в этом случае вы используете веб-архив :-) https://web.archive.org/web/20150502091442/http://www.baud.cz/blog/database-alias-in-microsoft-sql-server - person Mladen Mihajlovic; 02.12.2015
comment
Общепринято, что ответы должны быть ответами, а не ссылками на страницы, которые могут содержать соответствующую информацию. См.: meta.stackexchange.com/a/8259. - person David Roussel; 04.12.2015
comment
Спасибо за отзыв, @DavidRoussel ... Теперь, когда вы упомянули об этом, я уже сталкивался с проблемой неработающих ссылок, и теперь я понимаю ее. Спасибо за объяснение. В качестве боковой панели очень неприятно натыкаться на неработающие ссылки в документации Microsoft (это распространенная проблема), так что я понимаю это вдвойне. Спасибо еще раз. - person Jeff Moden; 30.08.2019

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

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'
person Adam Hardy    schedule 03.03.2016

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

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

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

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

person Jeff Moden    schedule 30.04.2014
comment
Судя по минусам, кто-то серьезно промахнулся. Даже ОП сообщил, что в итоге они использовали метод Synonym. - person Jeff Moden; 01.07.2017
comment
Я согласен, это было именно то, что я искал, и, кажется, именно об этом спрашивал ОП. - person Marcel Marino; 06.06.2019
comment
Да, старый пост, но я подозреваю, что за него проголосовали, потому что ваш ответ - это скорее обсуждение и личное предпочтение, чем решение. Вы не объясняете синонимы двух частей своей терминологии (я предполагаю, что вы имеете в виду локальную ссылку на схему [dbo].[synonym] вместо полного определения, такого как [server].[database].[schema].[table] ). Вы не приводите примеры и не объясняете, почему дублирование синонимов в базах данных лучше, чем прямые ссылки на эти таблицы или централизация синонимов на сервере. Все ваше объяснение состоит в том, что кто-то, кто ищет ответ, еще больше сбит с толку. - person Antony Booth; 28.08.2019

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

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

person Magier    schedule 15.10.2015

  1. Перейдите в базу данных, которую вы хотите создать псевдоним,

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

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

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

  4. Откройте таблицу Шкафы и перейдите вправо внизу и создайте имя нужного кабинета Псевдоним.

person Suzie    schedule 01.09.2017

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

person BAdmin    schedule 12.02.2014
comment
То же самое здесь. Поправьте меня, если я ошибаюсь, но это скорее псевдоним сервера, чем псевдоним базы данных. - person Jeff Moden; 30.04.2014