如何防止根据列的值删除行

Mar*_*ria 1 sql sql-server sql-server-2012

假设我们有一个叫做表StudentAccount的列SID(学生证)和AmountOwing。我们不能从系统中删除帐户,除非学生的帐户上没有任何欠款。(即AmountOwing = $0.00)。

例如,该表可能如下所示:

SID    | Amount Owing
-------+--------------
32415  | $30.00
39872  | $0.00
35135  | $3200.00
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我们只能删除第 2 行。

有没有办法使用有效的 MS SQL Server 2012 SQL 语法对表强制执行此约束(以便未受过教育的用户不会意外删除非空帐户)?

Bog*_*ean 5

尝试这个:

CREATE TRIGGER trgD_StudentAccount_Delete
ON dbo.StudentAccount
INSTEAD OF DELETE
AS
BEGIN
    IF EXISTS (
        SELECT  *
        FROM    deleted d
        WHERE   d.AmountOwing <> 0
    )
    BEGIN
        ROLLBACK;
        RAISERROR('Delete error: there are students with Amount <> 0', 16, 1);
    END
    ELSE
    BEGIN
        DELETE  StudentAccount 
        WHERE   EXISTS( SELECT * FROM deleted d WHERE d.[SID] = StudentAccount.[SID] )
    END
END
Run Code Online (Sandbox Code Playgroud)