Advertisement
PavloSerg

Untitled

Mar 30th, 2023 (edited)
1,220
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
T-SQL 8.31 KB | None | 0 0
  1. --a) Триггер любого типа на добавление нового заказа - если заказчик более 2х раз не забирал свой заказ, то больше от него заказы не принимаем.
  2. CREATE OR ALTER TRIGGER Tr_InsertOrder
  3.     ON orders
  4.     instead OF INSERT
  5.     AS
  6. BEGIN
  7.     --select distinct customer_name from orders --seraja
  8.     INSERT INTO orders
  9.     SELECT customer_name, date, user_id, status_id
  10.     FROM inserted
  11.     where customer_name not in (select customer_name
  12.                                 from orders
  13.                                          join users u on orders.user_id = u.id
  14.                                 where datediff(day, date, getdate()) > 1
  15.                                   and status_id = 1
  16.                                 group by customer_name
  17.                                 having count(*) > 2)
  18. END
  19.     select count(*)
  20.     from orders
  21.     -----------
  22.     insert into orders
  23.     values (N'admin', getdate(), 5, 1)
  24.     -----------
  25.     select count(*)
  26.     from orders
  27.     -----------
  28.     insert into orders
  29.     values (N'seraja', getdate(), 5, 1)
  30.     -----------
  31.     select count(*)
  32.     from orders
  33.  
  34.  
  35.     --b) Последующий триггер на изменение стоимости продукта– менять стоимость продукта можно, если все заказы включающие этот продукт на данный момент оплачены.
  36. -- Изменение цены возможно не более чем на 5%
  37.  
  38.     CREATE OR ALTER TRIGGER Tr_UpdateProduct
  39.         ON products
  40.         after UPDATE
  41.         AS
  42.     BEGIN
  43.         if not update(price) return;
  44.  
  45.         declare @goodProduct table
  46.                              (
  47.                                  ProductName nvarchar(max)
  48.                              );
  49.         with cte1_AllProductsCount as (select p.name, count(*) as AllCount
  50.                                        from orders
  51.                                                 join rel_orders_products rop on orders.id = rop.order_id
  52.                                                 join products p on rop.product_id = p.id
  53.                                        group by p.name),
  54.              cte2_PaidProductsCount as (select p.name, count(*) as PaidCount
  55.                                         from orders
  56.                                                  join rel_orders_products rop on orders.id = rop.order_id
  57.                                                  join products p on rop.product_id = p.id
  58.                                         where status_id = 2
  59.                                            or status_id = 4
  60.                                         group by p.name)
  61.         insert
  62.         into @goodProduct
  63.         select AllP.name
  64.         from cte1_AllProductsCount AllP
  65.                  left join cte2_PaidProductsCount PaidP on AllP.name = PaidP.name
  66.         where PaidP.PaidCount is null
  67.            or PaidP.PaidCount = AllP.AllCount;
  68.  
  69.  
  70.         with BadProducts as (Select i.id as Id, d.price as oldValue, i.price as newValue
  71.                              from deleted d
  72.                                       join inserted i on i.id = d.id
  73.                              where i.name not in (select * from @goodProduct)
  74.                                 or abs(i.price - d.price) > d.price * 0.05)
  75.  
  76.         update products
  77.         set products.price = oldValue
  78.         from products p
  79.                  join BadProducts bp
  80.                       on p.id = bp.Id
  81.         --DECLARE ProductCursor CURSOR
  82.         --FOR
  83.         --open ProductCursor
  84.  
  85.         --declare @ProductId
  86.  
  87.     END
  88.  
  89.  
  90. --неоплаченный продукт
  91. select *
  92. from products
  93. where name = N'мышь жаренная'
  94. ---------------
  95. update products
  96. set price = 101
  97. where name = N'мышь жаренная'
  98. --------------
  99. select *
  100. from products
  101. where name = N'Итальяночка'
  102. -------------
  103. update products
  104. set price = 999999
  105. where name = N'Итальяночка'
  106. ------------
  107. update products
  108. set price = 3242
  109. where name = N'Итальяночка'
  110.  
  111.  
  112.  
  113.  
  114. --c) Замещающий триггер на операцию добавления(редактирования) данных в таблицу position – продукты в первой и второй позиции должны быть различны.
  115. CREATE OR ALTER TRIGGER Tr_InsertUpdatePositions
  116.     ON positions
  117.     instead OF INSERT, update
  118.     AS
  119. BEGIN
  120.     DECLARE @cntInsert INT, @cntDelete INT
  121.     SELECT @cntInsert = COUNT(*) FROM inserted
  122.     SELECT @cntDelete = COUNT(*) FROM deleted
  123.  
  124.     IF @cntDelete > 0 AND @cntInsert > 0
  125.             BEGIN
  126.                 DECLARE InsertedCursor CURSOR
  127.                 FOR
  128.                 (select i.id as Id, i.product_id_first AS leftt, i.product_id_second as rightt
  129.                 from inserted i
  130.                 where i.product_id_first  != i.product_id_second)
  131.                 open InsertedCursor
  132.                 declare @Id int, @IdFirst int, @IdSecond int
  133.                 fetch next from InsertedCursor into @Id, @IdFirst, @IdSecond
  134.                 while @@fetch_status = 0
  135.                 begin
  136.                     update positions
  137.                     set product_id_first = @IdFirst
  138.                     where id = @Id
  139.  
  140.                     update positions
  141.                     set product_id_second = @IdSecond
  142.                     where id = @Id
  143.  
  144.                     fetch next from InsertedCursor into @Id, @IdFirst, @IdSecond
  145.                 end
  146.                 close InsertedCursor
  147.                 deallocate InsertedCursor
  148.             END
  149.         ELSE IF @cntInsert > 0
  150.             BEGIN
  151.                 insert into positions
  152.                 select status_id, date, product_id_first, product_id_second, customer_name, user_id, with_sauce, price
  153.                 from inserted i
  154.                 where i.product_id_first  != i.product_id_second
  155.             END
  156.  
  157. end
  158.  
  159.  
  160.  
  161.  
  162.  
  163. --a) Триггер любого типа на добавление клиента – если клиент с таким
  164. --   паспортом уже есть, то не добавляем его, а выдаем соответствующее сообщение.
  165.  
  166. create or alter trigger Tr_UniquePassport
  167.     on Client
  168.     instead of insert
  169.     as
  170. begin
  171.     declare clientCursor cursor
  172.     for
  173.     (select *
  174.     from inserted)
  175.  
  176.     declare @newClientId int,
  177.         @newClientName nvarchar(max),
  178.         @newClientPassport nvarchar(max),
  179.         @newClientDiscount decimal(4,3)
  180.  
  181.     open clientCursor
  182.     fetch next from clientCursor into @newClientId, @newClientName, @newClientPassport, @newClientDiscount
  183.  
  184.     while @@FETCH_STATUS = 0
  185.     begin
  186.         declare @flag int
  187.  
  188.         select @flag = count(*)
  189.         from Client
  190.         where Client.Passport = @newClientPassport
  191.  
  192.         if @flag > 0
  193.             print 'Bad passport: ' + @newClientPassport
  194.         else
  195.             insert into Client
  196.             Values(@newClientName, @newClientPassport, @newClientDiscount)
  197.  
  198.         fetch next from clientCursor into @newClientId, @newClientName, @newClientPassport, @newClientDiscount
  199.     end
  200.  
  201.     close clientCursor
  202.     deallocate clientCursor
  203. end
  204.  
  205.  
  206. insert into Client
  207. Values
  208. ('Test1', '7777777777', null),
  209. ('Test2', '7777732177', null),
  210. ('Test3', '7777712377', null),
  211. ('Test4', '7777777777', null),
  212. ('Test5', '7777732177', null)
  213.  
  214.  
  215.  
  216.  
  217.  
  218.  
  219. --b)  Последующий триггер на изменение стоимости любого типа отеля –
  220. --    для 5-звездочных отелей стоимость может меняться только в большую сторону,
  221. --    для 1,2-звездочных – только в меньшую.
  222. go
  223.  
  224.  
  225. create or alter trigger Tr_ChangePriceHotel
  226.     on Hotel
  227.     after update
  228.     as
  229. begin
  230.     --print
  231.     select i.Name as HotelName,
  232.         i.Type as Starts,
  233.         i.Price as NewValue,
  234.         d.Price as OldValue
  235.     from inserted as i
  236.  
  237.     --alghoritm
  238.     join deleted as d on d.ID=i.ID
  239.     where
  240.     i.Type = 5 and i.Price < d.Price
  241.     or
  242.     i.Type < 3 and i.Price > d.Price
  243.  
  244.     declare @flag int
  245.  
  246.     select @flag = count(*)
  247.     from inserted as i
  248.     join deleted as d on d.ID=i.ID
  249.     where
  250.     i.Type = 5 and i.Price < d.Price
  251.     or
  252.     i.Type < 3 and i.Price > d.Price
  253.  
  254.     if @flag != 0
  255.     begin
  256.         print 'Bad transaction'
  257.         rollback
  258.     end
  259. end
  260.  
  261. update Hotel
  262. set Price = 0
  263. where Type = 5
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement