Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Вопросы по созданию триггеров  [new]
Ryskulya
Member

Откуда:
Сообщений: 15
В таблице Граф представлен график сетевого планирования:
CREATE TABLE Граф
(номер INT PRIMARY KEY, --номер работы
нач_соб INT, --начальное событие
кон_соб INT, --конечное событие
длит INT) --длительность работы

В таблице, моделирующей сетевой график, каждая запись соответствует некоторой работе, связывающей два события: начальное и конечное. Реализуем в виде триггеров ряд правил для обеспечения целостности данных в подобной сетевой структуре. Начальное событие графика (исток) обозначено цифрой "1".

1. Разработать триггер для вставки новой записи, причем необходимо отменить ввод, если номер начального события оказался меньше номера хотя бы одного конечного события, введенного ранее.
CREATE TRIGGER trig_ins
ON Граф FOR INSERT
AS

Выберите операторы для продолжения текста триггера.
а) DECLARE @e INT
SELECT @e=нач_соб FROM inserted
IF EXISTS(SELECT * FROM Граф WHERE кон_соб>@e)
ROLLBACK TRAN
б) IF EXISTS(SELECT * FROM Граф
WHERE кон_соб>ANY(SELECT @e=нач_соб FROM inserted)
ROLLBACK TRAN
в) IF EXISTS(SELECT * FROM Граф
WHERE кон_соб>(SELECT @e=нач_соб FROM inserted)
ROLLBACK TRAN
г) DECLARE @e INT
SELECT @e=нач_соб FROM inserted
IF NOT EXISTS(SELECT * FROM Граф WHERE кон_соб<@e
ROLLBACK TRAN

2. Разработать триггер для удаления работы, причем при попытке удаления единственной работы, выходящей из данного начального события, отменить удаление, заменив в удаляемой работе конечное событие на сток (т.е. на конечное событие с максимальным номером).
CREATE TRIGGER trig_del
ON Граф INSTEAD OF DELETE
AS

Выберите операторы для продолжения текста триггера.
а) DECLARE @e INT,@n INT, @m INT
SELECT @n=номер, @e=нач_соб FROM deleted
SELECT @m=MAX(кон_соб) FROM Граф WHERE номер<>@n
IF NOT EXISTS(SELECT *
FROM Граф
WHERE номер<>@n AND нач_соб=@e )
UPDATE Граф SET кон_соб=@m WHERE номер=@n
ELSE
DELETE FROM Граф WHERE номер=@n
б) DECLARE @e INT,@n INT, @m INT
SELECT @n=номер, @e=нач_соб FROM deleted
SELECT @m=MAX(кон_соб) FROM Граф WHERE номер<>@n
IF NOT EXISTS(SELECT *
FROM Граф
WHERE нач_соб=@e )
UPDATE Граф SET кон_соб=@m WHERE номер=@n
ELSE
DELETE FROM Граф WHERE номер=@n
в) DECLARE @e INT,@n INT, @m INT
SELECT @n=номер, @e=нач_соб FROM deleted
SELECT @m=MAX(кон_соб) FROM Граф
IF NOT EXISTS(SELECT *
FROM Граф
WHERE номер<>@n AND нач_соб=@e )
UPDATE Граф SET кон_соб=@m WHERE номер=@n
ELSE
DELETE FROM Граф WHERE номер=@n
г) DECLARE @e INT,@n INT, @m INT
SELECT @n=номер, @e=нач_соб FROM deleted
SELECT @m=MAX(кон_соб) FROM Граф WHERE номер<>@n
IF NOT EXISTS(SELECT *
FROM Граф
WHERE номер<>@n AND нач_соб=@e )
UPDATE Граф SET кон_соб=@m WHERE нач_соб=@e
ELSE
DELETE FROM Граф WHERE нач_соб=@e

3. Запретить одновременное изменение только номеров начального и конечного событий.
CREATE TRIGGER trig_upd
ON Граф FOR UPDATE
AS

Выберите операторы для продолжения текста триггера.
а) IF (COLUMNS_UPDATED() & 6)=6
ROLLBACK TRAN
б) IF UPDATE(нач_соб) AND UPDATE(кон_соб)
ROLLBACK TRAN
в) IF UPDATE(нач_соб,кон_соб)
ROLLBACK TRAN
г) IF (COLUMNS_UPDATED() & 2)=2
ROLLBACK TRAN
16 мар 05, 12:23    [1390012]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы по созданию триггеров  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
Вы хотите чтоб тут за Вас лабу сделали? Тогда Вам в форум Работа.
16 мар 05, 12:36    [1390107]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить