Otchet_laba4
.docxХранимая процедура pDel_D
CREATE PROCEDURE pDel_D(
@Nom INT,
@Id INT
)
AS
-- Удаляет строку из таблицы Have_D и корректирует общий доход
-- Входной параметр @Nom задает номер жителя
-- Входной параметр @Id задает индентификатор источника дохода
-- Процедура возвращает код –100, если источник дохода с
-- идентификатором @Id отсутствует
-- Процедура возвращает код –101, если житель с номером @Nom
-- отсутствует
-- Процедура возвращает код –102, если в таблице Have_D
-- отсутствует строка со значениями @Nom и @Id
-- Пример использования этой хранимой процедуры:
-- Declare @RetCode int;
-- EXEC @RetCode = pDel_D 1, 9;
-- SELECT @RetCode;
SET NOCOUNT ON
Declare @RetCode int;
DELETE FROM Have_D
WHERE (Nom = @Nom) AND (Id = @Id)
IF @@RowCount=0
RETURN -102;
EXEC @RetCode = pSubMoney @Nom, @Id;
IF @RetCode<>0
RETURN @RetCode;
RETURN;
Хранимая процедура pAdd_D
CREATE PROCEDURE pAdd_D(
@Nom INT,
@Id INT,
@Comment CHAR(30)
)
AS
-- Добавляет строку в таблицу Have_D и корректирует общий доход
-- Входной параметр @Nom задает номер жителя
-- Входной параметр @Id задает индентификатор источника дохода
-- Входной параметр @Comment содержит комментарий
-- Процедура возвращает код –100, если источник дохода с
-- идентификатором @Id отсутствует
-- Процедура возвращает код –101, если житель с номером @Nom
-- отсутствует
-- Пример использования этой хранимой процедуры:
-- Declare @RetCode int;
-- EXEC @RetCode = pAdd_D 1, 9, NULL;
-- SELECT @RetCode;
SET NOCOUNT ON
Declare @RetCode int;
EXEC @RetCode = pAddMoney @Nom, @Id;
IF @RetCode<>0
RETURN @RetCode;
INSERT INTO Have_D
VALUES (@Nom, @Id, @Comment);
RETURN;
Оператор DML не может повлиять на срабатывание триггера, однако триггер можно временно отключить оператором ALTER TABLE с параметром DISABLE TRIGGER:
ALTER TABLE имя_таблицы DISABLE TRIGGER имя_триггера
Для включения триггера применяется тот же оператор, но с параметром ENABLE TRIGGER:
ALTER TABLE имя_таблицы ENABLE TRIGGER имя_триггера
Триггер AFTER
Триггер AFTER создается оператором следующего вида:
CREATE TRIGGER имя_триггера ON имя_таблицы
AFTER операция, ...
AS
программный_код_триггера
Созданный триггер выполняется в ответ на событие, возникающее после завершения указанной за ключевым словом AFTER операции добавления (Insert), удаления (Delete) или обновления (Update), но до подтверждения фиксации результатов модификации. Например, триггер, созданный оператором
CREATE TRIGGER ai_PROFIT_trig ON PROFIT
AFTER Insert
AS
PRINT('Добавлена строка');
выводит сообщение 'Добавлена строка' при добавлении каждой строки в таблицу PROFIT, в чем можно убедиться, если воспользоваться оператором
INSERT INTO PROFIT (Id, Source, Moneys)
VALUES (9, 'Менеджер', 20000.00)
Предложение AFTER
Предложение AFTER позволяет указать операцию (или операции), приводящие к запуску триггера. Может быть предусмотрен запуск триггера при выполнении оператора INSERT, UPDATE или DELETE либо любого сочетания этих трех операторов, например:
AFTER INSERT, DELETE
или
AFTER UPDATE, INSERT
или
AFTER DELETE
Триггеры, объявляемые с предложением AFTER, могут быть закреплены только за таблицами; закрепление этих триггеров за представлениями не допускается.
MS SQL
CREATE TABLE t1 (ID int, pokupatel nchar(30), Mark nchar(30),dat date, NORR int);
CREATE TABLE t2(ID int, FIOid int, kontakts nchar(30),kupilza money, residence nchar(30));
CREATE TABLE t3(ID int, NameID int, kupilza money, ChemZanimautsay nchar(30));
SELECT * FROM t1
SELECT * FROM t2
SELECT * FROM t3
CREATE TRIGGER Insumm
On t1
AFTER UPDATE
AS
BEGIN
INSERT INTO t2 VALUES (1,1,11111,111111,'Âàñÿ');
END
UPDATE t1 SET pokupatel = 'Вася' WHERE pokupatel = 'Алексей Алексеич';
INSERT INTO t1 VALUES (1,'Алексей Васивич','Мустанг','01-07-2011',3);
INSERT INTO t3 VALUES (1,2,10000,'Перевозки');
INSERT INTO t2 VALUES (2,2,89684599988,1000,'г.Чебоксары');
CREATE TRIGGER iod_PERSON_trig ON t1
INSTEAD OF Delete
AS
DECLARE @x int;
SELECT @x=Deleted.NORR from Deleted;
IF EXISTS (SELECT * from t2 WHERE FIOid = @x)
DELETE FROM t2 WHERE FIOid = @x;
DELETE FROM t2 WHERE FIOid = 2;
INSERT INTO t2 VALUES (FIOid=3);
DROP TRIGGER InSumm
DROP TRIGGER iod_PERSON_trig
CREATE PROCEDURE pAdd(
@Number INT,
@ID INT,
@residence NCHAR(30)
)
AS
Declare @RetCode int;
EXEC @RetCode = pAdd 1, 9, NULL;
SELECT @RetCode;
SET NOCOUNT ON
--Declare @RetCode int;
EXEC @RetCode = pAddMoney @Number, @ID;
IF @RetCode<>0
RETURN @RetCode;
INSERT INTO t1
VALUES (@Number, @ID, @residence);
RETURN;
VISUAL STUDIO
--CREATE TRIGGER InSumm on Dealers
AFTER UPDATE
AS
BEGIN
Insert INTO Citizens values (5,2,2,1);
--END
SELECT * FROM Dealers
SELECT * FROM Citizens
SELECT * FROM Organizations
CREATE TABLE Citizens ()
INSERT INTO Dealers VALUES (9,'Алексей Алексееч','Cool',20,05-05-2011,45);
INSERT INTO Dealers VALUES ('');
CREATE TRIGGER iod_PERSON_trig ON Dealers
INSTEAD OF Delete
AS
DECLARE @x int;
SELECT @x=Deleted.NORR from Deleted;
IF EXISTS (SELECT * from Citizens WHERE NORR = @x)
DELETE FROM Citizens WHERE NORR = @x;
DELETE FROM Dealers WHERE NORR = @x;
INSERT INTO Dealers
VALUES(8,'Алексей Алексеевич','FORD',9,'05.05.2011');
INSERT INTO Citizens VALUES (1,'Алексей Алексеич','Ford','01-05-2011',5);