2012-01-16 1 views
2

Создания триггера:Заменить Создание триггера с внешним ключом (RI)

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?

Я думаю, что проблема может быть проблемой И, как выразить это в FK с помощью On/update Cascade?

+0

Я хочу избавиться от этого триггера и заменить его на ограничение FK. Когда PK ID изменяет каскад, который изменяется на другой таблице идентификаторов FK. – Elisabeth

ответ

0

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

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

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

Read all about cascading referential integrity constraints и ВГ на опциях, которые у вас есть на электронных книгах MSDN

1

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

Кроме того, как указывает @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, чтобы настроить его. Просто убедитесь, что присутствует ON UPDATE CASCADE.