Подтвердить что ты не робот

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

4b9b3361

Ответ 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, которое вы хотите.

Ответ 7

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

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

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

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