/*Czym jest wyzwalacz (Trigger)?

Wyzwalacz to specjalny rodzaj procedury składowanej, która wykonuje się automatycznie w odpowiedzi na konkretne zdarzenie na tabeli lub widoku. W odróżnieniu od zwykłych procedur, nie wywołujesz go ręcznie – robi to za Ciebie silnik bazy danych.
Kluczowe cechy:
*Automatyzm: Reaguje na operacje INSERT, UPDATE lub DELETE.
*Integralność: Służy do wymuszania złożonych reguł biznesowych, których nie da się zapisać za pomocą zwykłych więzów spójności (np. CHECK).
*Wspólna transakcja: Wyzwalacz działa w ramach tej samej transakcji co operacja, która go wywołała. Jeśli wyzwalacz zgłosi błąd, cała operacja (np. UPDATE) zostanie wycofana.

Tabele wirtualne: INSERTED i DELETED

To najważniejszy element wyzwalaczy. Są to tymczasowe tabele widoczne tylko wewnątrz triggera:

    1)INSERTED: Zawiera nowe wiersze (przy INSERT i UPDATE).
	2)DELETED: Zawiera stare wiersze (przy DELETE i UPDATE).
Rodzaje wyzwalaczy (DML):

1) AFTER (lub FOR): Wykonuje się po pomyślnym zakończeniu operacji (np. po tym, jak dane faktycznie zostały zmienione). Najczęściej używany do logowania zmian (historia).

2) INSTEAD OF: Wykonuje się zamiast operacji głównej. Pozwala na całkowitą zmianę logiki (np. zamiast usuwać rekord, tylko zmieniamy mu status na "nieaktywny").*/

--Ćwiczenie:
--1. Przygotowanie tabel i danych


-- Tworzenie tabeli produktów
CREATE TABLE Produkt (
    id_produkt INT PRIMARY KEY,
    nazwa VARCHAR(100),
    cena DECIMAL(10, 2)
);

-- Tworzenie tabeli historii
CREATE TABLE historia_zmian_cen (
    id INT IDENTITY(1,1) PRIMARY KEY,
    id_produktu INT,
    stara_cena DECIMAL(10, 2),
    nowa_cena DECIMAL(10, 2),
    data_zmiany DATETIME DEFAULT GETDATE()
);

-- Wstawienie 2 rekordów
INSERT INTO Produkt (id_produkt, nazwa, cena)
VALUES (1, 'Laptop', 3500.00),
       (2, 'Myszka', 150.00);

--2. Tworzenie wyzwalacza (Trigger)
/*Wyzwalacz korzysta ze specjalnych tabel wirtualnych:

    deleted: przechowuje stare wartości (sprzed zmiany).

    inserted: przechowuje nowe wartości (po zmianie).
*/


CREATE TRIGGER trg_Produkt_UpdateCena
ON Produkt
AFTER UPDATE
AS
BEGIN
    -- Sprawdzamy, czy kolumna 'cena' została zaktualizowana
    IF UPDATE(cena)
    BEGIN
        INSERT INTO historia_zmian_cen (id_produktu, stara_cena, nowa_cena)
        SELECT 
            d.id_produkt, 
            d.cena, 
            i.cena
        FROM deleted d
        JOIN inserted i ON d.id_produkt = i.id_produkt
        WHERE d.cena <> i.cena; -- Rejestruj tylko, jeśli cena faktycznie się zmieniła
    END
END;

--3. Testowanie rozwiązania


-- Zmiana ceny laptopa
UPDATE Produkt 
SET cena = 3200.00 
WHERE id_produkt = 1;

-- Sprawdzenie efektów
SELECT * FROM Produkt;
SELECT * FROM historia_zmian_cen;
