Advertisement
S_Madanska

week 8-РЕШЕНИЯ

Nov 17th, 2022 (edited)
1,407
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
T-SQL 11.54 KB | None | 0 0
  1.     --------------------------------------------------------------------------------
  2.     -------------------------------- ТРАНЗАКЦИИ ------------------------------------
  3.     --------------------------------------------------------------------------------
  4.     --Пример 6-1.
  5.     --Да се създаде транзакция, която добавя нов клиент и създава поръчка за него,
  6.     --включваща два продукта.
  7.     SELECT * FROM PRODUCTS
  8.  
  9.     --#1
  10.     BEGIN TRAN TRAN1
  11.         --OPERATION 1:
  12.         INSERT INTO CUSTOMERS(CUSTOMER_ID, COUNTRY_ID, FNAME, LNAME, ADDRESS, EMAIL, GENDER)
  13.         VALUES(1001, 'BG', 'Ива', 'Илиева', 'гр. Пловдив Ж.К. Тракия', 'ii@abv.bg', 'F')
  14.         --OPERAION 2:
  15.         INSERT INTO ORDERS (ORDER_ID, ORDER_DATE, CUSTOMER_ID, EMPLOYEE_ID)
  16.         VALUES(1, GETDATE(), 1001, 125)
  17.         --OPERATION 3:
  18.         INSERT INTO ORDER_ITEMS(ORDER_ID, PRODUCT_ID, QUANTITY, UNIT_PRICE)
  19.         VALUES(1, 1726, 1, 99.00)
  20.         --OPERATION 4:
  21.         INSERT INTO ORDER_ITEMS(ORDER_ID, PRODUCT_ID, QUANTITY, UNIT_PRICE)
  22.         VALUES(1, 2245, 1, 42)
  23.     COMMIT TRAN TRAN1
  24.  
  25.     SELECT * FROM ORDER_ITEMS
  26.     WHERE ORDER_ID = 1
  27.  
  28.     --#1 --NO atomic
  29.     BEGIN TRAN TRAN1
  30.         --OPERATION 1:
  31.         INSERT INTO CUSTOMERS(CUSTOMER_ID, COUNTRY_ID, FNAME, LNAME, ADDRESS, EMAIL, GENDER)
  32.         VALUES(1002, 'BG', 'Ива', 'Илиева', 'гр. Пловдив Ж.К. Тракия', 'ii@abv.bg', 'F')
  33.         --OPERAION 2:
  34.         INSERT INTO ORDERS (ORDER_ID, ORDER_DATE, CUSTOMER_ID, EMPLOYEE_ID)
  35.         VALUES(1, GETDATE(), 1001, 125)
  36.         --OPERATION 3:
  37.         INSERT INTO ORDER_ITEMS(ORDER_ID, PRODUCT_ID, QUANTITY, UNIT_PRICE)
  38.         VALUES(1, 1726, 1, 99.00)
  39.         --OPERATION 4:
  40.         INSERT INTO ORDER_ITEMS(ORDER_ID, PRODUCT_ID, QUANTITY, UNIT_PRICE)
  41.         VALUES(1, 2245, 1, 42)
  42.     COMMIT TRAN TRAN1
  43.  
  44.     SELECT * FROM CUSTOMERS
  45.  
  46.     --#2
  47.     BEGIN TRAN TRAN1
  48.         --OPERATION 1:
  49.         INSERT INTO CUSTOMERS(CUSTOMER_ID, COUNTRY_ID, FNAME, LNAME, ADDRESS, EMAIL, GENDER)
  50.         VALUES(1003, 'BG', 'Ива', 'Илиева', 'гр. Пловдив Ж.К. Тракия', 'ii@abv.bg', 'F')
  51.         IF @@ERROR <> 0 ROLLBACK
  52.  
  53.         --OPERAION 2:
  54.         INSERT INTO ORDERS (ORDER_ID, ORDER_DATE, CUSTOMER_ID, EMPLOYEE_ID)
  55.         VALUES(1, GETDATE(), 1001, 125)
  56.         IF @@ERROR <> 0 ROLLBACK
  57.  
  58.         --OPERATION 3:
  59.         INSERT INTO ORDER_ITEMS(ORDER_ID, PRODUCT_ID, QUANTITY, UNIT_PRICE)
  60.         VALUES(1, 1726, 1, 99.00)
  61.         IF @@ERROR <> 0 ROLLBACK
  62.  
  63.         --OPERATION 4:
  64.         INSERT INTO ORDER_ITEMS(ORDER_ID, PRODUCT_ID, QUANTITY, UNIT_PRICE)
  65.         VALUES(1, 2245, 1, 42)
  66.         IF @@ERROR <> 0 ROLLBACK
  67.  
  68.     COMMIT TRAN TRAN1
  69.  
  70.     SELECT * FROM CUSTOMERS
  71.  
  72.     --#3
  73.     BEGIN TRAN TRAN1
  74.     SET XACT_ABORT ON
  75.         --OPERATION 1:
  76.         INSERT INTO CUSTOMERS(CUSTOMER_ID, COUNTRY_ID, FNAME, LNAME, ADDRESS, EMAIL, GENDER)
  77.         VALUES(1003, 'BG', 'Ива', 'Илиева', 'гр. Пловдив Ж.К. Тракия', 'ii@abv.bg', 'F')
  78.         --OPERAION 2:
  79.         INSERT INTO ORDERS (ORDER_ID, ORDER_DATE, CUSTOMER_ID, EMPLOYEE_ID)
  80.         VALUES(1, GETDATE(), 1001, 125)
  81.         --OPERATION 3:
  82.         INSERT INTO ORDER_ITEMS(ORDER_ID, PRODUCT_ID, QUANTITY, UNIT_PRICE)
  83.         VALUES(1, 1726, 1, 99.00)
  84.         --OPERATION 4:
  85.         INSERT INTO ORDER_ITEMS(ORDER_ID, PRODUCT_ID, QUANTITY, UNIT_PRICE)
  86.         VALUES(1, 2245, 1, 42)
  87.     COMMIT TRAN TRAN1
  88.  
  89.     SELECT * FROM CUSTOMERS
  90.  
  91.     /*Пример 6-2.
  92.     Транзакция, която променя фамилията на клиент с идентификатор = 1001,
  93.     след което отхвърля направените промени.*/
  94.     BEGIN TRAN
  95.             --1
  96.             SELECT LNAME
  97.             FROM CUSTOMERS  
  98.             WHERE CUSTOMER_ID = 1001
  99.             --2
  100.             UPDATE CUSTOMERS  
  101.             SET LNAME = 'Димитрова'
  102.             WHERE CUSTOMER_ID = 1001
  103.             --3
  104.             SELECT LNAME
  105.             FROM CUSTOMERS  
  106.             WHERE CUSTOMER_ID = 1001
  107.     ROLLBACK TRAN
  108.             SELECT LNAME
  109.             FROM CUSTOMERS  
  110.             WHERE CUSTOMER_ID = 1001
  111.  
  112.     /*Пример 6-3.
  113.     Транзакция, която въвежда нов клиент, поставя точка на запис,
  114.     въвежда поръчка, след което отхвърля промените до точката на запис, т.е.
  115.     отхвърля се само поръчката.*/
  116.     SELECT * FROM EMPLOYEES
  117.  
  118.  
  119.     --START.............POINT1 ......... 2.... 3 ROLLBACK POINT1
  120.  
  121.     BEGIN TRAN
  122.         --OPERATION 1:
  123.         INSERT INTO CUSTOMERS(CUSTOMER_ID, COUNTRY_ID, FNAME, LNAME)
  124.         VALUES(1003, 'IT', 'Кей', 'Ромеро')
  125.     SAVE TRAN POINT1
  126.         --OPERATION 2:
  127.         INSERT INTO ORDERS(ORDER_ID, ORDER_DATE, EMPLOYEE_ID, CUSTOMER_ID)
  128.         VALUES (2, GETDATE(), 137, 1003)
  129.     ROLLBACK TRAN POINT1
  130.     COMMIT TRAN
  131.  
  132.     SELECT * FROM ORDERS
  133.     SELECT * FROM CUSTOMERS
  134.  
  135.     /*Задача 6-1.
  136.     Транзакция, която има за цел да изтрие отдел „Мениджмънт“,
  137.     като преди това прехвърли всички служители от него в отдел „Администрация“.
  138.     */
  139.     SELECT D.NAME , D.DEPARTMENT_ID, E.EMPLOYEE_ID
  140.     FROM EMPLOYEES E FULL JOIN DEPARTMENTS D
  141.     ON D.DEPARTMENT_ID = E.DEPARTMENT_ID
  142.     WHERE D.NAME = 'Мениджмънт' OR D.NAME = 'Администрация'
  143.  
  144.     BEGIN TRAN
  145.     ---прехвърли всички служители  „Мениджмънт“ --> „Администрация“
  146.     UPDATE EMPLOYEES
  147.     SET DEPARTMENT_ID = 10
  148.     WHERE DEPARTMENT_ID = 90
  149.     --изтрие отдел „Мениджмънт“
  150.     DELETE FROM DEPARTMENTS
  151.     WHERE NAME = 'Мениджмънт'
  152.     COMMIT TRAN
  153.  
  154.     SELECT D.NAME , D.DEPARTMENT_ID, E.EMPLOYEE_ID
  155.     FROM EMPLOYEES E FULL JOIN DEPARTMENTS D
  156.     ON D.DEPARTMENT_ID = E.DEPARTMENT_ID
  157.     WHERE D.NAME = 'Мениджмънт' OR D.NAME = 'Администрация'
  158.  
  159.      /* Задача 6-2.
  160.     Транзакция, която изтрива продукт 1726 - първо го изтрива от всички поръчки
  161.     после от таблицата с продукти, и накрая отхвърля направените промени.*/
  162.     SELECT *
  163.     FROM PRODUCTS P JOIN ORDER_ITEMS OI
  164.     ON P.PRODUCT_ID = OI.PRODUCT_ID
  165.     WHERE P.PRODUCT_ID = 1726
  166.  
  167.     BEGIN TRAN
  168.         --OPER 1
  169.         SELECT * FROM PRODUCTS
  170.         WHERE PRODUCT_ID = 1726
  171.         --OPER 2:
  172.         DELETE FROM ORDER_ITEMS
  173.         WHERE PRODUCT_ID = 1726
  174.         --OPER 3:
  175.         DELETE FROM PRODUCTS
  176.         WHERE PRODUCT_ID = 1726
  177.         --OPER 3:
  178.         SELECT * FROM PRODUCTS
  179.         WHERE PRODUCT_ID = 1726
  180.     ROLLBACK TRAN
  181.  
  182.     SELECT *
  183.     FROM PRODUCTS P JOIN ORDER_ITEMS OI
  184.     ON P.PRODUCT_ID = OI.PRODUCT_ID
  185.     WHERE P.PRODUCT_ID = 1726
  186.  
  187.     --Задача *
  188.     --Да се създаде транзакция, която променя фамилията на служител с
  189.     --идентификатор 103 на 'Гочев', променя фамилията на служител с
  190.     --идентификатор 114 на 'Петров', както и фамилията на служител с
  191.     --идентификатор 118 на 'Маринов'.
  192.     --Нека след това извлече в резултат име и фамилия само за горепосочените
  193.     --променени служители.
  194.     --Като промените от транзакцията останат постоянни!
  195.     BEGIN TRAN
  196.         ---OPER 1:
  197.         SELECT FNAME, LNAME
  198.         FROM EMPLOYEES
  199.         WHERE EMPLOYEE_ID IN (103, 114, 118)
  200.         ---OPER 2:
  201.         UPDATE EMPLOYEES
  202.         SET LNAME = 'Гочев'
  203.         WHERE EMPLOYEE_ID = 103
  204.         ---OPER 3:
  205.         UPDATE EMPLOYEES
  206.         SET LNAME = 'Петров'
  207.         WHERE EMPLOYEE_ID = 114
  208.         ---OPER 4:
  209.         UPDATE EMPLOYEES
  210.         SET LNAME = 'Маринов'
  211.         WHERE EMPLOYEE_ID = 118
  212.         ---OPER 5:
  213.         SELECT FNAME, LNAME
  214.         FROM EMPLOYEES
  215.         WHERE EMPLOYEE_ID IN (103, 114, 118)
  216.     COMMIT TRAN
  217.  
  218.         SELECT FNAME, LNAME
  219.         FROM EMPLOYEES
  220.         WHERE EMPLOYEE_ID IN (103, 114, 118)
  221.  
  222.     -------------------------------------------------------------------------------------
  223.     ---------------------------------- ПРОЦЕДУРИ ----------------------------------------
  224.     -------------------------------------------------------------------------------------
  225.     --Пример 7-2.
  226.     --Да се създаде процедура, която за подаден като входен параметър идентификатор на
  227.     --поръчка извежда имена на служител, който я е обработил, както и общата й стойност.
  228.     CREATE PROCEDURE EMPLOYEE_TOTAL_ORDER_PROC @ORDER INT
  229.     AS
  230.     SELECT FNAME, LNAME, O.ORDER_ID, SUM(UNIT_PRICE*QUANTITY) AS TOTAL
  231.     FROM EMPLOYEES E JOIN ORDERS O ON O.EMPLOYEE_ID = E.EMPLOYEE_ID
  232.                      JOIN ORDER_ITEMS OI  ON OI.ORDER_ID = O.ORDER_ID
  233.     WHERE O.ORDER_ID =  @ORDER
  234.     GROUP BY FNAME, LNAME, O.ORDER_ID
  235.  
  236.     EXEC EMPLOYEE_TOTAL_ORDER_PROC @ORDER  = 2356
  237.    
  238.     -------------------------------------------------------------------------------------
  239.     ---------------------------------- ФУНКЦИИ ------------------------------------------
  240.     -----1.--Скаларни -------------------------------------------------------------------
  241.     --Пример 7-4.
  242.     --Да се създаде функция, връщаща като скаларна стойност текст, съдържащ името на
  243.     --отдел (подаден като параметър) и обща стойност на заплатите в него.
  244.     CREATE FUNCTION DEPT_NAME_SUM_SALARIES_FUNC (@DEPT_ID INT ) RETURNS VARCHAR(200)
  245.     AS
  246.     BEGIN
  247.     DECLARE @NAME VARCHAR(50) , @SUM_SALARY  NUMERIC(10,2)
  248.  
  249.     SELECT @NAME = D.NAME , @SUM_SALARY = SUM(E.SALARY)
  250.     FROM EMPLOYEES E  JOIN DEPARTMENTS D
  251.     ON E.DEPARTMENT_ID = D.DEPARTMENT_ID
  252.     WHERE D.DEPARTMENT_ID = @DEPT_ID
  253.     GROUP BY D.NAME, D.DEPARTMENT_ID
  254.  
  255.     RETURN 'СУМАТА ОТ ЗАПЛАТИТЕ В '
  256.             + @NAME + ' С ID= ' + CAST(@DEPT_ID AS varchar) + 'Е '
  257.              + CAST(@SUM_SALARY  AS varchar) +'. '
  258.     END
  259.  
  260.     SELECT DBO.DEPT_NAME_SUM_SALARIES_FUNC(DEPARTMENT_ID) FROM DEPARTMENTS
  261.  
  262.    
  263.     -----2. Функции, връщащи резултатен набор ------------------------------------------
  264.  
  265.     --Пример 7-5.
  266.     --Да се създаде функция, връщаща като резултат служителите с техните длъжности.
  267.     CREATE FUNCTION EMP_JOBS_FUNCTION () RETURNS TABLE
  268.     AS
  269.     RETURN
  270.         SELECT FNAME, LNAME, JOB_TITLE
  271.         FROM EMPLOYEES E JOIN JOBS J
  272.         ON E.JOB_ID = J.JOB_ID
  273.  
  274.     SELECT * FROM DBO.EMP_JOBS_FUNCTION()
  275.     ORDER BY JOB_TITLE
  276.  
  277.     -------------------------------------------------------------------------------------
  278.     ----------------------------- Тригери -----------------------------------------------
  279.     -------------------------------------------------------------------------------------
  280.     /*Задача 9-1.
  281.     Да се създаде тригер, който при всяка промяна на фамилия на клиент
  282.     записва ред в нова таблица CUSTOMERS_HISTORY с атрибути:
  283.     • идентификатор на клиент;
  284.     • стара фамилия;
  285.     • нова фамилия.*/
  286.  
  287.     CREATE TABLE CUSTOMERS_HISTORY
  288.     (
  289.         CUSTOMER_ID INT,
  290.         OLD_LNAME VARCHAR(50),
  291.         NEW_LNAME VARCHAR(50)
  292.     )
  293.  
  294.     CREATE TRIGGER CUST_HISTORY_TRIGGER
  295.     ON CUSTOMERS  FOR UPDATE
  296.     AS
  297.      IF UPDATE(LNAME)
  298.      BEGIN
  299.         INSERT INTO CUSTOMERS_HISTORY(CUSTOMER_ID, OLD_LNAME, NEW_LNAME)
  300.         SELECT I.CUSTOMER_ID, D.LNAME, I.LNAME
  301.         FROM inserted  I, deleted D
  302.         WHERE I.CUSTOMER_ID = D.CUSTOMER_ID
  303.      END
  304.  
  305. UPDATE CUSTOMERS
  306. SET LNAME = 'ИВАНОВ'
  307. WHERE CUSTOMER_ID = 101
  308.  
  309.  
  310. SELECT * FROM CUSTOMERS_HISTORY
  311.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement