В таблице Граф представлен график сетевого планирования:
CREATE TABLE Граф(номер INT PRIMARY KEY, --номер работы нач_соб INT, --начальное событие кон_соб INT, --конечное событие длит INT) --длительность работы
В таблице, моделирующей сетевой график, каждая запись соответствует некоторой работе, связывающей два события: начальное и конечное. Например:
Номер | Нач_соб | Кон_соб | Длит |
---|---|---|---|
12345678910 | 1113432556 | 2434556677 | 51236285472 |
Реализуем в виде триггеров ряд правил для обеспечения целостности данных в подобной сетевой структуре. Начальное событие графика (исток) обозначено цифрой "1". Если изменяется только номер конечного события и это изменение приводит к появлению параллельной работы, отменить изменение.
CREATE TRIGGER trig_updON Граф FOR UPDATE AS
Выберите операторы для продолжения текста триггера.
DECLARE @e1 INT, @e2 INT,@n INT SELECT @n=номер, @e1=нач_соб, @e2=кон_соб FROM insertedIF UPDATE(кон_соб) IF EXISTS(SELECT * FROM Граф WHERE номер<>@n AND нач_соб=@e1 AND кон_соб=@e2 ) ROLLBACK TRAN
DECLARE @e1 INT, @e2 INT,@n INT SELECT @e1=нач_соб, @e2=кон_соб FROM insertedIF (COLUMNS_UPDATED() & 4)=4 IF EXISTS(SELECT * FROM Граф WHERE нач_соб=@e1 AND кон_соб=@e2 ) ROLLBACK TRAN
IF (COLUMNS_UPDATED() ^ 4)=4 BEGIN DECLARE @e1 INT, @e2 INT,@n INT SELECT @n=номер, @e1=нач_соб, @e2=кон_соб FROM inserted IF EXISTS(SELECT * FROM Граф WHERE номер<>@n AND нач_соб=@e1 AND кон_соб=@e2 ) ROLLBACK TRAN END(Верный ответ)
IF UPDATE(кон_соб) BEGIN DECLARE @e1 INT, @e2 INT,@n INT SELECT @n=номер, @e1=нач_соб, @e2=кон_соб FROM inserted IF EXISTS(SELECT * FROM Граф WHERE номер<>@n AND нач_соб=@e1 AND кон_соб=@e2 ) ROLLBACK TRAN END