УДАЛЕНИЕ ТРИГГЕРА с двумя условиями - PullRequest
0 голосов
/ 23 декабря 2018

Вот соответствующие таблицы для этого вопроса:

Employee (EID, FirstName, LastName) - father
ConstructorEmployee (EID, CompanyName, SalaryPerDay) - son
Project (PID)
ProjectsConstructorEmployees (EID, PID, ...)

Я хотел бы создать триггер, который всякий раз, когда кто-то удаляет проект, удаляет всех сотрудников-конструкторов из таблицы сотрудников (и с каскадом,соответствующий сотрудник конструктора), который работает только в удаленном проекте.

Это означает, что если сотрудник 1 работает в проектах 1 и 2, сотрудник 2 работает только в проекте 2 после удаленияПроект 2, сотрудник 2 будет удален, а 1 - нет.

Это то, что я пробовал до сих пор, но мне не хватает только одной части проекта.

------- 1 -------
CREATE TRIGGER DeleteProject
AFTER DELETE 
ON Project 
AS
    DELETE FROM Employee
    WHERE E.EID == (SELECT EID 
                    FROM ConstructorEmployee as CE
                    WHERE CE.PID == (SELECT PID FROM deleted)) 
GO

Спасибо ввперед.

Ответы [ 2 ]

0 голосов
/ 23 декабря 2018

НАДЕЖДА ЭТО ПОМОГАЕТ.

   CREATE TABLE Employee(EID INT,FirstName varchar(500),LastName varchar(50))

GO

   CREATE TABLE ConstructorEmployee(EID INT,CompanyName varchar(500),SalaryPerDay bigint)

GO

   CREATE TABLE Project(PID INT)

GO

  CREATE TABLE ProjectsConstructorEmployees(EID int ,PID INT)

GO

   INSERT INTO Employee
   SELECT 1,'MANI','KANDAN'
   UNION
   SELECT 2,'RAM','CHARAN'
   UNION
   SELECT 3,'RAGU','NATH'

GO INSERT INTO ConstructorEmployee SELECT 1, 'HST', 20 UNION SELECT 2, 'RRR', 50 UNION SELECT 3, 'FRT', 90

GO

  INSERT INTO PROJECT 
  SELECT 9
  UNION
  SELECT 10  
  UNION
  SELECT 13

GO INSERT INTO ProjectsConstructorEmployees SELECT 1,9 UNION SELECT 1,10 UNION SELECT 2,13 UNION SELECT 3,9 UNION SELECT 3,10

GO

 SELECT * FROM Employee
 SELECT * FROM ConstructorEmployee
 SELECT * FROM Project
 SELECT * FROM ProjectsConstructorEmployees

GO

 CREATE TRIGGER PROJ_DEL
 ON Project
 FOR  DELETE
 AS
 DECLARE @A TABLE (A INT)
 INSERT INTO @A 
 SELECT * FROM DELETED
 DELETE S FROM ConstructorEmployee S WHERE EID IN(
 SELECT D.EID FROM ProjectsConstructorEmployees D JOIN (
 SELECT A.* FROM ProjectsConstructorEmployees A INNER JOIN @A  B ON
 ( A.PID=B.A) INNER JOIN ConstructorEmployee C ON (A.EID = C.EID))F ON 
 (D.EID=F.EID)
 GROUP BY D.EID 
 HAVING COUNT(D.EID)=1)  

GO

  DELETE FROM PROJECT WHERE PID=10---EID 10 MAPPED TO MORE THAN ONE PROJ SO 
  IT WILL NOT ALLOW FOR DELETE

  DELETE FROM PROJECT WHERE PID=13---EID 13 MAPPED TO  ONLY ONE PROJ SO IT 
  WILL  ALLOW FOR DELETE
0 голосов
/ 23 декабря 2018

Вам необходимо заключить удаление в блок BEGIN / END.

В своем триггере вы можете использовать оператор сравнения IN, чтобы включить запрос, возвращающий список сотрудников.идентификаторы для удаления.

Чтобы создать список идентификаторов, вы хотите найти всех сотрудников, которые работали над этим проектом, в таблице ProjectsConstructorEmployees, а затем отфильтровать всех тех, кто в данный момент записан в другом проекте, используякоррелированный запрос и предложение NOT EXIST.

CREATE TRIGGER DeleteProject
AFTER DELETE ON Project AS
BEGIN
    DELETE
    FROM Employee
    WHERE E.EID IN (
        SELECT PCE.EID 
        FROM 
            DELETED DEL
            INNER JOIN ProjectsConstructorEmployees PCE ON PCE.PID = DEL.PID
        WHERE NOT EXISTS (
            SELECT 1 
            FROM ProjectsConstructorEmployees
            WHERE EID  = PCE.EID
            AND   PID != DEL.PID
        )
    )
END 

Примечание: чтобы логика имела смысл, необходимо добавить еще один шаг после этого, чтобы безоговорочно удалять все связанные с проектами записи из таблицы ProjectsConstructorEmployees.Еще один сотрудник, который когда-либо работал над двумя разными проектами, никогда не уйдет.

DELETE FROM ProjectsConstructorEmployees WHERE PID = (SELECT PID FROM DELETED)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...