SQL оператор if не работает при проверке существующей строки в триггере - PullRequest
1 голос
/ 26 апреля 2019

Я создаю триггер, который проверяет, имеет ли другой столбец такое же значение. Это, однако, возвращает печать, даже если нет другой строки с таким же значением. Я считаю, что ошибка в предложении IF, но я не могу понять это. Для базы данных используется следующий SQL.

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),
)

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 Voorwerp
(
    voorwerpnummer NUMERIC(10) NOT NULL,
    titel VARCHAR(255) NOT NULL,
    beschrijving VARCHAR(255) NOT NULL,
    startprijs NUMERIC(5,2) NOT NULL,
    betalingswijze VARCHAR(255) NOT NULL,
    betalingsinstructie VARCHAR(255) NOT NULL,
    plaatsnaam VARCHAR(255) NOT NULL,
    land VARCHAR(255) NOT NULL,
    looptijd INTEGER NOT NULL,
    looptijdbegindag CHAR(10) NOT NULL,
    looptijdbegintijdstip CHAR(8) NOT NULL,
    verzendkosten NUMERIC(5,2),
    verzendinstructie VARCHAR(255) NOT NULL,
    verkoper VARCHAR(25) NOT NULL,
    koper VARCHAR(25) NULL,
    looptijdeindedag CHAR(10) NOT NULL,
    looptijdeindetijdstip CHAR(8) NOT NULL,
    veilingGesloten BIT NOT NULL,
    verkoopprijs NUMERIC(5,2) NOT NULL,

    CONSTRAINT pk_voorwerp 
        PRIMARY KEY (voorwerpnummer),
    CONSTRAINT fk_voorwerp_verkoper 
        FOREIGN KEY (verkoper) REFERENCES verkoper(gebruikersnaam),
    CONSTRAINT fk_voorwerp_gebruiker 
        FOREIGN KEY (koper) REFERENCES gebruiker(gebruikersnaam)
)

CREATE TABLE Bod 
(
    voorwerpnummer NUMERIC(10) NOT NULL,
    euro NUMERIC(5,2) NOT NULL,
    gebruikersnaam CHAR(10) NOT NULL,
    datum CHAR(10) NOT NULL,
    tijdaanduiding CHAR(8) NOT NULL,

    CONSTRAINT pk_Bod 
        PRIMARY KEY (voorwerpnummer, euro),
    CONSTRAINT ak_Bod_Gebruiker_BodDag_Tijdstip 
        UNIQUE (gebruikersnaam, datum, tijdaanduiding),
    CONSTRAINT ak_Bod_Voorwerp_BodDag_Tijdstip 
        UNIQUE (voorwerpnummer, datum, tijdaanduiding),
    CONSTRAINT fk_Bod_Voorwerp 
        FOREIGN KEY (voorwerpnummer) REFERENCES Voorwerp(voorwerpnummer)
)

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', 'NL42INGB0685', 'Creditcard', 654654665);

INSERT INTO Voorwerp (voorwerpnummer, titel, beschrijving, startprijs, betalingswijze, betalingsinstructie, plaatsnaam, land, looptijd, looptijdbegindag, looptijdbegintijdstip, verzendkosten, verzendinstructie, verkoper, looptijdeindedag, looptijdeindetijdstip, veilinggesloten)
VALUES (3434343434, 'test', 'test', 10.00, 'bank/giro', 'betaald voor levering', 'Arnhem', 'Nederland', 7, '20/04/2019', '13:30:15', 5.00, 'pakket post', 'Lars', '27/04/2019', '12:30:15', 0);

Триггер, о котором идет речь:

CREATE TRIGGER hoger_bod 
ON Bod
FOR INSERT, UPDATE
AS
BEGIN
    IF EXISTS (SELECT 1
               FROM inserted AS i
               WHERE i.voorwerpnummer IN (SELECT voorwerpnummer FROM Bod))
    BEGIN
        PRINT 'This voorwerpnummer already has a row.';
    END;
END;

Этот триггер должен возвращать 'Этот voorwerpnummer уже имеет строку.' когда в столбце Bod есть строка с таким же значением voorwerpnummer.

Чтобы проверить это, я использовал следующую инструкцию INSERT:

INSERT INTO Bod VALUES (3434343434, 5.01, 'Lars', '12/12/2011', '11:11:16')

Возвращает «Этот voorwerpnummer уже имеет строку.», Хотя строк нет.

Для второй вставки:

INSERT INTO Bod VALUES (3434343434, 10.00, 'Lars', '12/12/2011', '11:16:16')

Если вы хотите проверить это; вот dbfiddle: https://dbfiddle.uk/?fiddle=1777fa6548beef3ac5e701b7bc2c489c

1 Ответ

1 голос
/ 26 апреля 2019

Согласно @GuidoG, попробуйте:

CREATE TRIGGER hoger_bod ON Bod
FOR INSERT,UPDATE
AS
BEGIN
    IF  (SELECT COUNT(*)
               FROM inserted AS i
               WHERE i.voorwerpnummer IN (SELECT voorwerpnummer FROM Bod)) >1
    BEGIN
        PRINT 'This voorwerpnummer already has a row.';
    END;
END;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...