PostgreSQL Wyzwalacze: utwórz, wylistuj i upuść z przykładem

⚡ Inteligentne podsumowanie

PostgreSQL Wyzwalacze to funkcje uruchamiane automatycznie po wystąpieniu zdarzenia INSERT, UPDATE lub DELETE w tabeli. Dzięki nim baza danych może egzekwować reguły, rejestrować zmiany i weryfikować dane bez konieczności pisania dodatkowego kodu aplikacji.

  • Definicja: Wyzwalacz to funkcja wywoływana automatycznie w przypadku zdarzenia w bazie danych, takiego jak INSERT, UPDATE lub DELETE.
  • 🔁 Zakres: Instrukcja FOR EACH ROW uruchamia wyzwalacz raz dla każdego wiersza, którego to dotyczy, natomiast instrukcja FOR EACH STATEMENT uruchamia go raz dla każdej operacji.
  • 🛠️. Stwórz: CREATE TRIGGER wiąże funkcję z tabelą i ustawia parametry czasu BEFORE, AFTER lub INSTEAD OF.
  • 📋 Lista: Wykonaj zapytanie do katalogu pg_trigger za pomocą polecenia SELECT tgname, aby wyświetlić każdy wyzwalacz w bazie danych.
  • 🗑️ Upuszczać: DROP TRIGGER usuwa wyzwalacz, a IF EXISTS zapobiega wystąpieniu błędu w przypadku jego braku.
  • 🤖 Pomoc AI: Asystenci AI generują funkcje wyzwalające i sugerują czas PRZED lub PO na podstawie prośby wyrażonej prostym językiem.

PostgreSQL Wyzwalacze

W czym jest Trigger PostgreSQL?

A PostgreSQL Cyngiel to funkcja, która jest uruchamiana automatycznie, gdy wystąpi zdarzenie bazy danych w obiekcie bazy danych, na przykład w tabeli. Przykładami zdarzeń bazy danych, które mogą aktywować wyzwalacz, są INSERT, UPDATE, DELETE itp. Ponadto, po utworzeniu wyzwalacza dla tabeli, wyzwalacz zostanie automatycznie usunięty po jej usunięciu.

Jak używany jest Trigger PostgreSQL?

Wyzwalacz można oznaczyć operatorem FOR EACH ROW podczas jego tworzenia. Taki wyzwalacz będzie wywoływany jednokrotnie dla każdego wiersza modyfikowanego przez operację. Wyzwalacz można również oznaczyć operatorem FOR EACH STATEMENT podczas jego tworzenia. Ten wyzwalacz zostanie wykonany tylko raz dla określonej operacji.

PostgreSQL Utwórz wyzwalacz

Aby utworzyć wyzwalacz, używamy funkcji CREATE TRIGGER. Oto składnia funkcji:

CREATE TRIGGER trigger-name [BEFORE|AFTER|INSTEAD OF] event-name
ON table-name
[
 -- Trigger logic
];

Nazwa wyzwalacza to nazwa wyzwalacza.

PRZED, PO i INSTEAD OF to słowa kluczowe określające, kiedy zostanie wywołany wyzwalacz.

Nazwa-zdarzenia to nazwa zdarzenia, które spowoduje wywołanie wyzwalacza. To może być INSERT, AKTUALIZUJ, USUŃ itp.

Nazwa-tabeli to nazwa tabeli, na której ma zostać utworzony wyzwalacz.

Jeśli wyzwalacz ma zostać utworzony dla operacji INSERT, musimy dodać parametr ON column-name.

Poniższa składnia to demonstruje:

CREATE TRIGGER trigger-name AFTER INSERT ON column-name
ON table-name
[
 -- Trigger logic
];

PostgreSQL Utwórz przykład wyzwalacza

Będziemy korzystać z tabeli cen podanej poniżej:

Cena:

PostgreSQL Utwórz wyzwalacz

Stwórzmy kolejną tabelę Price_Audits, w której będziemy rejestrować zmiany wprowadzone w tabeli Cena:

CREATE TABLE Price_Audits (
   book_id INT NOT NULL,
    entry_date text NOT NULL
);

Możemy teraz zdefiniować nową funkcję o nazwie audytfunc:

