T-SQL - Trigger

0

Mam taką treść zadania:
Napisz wyzwalacz, który przy próbie usunięcia rezerwacji sprawdzi, czy rezerwacja została opłacona i czy nie dotyczy 2008 roku. Jeśli nie, to wyzwalacz nie powinien
dopuścić do usunięcia i zgłosić błąd. Czyli można usuwać wyłącznie rezerwacje z roku innego niż 2008, które zostały zapłacone.
Rozwiązanie ma blokować możliwość usunięcia, gdy CO NAJMNIEJ jeden usuwany rekord nie spełnia kryteriów.

Baza jest następująca:

CREATE TABLE Gosc (IdGosc INT PRIMARY KEY, Imie VARCHAR(20) NOT NULL, Nazwisko VARCHAR(30) NOT NULL, Procent_rabatu INT NULL)
GO

CREATE TABLE Kategoria (IdKategoria INT PRIMARY KEY, Nazwa VARCHAR(20) NOT NULL, Cena NUMERIC(8,2) NOT NULL)
GO

CREATE TABLE Pokoj (NrPokoju INT PRIMARY KEY, IdKategoria INT NOT NULL REFERENCES Kategoria, Liczba_miejsc INT NOT NULL)
GO

CREATE TABLE Rezerwacja (IdRezerwacja INT PRIMARY KEY, DataOd DATETIME NOT NULL, DataDo DATETIME NOT NULL, IdGosc INT NOT NULL REFERENCES Gosc, NrPokoju INT NOT NULL REFERENCES Pokoj, Zaplacona BIT NOT NULL)
GO

I mój kod:

CREATE TRIGGER CzyZaplacona ON Rezerwacja
FOR DELETE
AS
BEGIN
DECLARE @idRezerwacja int;
DECLARE @licznik int;
--
DECLARE @date1 DATETIME = CAST('1/1/2008' AS DATETIME);
DECLARE @date2 DATETIME = CAST('12/31/2008' AS DATETIME);
**
SET @idRezerwacja = (SELECT idRezerwacja FROM Deleted);
ROLLBACK;
**
SET @licznik = (SELECT COUNT( * )FROM Rezerwacja WHERE (DataOd BETWEEN @date1 AND @date2) AND (DataDo  BETWEEN @date1 AND @date2) AND Zaplacona = 0 AND IdRezerwacja = @IdRezerwacja);

IF @licznik = 1
BEGIN
PRINT'Nie można usunąc';
END;
IF @licznik = 0
BEGIN
DELETE FROM Rezerwacja WHERE IdRezerwacja = @IdRezerwacja;
END;
END;

Jak to zmodyfikować, by działało na wiele rekordów?

2

Tak:

CREATE TRIGGER TR_CHECK ON zamowienia
FOR DELETE
AS
BEGIN

    SET NOCOUNT ON;

    IF EXISTS (
        SELECT *
        FROM deleted
        WHERE zaplacona=0 or year(dataod)=2008 or year(datado)=2008
    )
    BEGIN
        ROLLBACK;
        THROW 50001, 'Operacja niemożliwa', 1;
    END
END;

Triggery ZAWSZE piszemy tak, aby obsługiwały operację na wielu rekordach

0

A w praktyce triggerów oprócz tych audytowych nie piszemy bo to proszenie się o kłopoty. W świeżych wersjach SQL Server to i tych audytowych nie piszemy, bo funkcjonalność odkładania historii/zmian jest wbudowana.

1 użytkowników online, w tym zalogowanych: 0, gości: 1