MS SQL изменить все ограничения - PullRequest
0 голосов
/ 25 января 2019

Чтобы изменить ограничение в MS SQL, обычно удаляют старое ограничение и добавляют новое с желаемыми свойствами, например:

alter table MY_TABLE drop constraint [MY_CONSTRAINT]
go

alter table MY_TABLE
    add constraint [MY_CONSTRAINT]
        foreign key (FK_TABLE_2) references TABLE_2
            on delete set null
        --or whatever property we want to change
go

Однако я хочу изменить все ограничения вмоя база данныхВ частности, я хочу, чтобы все ограничения внешнего ключа имели правило удаления set null.Возможно ли что-то подобное?

Ответы [ 2 ]

0 голосов
/ 26 января 2019

Если бы я хотел сделать это, я бы сделал это с Powershell / SMO.Примерно так:

import-module sqlps;

$scriptDrop = new-object microsoft.sqlserver.management.smo.scriptingoptions;
$scriptDrop.ScriptDrops = $true;
$s = new-object microsoft.sqlserver.management.smo.server '.';
$db = $s.Databases['yourDatabase'];
foreach ($table in $db.Tables) {
  foreach ($fk in $table.ForeignKeys) {
    $fk.DeleteAction = 'SetNull';
    $fk.Script($scriptDrop);
    $fk.Script();
  }
}

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

0 голосов
/ 25 января 2019

Я не знаю о чем-то, что позволяет делать все это одновременно, но вот оператор select, который может заставить вас выиграть немного времени:

SELECT 'ALTER TABLE [' + o1.name + '] DROP CONSTRAINT [' + fk.name + ']' AS DROP_STATEMENT
    ,   'ALTER TABLE [' + o1.name +'] ADD CONSTRAINT [' + fk.name + '] FOREIGN KEY ([' + c.name + ']) REFERENCES [' + o2.name + '] ON DELETE SET NULL' AS CREATE_STATEMENT
FROM sys.foreign_keys fk
    INNER JOIN sys.objects o1 ON fk.parent_object_id = o1.object_id
    INNER JOIN sys.objects o2 ON fk.referenced_object_id = o2.object_id
    INNER JOIN sys.foreign_key_columns fkc ON fk.object_id = fkc.constraint_object_id
    INNER JOIN sys.columns c ON c.object_id = o2.object_id AND c.column_id = fkc.referenced_column_id

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...