2013-03-23 5 views
2

У меня есть таблица с составным первичным ключом из 3 столбцов, скажем A, B, C. Я хочу создать триггер, который на UPDATE будет проверять что эти три столбца не будут изменены. Это то, что я до сих пор, но это не похоже на работу:Создайте триггер, который не позволит обновлять столбцы первичного ключа

CREATE TRIGGER TableTrigger 
ON Table 
AFTER INSERT, UPDATE AS 
BEGIN 
    IF (EXISTS (SELECT * FROM inserted) AND EXISTS (SELECT * FROM deleted)) 
    BEGIN 
    -- Update Operation 
    IF (SELECT COUNT(*) FROM inserted WHERE A IS NOT NULL OR B IS NOT NULL OR C IS NOT NULL) > 0 
    BEGIN 
     RAISERROR('Error, you cannot change Primary Key columns', 16, 1) 
     ROLLBACK 
     RETURN 
    END 
END 

Я ожидал, что, если я обновлю некоторые значения в таблице, в inserted значение для столбцов я не обновляю в быть NULL, но это не так. Я где-то читал, что мне нужно посмотреть как в inserted, так и на deleted, чтобы увидеть, изменились ли эти значения. Итак, мой вопрос в том, могу ли я проверить это без использования курсора?

спасибо.

ответ

3

Вы могли бы сделать

CREATE TRIGGER TableTrigger 
ON Table 
AFTER UPDATE AS 
BEGIN 
IF UPDATE(A) OR UPDATE(B) OR UPDATE(C) 
    BEGIN 
     RAISERROR('Error, you cannot change Primary Key columns', 16, 1) 
     ROLLBACK 
     RETURN 
    END 
END 

или запретить разрешения на обновление этих столбцов.

Оба подхода отрицают любую попытку обновления столбцов PK независимо от того, действительно ли значения изменяются. SQL Server не имеет триггеров на уровне строк и, если в таблице нет столбца IDENTITY (гарантированный неизменный), нет надежного способа сказать в триггере, если ПК фактически обновлен.

Например, INSERTED и DELETED таблицы в качестве триггера UPDATE на приведенной ниже таблице, были бы одинаковыми для обоих UPDATE отчетности.

CREATE TABLE T(C INT PRIMARY KEY); 

INSERT INTO T VALUES (1),(-1) 

/*Both values swapped*/ 
UPDATE T SET C = -C 

/*Both values left the same*/ 
UPDATE T SET C = C 
+0

Спасибо вам большое! – Cosmin

Смежные вопросы