触发以避免删除该值的最后一行SQL Server

时间:2019-02-02 22:39:19

标签: sql sql-server tsql sql-server-2012 triggers

所以,我需要一点帮助,我需要创建一个触发器,避免了值

最后一排的缺失

假设我有:

SubjectID | ModuleNr  
1792      |   1  
1792      |   2  
1222      |   3

我希望能够避免各SubjectID的最后一行被删除,所以在这种情况下将仅被删除的第一行。

我尝试了不同的方法(使用SQL Server 2012),但是我不能在FOR DELETE之后使用For Each,也不能在Delete之前进行。

我尝试过的每种方法都让我无论如何都删除了该行。

请记住,这是我在SQL的第一学期,这是我的新手。

这是我尝试使用count以某种方式查看是否只有1个值:

CREATE TRIGGER curriculum.Keep_Last_Module
ON curriculum.Module
FOR DELETE
AS
BEGIN

DECLARE @count AS INT
SET @count = (SELECT COUNT(*) FROM curriculum.Module 
             WHERE SubjectID = (SELECT SubjectID FROM deleted) GROUP BY SubjectID)

    IF (@count = 1)
    BEGIN
    RAISERROR('Last Module Cannot be Erased',16, 1)
    END
END

提前谢谢

4 个答案:

答案 0 :(得分:2)

我用下面的触发和它完全在一行中缺失的情况下,并在多个行的情况下删除它会阻止在一个subjectID的情况下,整个删除操作将违反这个条件:

CREATE TRIGGER curriculum.Keep_Last_Module
ON curriculum.Module
FOR DELETE
AS
BEGIN

    If exists(SELECT SubjectID FROM deleted except SELECT SubjectID FROM curriculum.module)
      BEGIN
      RAISERROR('Last Module Cannot be Erased',16, 1)
      ROLLBACK
      END
    END
END

答案 1 :(得分:2)

在您删除主题的所有行的情况下,您似乎希望它自动保留一个。

为此,您需要一个$("#card_days").append(/* Your card HTML */); 触发器,例如下面的示例(DEMO

INSTEAD OF

答案 2 :(得分:0)

每个主题至少要保留一行。计算“之前”和“之后”的主题数:

CREATE TRIGGER curriculum.Keep_Last_Module
ON curriculum.Module
INSTEAD OF DELETE
AS
BEGIN
    DECLARE @beforeSubjects INT;
    DECLARE @afterSubjects INT;

    SELECT @beforeSubjects = COUNT(DISTINCT m.subject),
           @afterSubjects = COUNT(DISTINCT CASE WHEN d.ModuleNR IS NULL THEN m.subject END)
    FROM curriculum.Module m LEFT JOIN
         deleted d
         ON m.ModuleNr = d.ModuleNr

    IF (@beforeSubjects <> @afterSubjects)
    BEGIN
        RAISERROR('Last Module Cannot be Erased', 16, 1)
    END;

    DELETE m
        FROM curriculum.module m JOIN
             deleted d
             ON m.ModuleNr = d.ModuleNr;
END;

答案 3 :(得分:0)

您可以检查- name: Setup local kubeconfig become: true become_user: vagrant become_method: sudo shell: cmd: | chown $(id -u):$(id -g) /home/vagrant/.kube/config 中是否存在针对同一deleted的{​​{1}}中不存在记录的行,该行具有更大的module

subjectid

db<>fiddle