SQL触发器引发错误,但仍会插入

时间:2019-04-24 08:54:10

标签: sql sql-server

我正在处理一个应该在@verkoperstatus为0时阻止插入的触发器;这确实起作用,但是由于某种原因,当@verkoperstatus为1时,它也会停止插入。

CREATE TRIGGER [dbo].[verkoper_check] ON [dbo].[Verkoper]
FOR INSERT,UPDATE
AS
BEGIN
DECLARE @verkoperstatus bit 
DECLARE @gebruikersnaam varchar(25)
SELECT @gebruikersnaam = gebruikersnaam FROM inserted 
SELECT @verkoperstatus = verkoper FROM Gebruiker WHERE gebruikersnaam = @gebruikersnaam
    IF @verkoperstatus = 0
        BEGIN
            RAISERROR('Geen verkoper!',18,1);
            ROLLBACK;
        END
    ELSE
        BEGIN
            COMMIT;
        END
END

它应该在@verkoperstatus为1时插入,而在@verkopstatus为0时引发错误。

表Gebruiker是参考,其中包括'gebruikersnaam'和'verkoper'列。 “ gebruikersnaam”列的值是标识列(在此特定情况下为“ Lars”)。 Verkoper是一列,指示是否是卖方,因此其值为0或1。

我要实现的目标是,如果'gebruikersnaam'的'verkoper'值为1,则在Verkoper表格上插入一个。 这意味着如果Gebruiker中有一行显示Lars的'gebruikersnaam',并且verkoper的值为1。这将允许插入Verkoper表格。

由于Verkoper具有以下列:'gebruikersnaam','banknaam','rekeningnummer','controleoptienaam'和'creditcardnummer'。当'gebruikersnaam'对应于Gebruikers表中的'gebruikersnaam',并且'verkoper'列中的值为1时,该记录将被插入到Verkoper表中。

截至目前,Gebruikers栏中有一行,其中包括gebruikersnaam“ Lars”和verkoper值“ 1”。意思是应该将任何带有“ Lars” 的gebruikersnaam的SQL插入到Verkoper表中。

但是,这并不符合我认为的方式。

这些是上面提到的表格:

CREATE TABLE Verkoper (
    gebruikersnaam varchar(25) NOT NULL,
    banknaam varchar(255) NULL,
    rekeningnummer varchar(32) NULL,
    controleoptienaam char(10) NOT NULL,
    creditcardnummer integer NULL,
    CONSTRAINT pk_Verkoper PRIMARY KEY (gebruikersnaam),
    CONSTRAINT fk_Verkoper_Gebruikersnaam FOREIGN KEY (gebruikersnaam) REFERENCES Gebruiker(gebruikersnaam),
    CONSTRAINT ck_rekening CHECK (rekeningnummer is NOT NULL OR creditcardnummer is NOT NULL),
    CONSTRAINT ck_controleoptie CHECK (controleoptienaam IN('Post', 'Creditcard'))
)

CREATE TABLE  Gebruiker(
    gebruikersnaam varchar(25) NOT NULL,
    voornaam varchar(25) NOT NULL,
    achternaam varchar(25) NOT NULL,
    adresregel_1 varchar(255) NULL,
    adresregel_2 varchar(255) NULL,
    postcode char(7) NULL,
    plaatsnaam varchar(255) NULL,
    land varchar(255) NULL,
    geboortedag char(10) NOT NULL,
    mailbox varchar(255) NOT NULL,
    wachtwoord varchar(255) NOT NULL,
    verkoper bit NOT NULL,

CONSTRAINT pk_gebruiker PRIMARY KEY (gebruikersnaam),
)

对于插入,我正在使用以下数据:

INSERT INTO Gebruiker VALUES ('Lars', 'Lars', 'Last_name', null, null, null, null, null, '04/04/2019', 'lars@mymailbox.cloud', 'MyPassword', 1)

INSERT INTO Verkoper VALUES ('Lars', 'ING', 'NL32ABN32492809', 'Post', null)

1 个答案:

答案 0 :(得分:0)

这未经测试,但是,我怀疑这是您真正需要的逻辑:

CREATE TRIGGER [dbo].[verkoper_check] ON [dbo].[Verkoper]
FOR INSERT,UPDATE
AS BEGIN

    IF EXISTS(SELECT 1
              FROM inserted i
                   JOIN Gebruiker G ON i.gebruikersnaam = G.gebruikersnaam
              WHERE G.verkoper = 0) BEGIN

        RAISERROR('Geen verkoper!',18,1);
        ROLLBACK;
    END;
END;