Как добавить ограничения первичного и внешнего ключа после экспорта данных из Azure SQL

Я использую SQL Server Management Studio 19 для переноса данных из исходной базы данных в целевую базу данных.
Я выбираю собственный клиент SQL Server 11.0 в качестве источника данных.

В качестве места назначения я также использую «Собственный клиент SQL Server 11.0» и выбираю целевую базу данных в качестве места назначения.

Данные были успешно экспортированы, но ограничения первичного и внешнего ключей отсутствуют. Что я пропустил?

Любая помощь или любые предложения приветствуются. Большое спасибо!

Разве я не видел, что этот точный вопрос уже задан? Я предлагаю вам использовать файл .bacpac для передачи данных

Nick.McDermaid 13.12.2020 10:30

Привет, @Jesse, пожалуйста, поправь меня, если я неправильно понял твой ответ.

Joseph Xu 13.12.2020 12:43

@Nick.McDermaid Спасибо, попробую.

Jesse 13.12.2020 12:45
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
Как установить LAMP Stack 1/2 на Azure Linux VM
Как установить LAMP Stack 1/2 на Azure Linux VM
В дополнение к нашему предыдущему сообщению о намерении Azure прекратить поддержку Azure Database для MySQL в качестве единого сервера после 16...
2
3
240
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Есть два способа экспортировать PK и FK.

  1. Использование SSMS для создания сценария sql. Нам просто нужно выбрать таблицы. Он сгенерирует script.sql на вашем локальном ПК.

Мы также можем написать несколько скриптов для экспорта PK и FK таблиц User вручную.
Я создал сценарий sql для экспорта PK и FK из системных таблиц и представлений.

2.1 Мы можем использовать следующий скрипт для экспорта PK.

select  case when colNo = 1 then concat('alter table ',concat(concat(res.schemaName,'.'),res.tableName)) else '' end headerOne,
        case when colNo = 1 then concat(concat('add constraint ' , res.PKName),' primary key( ') else '' end headerTwo,
        case when colNo = 1 then colName else concat(',',colName) end headerThree,
        case when colNo = s2.maxRow then ');' else '' end as headerFour
from (
    select s.name as schemaName,i.name as PKName,ov.name as tableName,c.name as colName,k.colid as colNo,k.keyno as indexNO 
        from
            sysindexes i  
            join sysindexkeys k on i.id = k.id and i.indid = k.indid  
            join sysobjects o on i.id = o.id  
            join sys.objects ov on o.id = ov.object_id
            join sys.schemas s ON ov.schema_id = s.schema_id
            join syscolumns c on i.id=c.id and k.colid = c.colid  
        where o.xtype = 'U' and exists(select 1 from sysobjects where xtype = 'PK' and name = i.name)  
        ) res
left join 
    (select schemaName,PKName,tableName,max(rono) as maxRow
         from 
         (
            select s.name as schemaName,i.name as PKName,ov.name as tableName,c.name as colName, ROW_NUMBER() OVER (PARTITION BY s.name,i.name,ov.name  ORDER BY o.name,k.colid) AS rono
                from
                    sysindexes i  
                    join sysindexkeys k on i.id = k.id and i.indid = k.indid  
                    join sysobjects o on i.id = o.id  
                    join sys.objects ov on o.id = ov.object_id
                    join sys.schemas s ON ov.schema_id = s.schema_id
                    join syscolumns c on i.id=c.id and k.colid = c.colid  
                where o.xtype = 'U' and exists(select 1 from sysobjects where xtype = 'PK' and name = i.name)  
 
         ) s1
         group by schemaName,PKName,tableName 
    ) s2 on res.schemaName = s2.schemaName and res.PKName=s2.PKName and res.tableName=s2.tableName

2.2 Затем мы можем скопировать скрипт из SSMS.

2.3 Затем мы вставляем скрипт в окно запроса промежуточной базы данных, чтобы выполнить скрипт.

2.4 После создания ПК таким же образом мы можем экспортировать ПК и создавать их.

select
   concat(concat('alter table ',c.CONSTRAINT_SCHEMA),concat('.',fk.TABLE_NAME)),
   concat(' add constraint  ', c.CONSTRAINT_NAME),  --cu.COLUMN_NAME
   concat(' foreign key( ',cu.COLUMN_NAME),
   concat(concat(') references ',c.CONSTRAINT_SCHEMA),concat('.',pk.TABLE_NAME)),
   concat(concat('(',pt.COLUMN_NAME),');')
from
    INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS c
inner join INFORMATION_SCHEMA.TABLE_CONSTRAINTS fk
    on c.CONSTRAINT_NAME = FK.CONSTRAINT_NAME
inner join INFORMATION_SCHEMA.TABLE_CONSTRAINTS pk
    on c.UNIQUE_CONSTRAINT_NAME = PK.CONSTRAINT_NAME
inner join INFORMATION_SCHEMA.KEY_COLUMN_USAGE cu
    on c.CONSTRAINT_NAME = CU.CONSTRAINT_NAME
inner join  (
            select
                i1.TABLE_NAME,
                i2.COLUMN_NAME
            from
                INFORMATION_SCHEMA.TABLE_CONSTRAINTS i1
            inner join INFORMATION_SCHEMA.KEY_COLUMN_USAGE i2
                on i1.CONSTRAINT_NAME = i2.CONSTRAINT_NAME
            where
                i1.CONSTRAINT_TYPE = 'PRIMARY KEY'
           ) PT
    on pt.TABLE_NAME = pk.TABLE_NAME

Другие вопросы по теме