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

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


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

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

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

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

  4. откройте таблицу шкафов и перейдите справа внизу и создайте имя шкафа псевдонима, который вы хотеть.


вы можете создать псевдоним из "SQL Server Configuration Manager" в разделе Configuartion Tool в папке 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


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

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

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

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