CREATE OR REPLACE FUNCTION auditfunc() RETURNS TRIGGER AS $my_table$
   BEGIN
      INSERT INTO Price_Audits(book_id, entry_date) VALUES (new.ID, current_timestamp);
      RETURN NEW;
   END;
$my_table$ LANGUAGE plpgsql;

Powyższa funkcja wstawi rekord do tabeli Price_Audits zawierający identyfikator nowego wiersza i godzinę utworzenia rekordu.

Skoro mamy już funkcję wyzwalacza, powinniśmy powiązać ją z tabelą cen. Nazwiemy wyzwalacz price_trigger. Przed utworzeniem nowego rekordu funkcja wyzwalacza zostanie wywołana automatycznie, aby zarejestrować zmiany. Oto wyzwalacz:

CREATE TRIGGER price_trigger AFTER INSERT ON Price
FOR EACH ROW EXECUTE PROCEDURE auditfunc();

Wstawmy nowy rekord do tabeli Cen:

INSERT INTO Price
VALUES (3, 400);

Skoro wstawiliśmy rekord do tabeli „Cena”, rekord powinien również zostać wstawiony do tabeli „Price_Audits” ze względu na utworzony przez nas wyzwalacz. Sprawdźmy to:

SELECT * FROM Price_Audits;

Spowoduje to zwrócenie następujących informacji:

PostgreSQL Utwórz wyzwalacz

Wyzwalacz zadziałał pomyślnie.

PostgreSQL Lista wyzwalaczy

Wszystkie wyzwalacze, które tworzysz w PostgreSQL są przechowywane w tabeli pg_trigger. Aby zobaczyć listę wyzwalaczy, które masz na baza danych, wykonaj zapytanie do tabeli, uruchamiając polecenie SELECT, jak pokazano poniżej:

SELECT tgname FROM pg_trigger;

To zwraca następujące informacje:

PostgreSQL Lista wyzwalaczy

Kolumna tgname tabeli pg_trigger oznacza nazwę wyzwalacza.

PostgreSQL Upuść spust

Gdy wyzwalacz nie jest już potrzebny, można go równie łatwo usunąć. Aby usunąć PostgreSQL wyzwalacza używamy instrukcji DROP TRIGGER o następującej składni:

DROP TRIGGER [IF EXISTS] trigger-name
ON table-name [ CASCADE | RESTRICT ];

Parametr nazwa-wyzwalacza określa nazwę wyzwalacza, który ma zostać usunięty.

Nazwa-tabeli oznacza nazwę tabeli, z której ma zostać usunięty wyzwalacz.

Klauzula IF EXISTS próbuje usunąć istniejący wyzwalacz. Jeśli spróbujesz usunąć nieistniejący wyzwalacz bez użycia klauzuli IF EXISTS, pojawi się błąd.

Opcja CASCADE pomoże Ci automatycznie upuścić wszystkie obiekty zależne od wyzwalacza.

Jeśli użyjesz opcji OGRANICZ, wyzwalacz nie zostanie usunięty, jeśli obiekty są od niego zależne.

Na przykład:

Aby usunąć wyzwalacz o nazwie example_trigger z tabeli Company, uruchom następujące polecenie:

DROP TRIGGER example_trigger IF EXISTS
ON Company;

Korzystanie z pgAdmina

Zobaczmy teraz, jak wykonać wszystkie trzy czynności za pomocą pgAdmin.

Jak utworzyć wyzwalacz w PostgreSQL za pomocą pgAdmina

Oto jak możesz utworzyć wyzwalacz w PostgreSQL używając pgAdmina:

Krok 1) Zaloguj się na swoje konto pgAdmin

Otwórz pgAdmin i zaloguj się na swoje konto, używając swoich danych logowania.

Krok 2) Utwórz bazę danych demonstracyjnych

  1. Na pasku nawigacyjnym po lewej stronie kliknij opcję Bazy danych.
  2. Kliknij opcję Demo.

Utwórz wyzwalacz w PostgreSQL za pomocą pgAdmina

Krok 3) Wpisz zapytanie

Aby utworzyć tabelę Price_Audits, wpisz zapytanie w edytorze:

CREATE TABLE Price_Audits (
   book_id INT NOT NULL,
    entry_date text NOT NULL
)

Krok 4) Wykonaj zapytanie

Kliknij przycisk Wykonaj.

Utwórz wyzwalacz w PostgreSQL za pomocą pgAdmina

