Advertisement
masha_mmk

Triggers for Artem

May 26th, 2023
850
0
Never
1
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. -- 1 employees
  2. CREATE OR REPLACE FUNCTION check_is_joined_before_born()
  3.     RETURNS TRIGGER AS
  4. $$
  5. BEGIN
  6.     IF NEW.joined_at < NEW.date_of_birth
  7.     THEN
  8.         RAISE EXCEPTION 'Employee must be born before joining the airport';
  9.     END IF;
  10.     RETURN NEW;
  11. END;
  12. $$ LANGUAGE plpgsql;
  13.  
  14. CREATE OR REPLACE TRIGGER verify_joined_date
  15.     BEFORE INSERT OR UPDATE
  16.     ON employees
  17.     FOR EACH ROW
  18. EXECUTE FUNCTION check_is_joined_before_born();
  19.  
  20. -- 2 employees
  21. CREATE OR REPLACE FUNCTION check_is_brigade_specialization_correct()
  22.     RETURNS TRIGGER AS
  23. $$
  24. BEGIN
  25.     IF NOT (SELECT specializations.name FROM specializations WHERE id = NEW.specialization_id) =
  26.            (SELECT s.name
  27.             FROM brigades
  28.                      INNER JOIN specializations s ON s.id = brigades.specialization_id
  29.             WHERE brigades.id = NEW.brigade_id)
  30.     THEN
  31.         RAISE EXCEPTION 'Brigade is not associated with the given specialization';
  32.     END IF;
  33.     RETURN NEW;
  34. END;
  35. $$ LANGUAGE plpgsql;
  36.  
  37. CREATE OR REPLACE TRIGGER verify_specialization
  38.     BEFORE INSERT OR UPDATE
  39.     ON employees
  40.     FOR EACH ROW
  41. EXECUTE FUNCTION check_is_brigade_specialization_correct();
  42.  
  43. -- 1 departments
  44.  
  45. CREATE OR REPLACE FUNCTION check_is_department_unique()
  46.     RETURNS TRIGGER AS
  47. $$
  48. BEGIN
  49.     IF EXISTS (SELECT 1 FROM departments WHERE departments.name = NEW.name)
  50.     THEN
  51.         RAISE EXCEPTION 'Department name must be unique';
  52.     END IF;
  53.     RETURN NEW;
  54. END;
  55. $$ LANGUAGE plpgsql;
  56.  
  57. CREATE OR REPLACE TRIGGER verify_department_name
  58.     BEFORE INSERT OR UPDATE
  59.     ON departments
  60.     FOR EACH ROW
  61. EXECUTE FUNCTION check_is_department_unique();
  62.  
  63. -- 2 departments
  64.  
  65. CREATE OR REPLACE FUNCTION check_is_chef_from_same_department()
  66.     RETURNS TRIGGER AS
  67. $$
  68. BEGIN
  69.     IF NOT (SELECT departments.name
  70.             FROM departments
  71.                      INNER JOIN departments_chiefs dc ON departments.id = dc.department_id
  72.             WHERE departments.name = NEW.name) = (SELECT d.name
  73.                                                   FROM employees
  74.                                                            INNER JOIN departments d ON d.id = employees.department_id
  75.                                                   WHERE employees.id = NEW.chef_id)
  76.     THEN
  77.         RAISE EXCEPTION 'Employee must belong to the given department';
  78.     END IF;
  79.     RETURN NEW;
  80. END;
  81. $$ LANGUAGE plpgsql;
  82.  
  83. CREATE OR REPLACE TRIGGER verify_department_chef
  84.     BEFORE INSERT OR UPDATE
  85.     ON departments
  86.     FOR EACH ROW
  87. EXECUTE FUNCTION check_is_chef_from_same_department();
  88.  
  89. -- 1 brigades
  90.  
  91. CREATE OR REPLACE FUNCTION check_is_brigade_unique()
  92.     RETURNS TRIGGER AS
  93. $$
  94. BEGIN
  95.     IF EXISTS (SELECT 1 FROM brigades WHERE brigades.name = NEW.name)
  96.     THEN
  97.         RAISE EXCEPTION 'Brigade name must be unique';
  98.     END IF;
  99.     RETURN NEW;
  100. END;
  101. $$ LANGUAGE plpgsql;
  102.  
  103. CREATE OR REPLACE TRIGGER verify_brigade_name
  104.     BEFORE INSERT OR UPDATE
  105.     ON brigades
  106.     FOR EACH ROW
  107. EXECUTE FUNCTION check_is_brigade_unique();
  108.  
  109. -- 2 brigades
  110.  
  111. CREATE OR REPLACE FUNCTION check_is_brigade_has_airplanes_assigned()
  112.     RETURNS TRIGGER AS
  113. $$
  114. BEGIN
  115.     IF EXISTS (SELECT 1 from airplanes inner join brigades b on OLD.id = airplanes.pilots_brigade_id)
  116.     THEN
  117.         RAISE EXCEPTION 'There should be no airplanes serviced by the brigade to delete it';
  118.     END IF;
  119.     RETURN NEW;
  120. END;
  121. $$ LANGUAGE plpgsql;
  122.  
  123. CREATE OR REPLACE TRIGGER verify_brigade_has_no_airplanes_assigned
  124.     BEFORE DELETE
  125.     ON brigades
  126.     FOR EACH ROW
  127. EXECUTE FUNCTION check_is_brigade_has_airplanes_assigned();
  128.  
  129. -- 1 pilotsmedicalexaminations
  130.  
  131. CREATE OR REPLACE FUNCTION check_is_exists_by_done_at()
  132.     RETURNS TRIGGER AS
  133. $$
  134. BEGIN
  135.     IF EXISTS (SELECT 1 from airplane_maintenance_operations WHERE airplane_maintenance_operations.done_at = NEW.done_at)
  136.     THEN
  137.         RAISE EXCEPTION 'Airplane maintenance operation for this date is already registered';
  138.     END IF;
  139.     RETURN NEW;
  140. END;
  141. $$ LANGUAGE plpgsql;
  142.  
  143. CREATE OR REPLACE TRIGGER verify_examination_by_done_at_date
  144.     BEFORE INSERT OR UPDATE
  145.     ON brigades
  146.     FOR EACH ROW
  147. EXECUTE FUNCTION check_is_exists_by_done_at();
  148.  
  149.  
  150. -- 2 pilotsmedicalexaminations
  151.  
  152. -- в классе больше нет исключений, если что утром доделаю, если скажешь, какой сделать
  153.  
Advertisement
Comments
Add Comment
Please, Sign In to add comment
Advertisement