Advertisement
madanska

TRIGGERS

Nov 24th, 2019 (edited)
312
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
T-SQL 4.81 KB | None | 0 0
  1. ---------------------------------------------------------------------------------
  2. ------------------------------------Тригери--------------------------------------
  3. ---------------------------------------------------------------------------------
  4.  --ЗАД. 1.
  5.  --Tригер, който ще се изпълнява след добавяне на запис в PRODUCTS  
  6.  --и ще извежда всички записи от псевдотаблицата inserted,
  7.  --за да видим реално добавените записи.
  8. CREATE TRIGGER TNG_INSERT_PRODUCTS
  9. ON PRODUCTS
  10. AFTER INSERT
  11. AS
  12. PRINT 'NEW RECORDS WERE INSERTED!'
  13. PRINT 'THE INSERTED RECORDS ARE: '
  14. SELECT * FROM inserted
  15. -----------------------------------------------------------------
  16. --ПРОВЕРКА ДАЛИ ТРИГЕРЪТ РАБОТИ
  17. INSERT INTO PRODUCTS(PRODUCT_ID, NAME, DESCR, PRICE)
  18. VALUES (4000, 'DVD', 'DVD - DISK', 4)
  19. -----------------------------------------------------------------
  20. --ДА ВЪВЕДЕМ НЯКОЛКО ЗАПИСА:
  21. -- /ВЗЕМА ДАНННИ ОТ REGIONS И ГИ ВЪВЕЖДА В PRODUCTS/
  22. INSERT INTO PRODUCTS(PRODUCT_ID, NAME, DESCR,PRICE)
  23.      SELECT 5000 + REGION_ID,
  24.             'PRODUCT' + CAST(REGION_ID AS VARCHAR),
  25.             NAME,
  26.             REGION_ID*13.7
  27.        FROM REGIONS
  28. -----------------------------------------------------------------
  29. SELECT * FROM PRODUCTS
  30.  
  31. -- Извод:  
  32. -- тригерът се изпълнява след всяка команда, а не след добавяне
  33. -- на всеки запис, ако искаме да има логика, обработваща
  34. -- всеки нов добавен ред трябва да обработваме редовете от таблицата inserted
  35. -----------------------------------------------------------------
  36. -----------------------------------------------------------------
  37.  
  38. -- зад. 2.
  39. -- INSTEAD OF тригер изпълняващ се вместо добавяне/променяне на запис от PRODUCTS.
  40. -- Така забраняваме добавяне/променяне на записи в т-ца,
  41. -- като извеждаме кои данни няма да бъдат добавени/променени.
  42.  
  43. CREATE TRIGGER TGR_INSTEADOF_INSERT_UPDATE_PRODUCTS
  44. ON PRODUCTS
  45. INSTEAD OF INSERT, UPDATE
  46. AS
  47. PRINT 'THE FOLLOWING RECORDS CANNOT BE CHANGED'
  48. SELECT * FROM inserted
  49.  
  50. -----------------------------------------------------------------
  51. -- ПРОВЕРКА ДАЛИ ТРИГЕРА РАБОТИ
  52.  
  53. UPDATE PRODUCTS
  54.    SET DESCR ='TEST'
  55.  WHERE PRODUCT_ID BETWEEN 2000 AND 2100
  56.  
  57. -----------------------------------------------------------------
  58. INSERT INTO PRODUCTS (PRODUCT_ID, NAME, DESCR, PRICE)
  59.      SELECT 6000 + REGION_ID,
  60.             'PRODUCT ' + CAST(REGION_ID AS VARCHAR),
  61.             NAME,
  62.             REGION_ID*13.7
  63.        FROM REGIONS
  64.  
  65. -----------------------------------------------------------------
  66. SELECT * FROM PRODUCTS
  67. -- няма промяна!!
  68. -----------------------------------------------------------------
  69.  
  70.  
  71. --зад. 3.  
  72. --Проверка дали е променена конкретна фамилия на клиент
  73. --(ако е променена, ще запишем старата и новата фамилия в друга таблица.)
  74.  
  75. --Нека създадем тази друга таблица като временна:
  76. CREATE TABLE ##customers_history
  77. (
  78.     CUSTOMER_ID INT,
  79.     OLD_NAME    VARCHAR(15),
  80.     NEW_NAME    VARCHAR(15)
  81. )
  82. -----------------------------------------------------------------
  83. select * from ##customers_history
  84. -----------------------------------------------------------------
  85. CREATE TRIGGER TRG_CUSTOMERS_HISTORY
  86. ON CUSTOMERS
  87. FOR UPDATE
  88. AS
  89.  
  90. IF UPDATE(LNAME)
  91. BEGIN
  92.     INSERT INTO  ##customers_history(CUSTOMER_ID, OLD_NAME, NEW_NAME)
  93.     SELECT I.CUSTOMER_ID, D.LNAME, I.LNAME
  94.       FROM inserted I, deleted D
  95.      WHERE I.CUSTOMER_ID = D.CUSTOMER_ID
  96. END
  97. -----------------------------------------------------------------
  98. --Логика: ако при промяна на данните в customers е променена стойност
  99. --в lname, тогава правим съединение на псевдотаблиците inserted / deleted,
  100. --за да вземем старата и новата стойност от тях и да ги запишем в ##temptable
  101.  
  102. -----------------------------------------------------------------
  103. --проверка - ще променим фамилията на 2-ма клиента:
  104.  
  105. UPDATE CUSTOMERS
  106.    SET LNAME = 'PETROV'
  107.  WHERE CUSTOMER_ID IN (101, 102)
  108.  
  109.  -----------------------------------------------------------------
  110.  
  111. --НЕКА ВИДИМ КАКВО СЕ Е ЗАПСИАЛО ВЪВ ВРЕМЕННАТА ТАБЛИЦА:
  112.  SELECT * FROM ##customers_history
  113.  SELECT * FROM CUSTOMERS
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement