База данных SQL Azure дублирует схему базы данных - PullRequest
0 голосов
/ 28 августа 2018

У меня есть база данных SQL Azure, которая содержит две таблицы Product и Order, которые сохранены в схеме dbo. Я хочу написать программу на C #, которая будет добавлять новую схему и дублировать те же определения таблиц, которые существуют в dbo.

Существующий:

dbo.Product
dbo.Order

Запустите программу C #, чтобы создать новую схему для client1, после чего две таблицы будут добавлены в базу данных, а список таблиц станет:

dbo.Product
dbo.Order
client1.Product
client1.Order

Пожалуйста, дайте мне знать, как я могу это сделать с помощью c #?

1 Ответ

0 голосов
/ 14 сентября 2018

Вы можете создать хранимую процедуру, которая получает два входных параметра:

  1. имя схемы для дублирования
  2. название новой схемы

Затем вы можете вызвать эту процедуру из вашей программы на c #.

Внутри процедуры вы можете построить динамический оператор, запрашивающий системную таблицу SQLServer INFORMATION_SCHEMA.TABLES.

Идея состоит в том, чтобы:

  • создать новую схему
  • клонировать исходные таблицы из старой схемы в новую схему
  • затем удалите все строки из таблиц в новой схеме

Обратите внимание: если у вас есть внешние ключи, вам придется ими управлять.

Вот пример для начала:

create procedure p_clone_schema(
  @source_schema nvarchar(50),   
  @new_schema    nvarchar(50)   
)as
begin
    --check if destination schema already exists
    if not exists (select * from INFORMATION_SCHEMA.SCHEMATA where schema_name = @new_schema)
    begin
        --create new schema
        declare @sql nvarchar(max) = 'CREATE SCHEMA ' + QUOTENAME(@new_schema) 
        exec(@sql)
        set @sql = ''

        --build statement to copy tables in the new shema and then truncate them
        select @sql = CONCAT
                    (
                    @sql ,  'select * into ' , QUOTENAME(@new_schema) , '.' , QUOTENAME(TABLE_NAME) 
                    , ' from ' , QUOTENAME(TABLE_SCHEMA) , '.' , QUOTENAME(TABLE_NAME) 
                    , ' truncate table ' , QUOTENAME(@new_schema) , '.' , QUOTENAME(TABLE_NAME)
                    )
        from INFORMATION_SCHEMA.TABLES 
        where TABLE_SCHEMA = @source_schema 
            and TABLE_TYPE = 'BASE TABLE'

        exec(@sql)
    end
end
...