Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ---------------------------------------------------------------------------------
- ------------------------------------Тригери--------------------------------------
- ---------------------------------------------------------------------------------
- --ЗАД. 1.
- --Tригер, който ще се изпълнява след добавяне на запис в PRODUCTS
- --и ще извежда всички записи от псевдотаблицата inserted,
- --за да видим реално добавените записи.
- CREATE TRIGGER TNG_INSERT_PRODUCTS
- ON PRODUCTS
- AFTER INSERT
- AS
- PRINT 'NEW RECORDS WERE INSERTED!'
- PRINT 'THE INSERTED RECORDS ARE: '
- SELECT * FROM inserted
- -----------------------------------------------------------------
- --ПРОВЕРКА ДАЛИ ТРИГЕРЪТ РАБОТИ
- INSERT INTO PRODUCTS(PRODUCT_ID, NAME, DESCR, PRICE)
- VALUES (4000, 'DVD', 'DVD - DISK', 4)
- -----------------------------------------------------------------
- --ДА ВЪВЕДЕМ НЯКОЛКО ЗАПИСА:
- -- /ВЗЕМА ДАНННИ ОТ REGIONS И ГИ ВЪВЕЖДА В PRODUCTS/
- INSERT INTO PRODUCTS(PRODUCT_ID, NAME, DESCR,PRICE)
- SELECT 5000 + REGION_ID,
- 'PRODUCT' + CAST(REGION_ID AS VARCHAR),
- NAME,
- REGION_ID*13.7
- FROM REGIONS
- -----------------------------------------------------------------
- SELECT * FROM PRODUCTS
- -- Извод:
- -- тригерът се изпълнява след всяка команда, а не след добавяне
- -- на всеки запис, ако искаме да има логика, обработваща
- -- всеки нов добавен ред трябва да обработваме редовете от таблицата inserted
- -----------------------------------------------------------------
- -----------------------------------------------------------------
- -- зад. 2.
- -- INSTEAD OF тригер изпълняващ се вместо добавяне/променяне на запис от PRODUCTS.
- -- Така забраняваме добавяне/променяне на записи в т-ца,
- -- като извеждаме кои данни няма да бъдат добавени/променени.
- CREATE TRIGGER TGR_INSTEADOF_INSERT_UPDATE_PRODUCTS
- ON PRODUCTS
- INSTEAD OF INSERT, UPDATE
- AS
- PRINT 'THE FOLLOWING RECORDS CANNOT BE CHANGED'
- SELECT * FROM inserted
- -----------------------------------------------------------------
- -- ПРОВЕРКА ДАЛИ ТРИГЕРА РАБОТИ
- UPDATE PRODUCTS
- SET DESCR ='TEST'
- WHERE PRODUCT_ID BETWEEN 2000 AND 2100
- -----------------------------------------------------------------
- INSERT INTO PRODUCTS (PRODUCT_ID, NAME, DESCR, PRICE)
- SELECT 6000 + REGION_ID,
- 'PRODUCT ' + CAST(REGION_ID AS VARCHAR),
- NAME,
- REGION_ID*13.7
- FROM REGIONS
- -----------------------------------------------------------------
- SELECT * FROM PRODUCTS
- -- няма промяна!!
- -----------------------------------------------------------------
- --зад. 3.
- --Проверка дали е променена конкретна фамилия на клиент
- --(ако е променена, ще запишем старата и новата фамилия в друга таблица.)
- --Нека създадем тази друга таблица като временна:
- CREATE TABLE ##customers_history
- (
- CUSTOMER_ID INT,
- OLD_NAME VARCHAR(15),
- NEW_NAME VARCHAR(15)
- )
- -----------------------------------------------------------------
- select * from ##customers_history
- -----------------------------------------------------------------
- CREATE TRIGGER TRG_CUSTOMERS_HISTORY
- ON CUSTOMERS
- FOR UPDATE
- AS
- IF UPDATE(LNAME)
- BEGIN
- INSERT INTO ##customers_history(CUSTOMER_ID, OLD_NAME, NEW_NAME)
- SELECT I.CUSTOMER_ID, D.LNAME, I.LNAME
- FROM inserted I, deleted D
- WHERE I.CUSTOMER_ID = D.CUSTOMER_ID
- END
- -----------------------------------------------------------------
- --Логика: ако при промяна на данните в customers е променена стойност
- --в lname, тогава правим съединение на псевдотаблиците inserted / deleted,
- --за да вземем старата и новата стойност от тях и да ги запишем в ##temptable
- -----------------------------------------------------------------
- --проверка - ще променим фамилията на 2-ма клиента:
- UPDATE CUSTOMERS
- SET LNAME = 'PETROV'
- WHERE CUSTOMER_ID IN (101, 102)
- -----------------------------------------------------------------
- --НЕКА ВИДИМ КАКВО СЕ Е ЗАПСИАЛО ВЪВ ВРЕМЕННАТА ТАБЛИЦА:
- SELECT * FROM ##customers_history
- SELECT * FROM CUSTOMERS
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement