SQL Trigger выдает ошибку, но все еще вставляет - PullRequest
0 голосов
/ 24 апреля 2019

Я работаю над триггером, который должен блокировать вставку, когда @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.

Цель, которую я пытаюсь достичь, - вставить вкладку в таблицу Verkoper.если «gebruikersnaam» имеет значение «verkoper», равное единице.Это означает, что если в Gebruiker есть строка с «gebruikersnaam» Ларса и веркопер имеет значение 1. Это будет допустимая вставка в таблицу веркоперов.

Поскольку веркопер имеет следующие столбцы:'gebruikersnaam', 'banknaam', 'rekeningnummer', 'controleoptienaam' и 'creditcardnummer'.Когда 'gebruikersnaam' соответствует 'gebruikersnaam' из таблицы Gebruikers AND имеет значение 1 в столбце 'verkoper', эта запись будет разрешена для вставки в таблицу Verkoper.

На данный момент в столбце Gebruikers есть строка, включающая в себя gebruikersnaam 'Lars' и значение verkoper '1'.Значение любой SQL-вставки с gebruikersnaam 'Lars' должно быть разрешено в таблицу 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 голосов
/ 24 апреля 2019

Это не проверено, однако я подозреваю это логика, которая вам действительно нужна:

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...