Заменить триггер создания с внешним ключом (RI) - PullRequest
2 голосов
/ 16 января 2012

Создать триггер:

SELECT @oldVersionId = (SELECT DISTINCT VERSION_ID FROM Deleted)
    SELECT @newVersionId = (SELECT DISTINCT VERSION_ID FROM Inserted)
    SELECT @appId = (SELECT DISTINCT APP_ID FROM Deleted)

UPDATE [TableName]
SET [VERSION_ID] = @newVersionId
WHERE (([VERSION_ID] = @oldVersionId) AND ([APP_ID] = @appId) )

Можно ли заменить этот триггер на внешний ключ для обновления VERSION_ID?

То, что я думаю, может быть проблемой, это условие AND, как выразитьчто в ФК с On del / update Cascade?

Ответы [ 2 ]

1 голос
/ 16 января 2012

ИНОСТРАННЫЕ КЛЮЧЕВЫЕ ОГРАНИЧЕНИЯ ничего не обновлять. Они проверяют значения, записываемые в запись, и приводят к сбою записи, если вызывают сбой ограничения.

Кроме того, как @marc_s указывает в своем комментарии, триггеры в MS SQL Server устанавливаются на основе. Таблицы INSERTED и DELETED могут содержать несколько записей одновременно. Ваш код работает только для одной записи.

Вы можете попробовать что-то в этом роде ...

UPDATE
  table
SET
  VERSION_ID = inserted.VERSION_ID
FROM
  table
INNER JOIN
  deleted
    ON  table.VERSION_ID = deleted.VERSION_ID
    AND table.APP_ID     = deleted.APP_ID
INNER JOIN
  inserted
    ON deleted.PRIMARY_KEY = inserted.PRIMARY_KEY


EDIT

Я только что прочитал ваш комментарий и думаю, что понимаю. Требуется ограничение внешнего ключа с помощью ON UPDATE CASCADE.

Этот формат используется для создания этого с помощью DDL.

ALTER TABLE DBO.<child table>
ADD CONSTRAINT <foreign key name> FOREIGN KEY <child column>
REFERENCES DBO.<parent table>(<parent column>)
{ON [DELETE|UPDATE] CASCADE}

Или вы можете просто настроить SQL Server Management Studio для его настройки. Просто убедитесь, что присутствует ОБНОВЛЕНИЕ КАСКАДА.

0 голосов
/ 16 января 2012

Я не могу точно сказать вам, что вы ищете - вы слишком неясны в своем вопросе.

Но в основном, если две таблицы связаны через ограничение внешнего ключа, конечно, вы можете добавить к нему предложение, чтобы убедиться, что дочерняя таблица обновляется при изменении PK родительской таблицы:

ALTER TABLE dbo.ChildTable
ADD CONSTRAINT FK_ChildTable_ParentTable
FOREIGN KEY(ChildTableColumn) REFERENCES dbo.ParentTable(PKColumn)
   ON UPDATE CASCADE

ON UPDATE CASCADE делает именно это - если столбец, на который ссылаются (PKColumn в ParentTable), изменяется, тогда ограничение FK будет «каскадно» обновляться вниз в дочернюю таблицу и обновлять ее ChildTableColumn, чтобы соответствовать новый PKColumn

Прочитайте все о каскадных ограничениях ссылочной целостности и какие опции у вас есть в MSDN Books Online

...