Krok 5) Uruchom Code dla funkcji audytu

Uruchom poniższy kod, aby zdefiniować funkcję auditfunc:

CREATE OR REPLACE FUNCTION auditfunc() RETURNS TRIGGER AS $my_table$
   BEGIN
      INSERT INTO Price_Audits(book_id, entry_date) VALUES (new.ID, current_timestamp);
      RETURN NEW;
   END;
$my_table$ LANGUAGE plpgsql

Krok 6) Uruchom Code utworzyć wyzwalacz

Uruchom poniższy kod, aby utworzyć wyzwalacz price_trigger:

CREATE TRIGGER price_trigger AFTER INSERT ON Price
FOR EACH ROW EXECUTE PROCEDURE auditfunc()

Krok 7) Wstaw nowy rekord

  1. Uruchom następujące polecenie, aby wstawić nowy rekord do tabeli cen:
INSERT INTO Price
VALUES (3, 400)
  1. Uruchom następujące polecenie, aby sprawdzić, czy rekord został wstawiony do tabeli Price_Audits:
SELECT * FROM Price_Audits

To powinno zwrócić następujące informacje:

Utwórz wyzwalacz w PostgreSQL za pomocą pgAdmina

Krok 8) Sprawdź zawartość tabeli

Sprawdźmy zawartość tabeli Price_Audits.

Wyświetlanie wyzwalaczy za pomocą pgAdmin

Krok 1) Uruchom następujące polecenie, aby sprawdzić wyzwalacze w swojej bazie danych:

SELECT tgname FROM pg_trigger

To zwraca następujące informacje:

Wyświetlanie wyzwalaczy za pomocą pgAdmin

Spadekping Wyzwalacze używające pgAdmin

Aby usunąć wyzwalacz o nazwie example_trigger z tabeli Company, uruchom następujące polecenie:

DROP TRIGGER example_trigger IF EXISTS
ON Company

Pobierz bazę danych używaną w tym samouczku

FAQ

Wyzwalacz BEFORE działa przed zapisaniem zmiany w wierszu, dzięki czemu może zmodyfikować lub odrzucić wiersz. Wyzwalacz AFTER działa po zapisaniu zmiany, co jest przydatne w przypadku zadań rejestrowania i audytu.

Wyzwalacz INSTEAD OF jest definiowany w widoku, a nie w tabeli. Zastępuje on polecenia INSERT, UPDATE lub DELETE niestandardową logiką, dzięki czemu widok tylko do odczytu staje się możliwy do zapisu.

Funkcje wyzwalające są zwykle pisane w PL/pgSQL. PostgreSQL obsługuje również PL/Python, PL/Perl, PL/Tcl i C, dzięki czemu możesz wybrać język, który pasuje do Twojej logiki.

Użyj polecenia ALTER TABLE nazwa_tabeli DISABLE TRIGGER nazwa_wyzwalacza, aby go wyłączyć, i polecenia ENABLE TRIGGER, aby go ponownie włączyć. W ten sposób unikniesz porzuceniaping i ponowne utworzenie wyzwalacza podczas ładowania masowego.

Tak. Każdy wyzwalacz dodaje pracę do każdego wiersza lub instrukcji, której dotyczy, więc rozbudowana logika wyzwalacza może spowolnić zapis. Funkcje wyzwalacza powinny być krótkie i indeksować wszystkie kolumny, do których są odpytywane.

Tak. Jeśli wyzwalacz zmienia inną tabelę, która również ma wyzwalacze, one również zostają uruchomione, tworząc kaskadowe wyzwalacze. PostgreSQL ogranicza głębokość zagnieżdżenia, aby zapobiec powstawaniu pętli nieskończonych.

Asystenci kodowania AI zamieniają żądanie w prostym języku na kompletne polecenie CREATE TRIGGER i funkcję wyzwalacza, sugerują czas PRZED lub PO i wyjaśniają wygenerowany kod PL/pgSQL w celu szybkiego przeglądu.

Tak. Narzędzia takie jak pgai i asystenci bazujący na GPT tłumaczą opisaną regułę na wyzwalacz SQL i mogą tworzyć wyzwalacze INSERT, które automatycznie tagują lub weryfikują nowe dane w momencie ich nadesłania.

Podsumuj ten post następująco: