Maybaygiare.org

Blog Network

PostgreSQL – TRIGGERS

Advertisements

PostgreSQL Triggers are database callback functions, which are automatically performed/invoked when a specified database event occurs.

poniżej znajdują się ważne punkty dotyczące wyzwalaczy PostgreSQL −

  • WYZWALACZ PostgreSQL można określić tak, aby działał

    • przed próbą wykonania operacji w wierszu (przed sprawdzeniem ograniczeń i próbą INSERT, UPDATE lub DELETE)

    • Po zakończeniu operacji (po sprawdzeniu ograniczeń i zakończeniu INSERT, UPDATE lub DELETE)

    • zamiast operacji (w przypadku wstawiania, aktualizacji lub usuwania w widoku)

  • wyzwalacz zaznaczony dla każdego wiersza jest wywoływany raz dla każdego wiersza, który operacja się zmienia. W przeciwieństwie do tego, WYZWALACZ oznaczony dla każdej instrukcji wykonuje tylko jeden raz dla danej operacji, niezależnie od tego, ile wierszy modyfikuje.

  • zarówno klauzula WHEN, jak i akcje wyzwalające, mogą uzyskać dostęp do elementów wiersza wstawianego, usuwanego lub aktualizowanego za pomocą odwołań do formularza NEW.kolumna-nazwa i stary.column-name, gdzie column-name to nazwa kolumny z tabeli, z którą wyzwalacz jest skojarzony.

  • Jeśli dostarczona jest klauzula WHEN, to podane instrukcje PostgreSQL są wykonywane tylko dla wierszy, dla których klauzula WHEN jest prawdziwa. Jeśli nie podano klauzuli WHEN, polecenia PostgreSQL są wykonywane dla wszystkich wierszy.

  • Jeśli dla tego samego zdarzenia zdefiniowano wiele wyzwalaczy tego samego rodzaju, zostaną one wywołane w kolejności alfabetycznej według nazwy.

  • słowo kluczowe BEFORE, AFTER lub INSTEAD of określa, kiedy akcje wyzwalające zostaną wykonane względem wstawiania, modyfikacji lub usunięcia powiązanego wiersza.

  • wyzwalacze są automatycznie usuwane, gdy tabela, z którą są powiązane, zostanie usunięta.

  • tabela, która ma zostać zmodyfikowana, musi istnieć w tej samej bazie danych co tabela lub widok, do którego jest dołączony wyzwalacz i należy używać tylko nazwy tabeli, a nie bazy danych.tablename.

  • opcja ograniczenia, gdy jest podana, tworzy WYZWALACZ ograniczeń. Jest to to samo, co zwykły spust, z tą różnicą, że czas strzału spustowego można regulować za pomocą określonych ograniczeń. Oczekuje się, że wyzwalacze ograniczeń spowodują wyjątek, gdy ograniczenia, które wdrażają, zostaną naruszone.

składnia

podstawowa składnia tworzenia wyzwalacza jest następująca −

CREATE TRIGGER trigger_name event_nameON table_name;

tutaj event_name może być operacją INSERT, DELETE, UPDATE i TRUNCATE bazy danych na wspomnianej tabeli table_name. Opcjonalnie można określić dla każdego wiersza po nazwie tabeli.

poniżej znajduje się składnia tworzenia wyzwalacza podczas operacji aktualizacji na jednej lub kilku określonych kolumnach tabeli w następujący sposób −

CREATE TRIGGER trigger_name UPDATE OF column_nameON table_name;

przykład

rozważmy przypadek, w którym chcemy zachować próbę audytu dla każdego rekordu wstawianego do tabeli firmowej, którą utworzymy nowo w następujący sposób (upuść tabelę firmową, jeśli już ją posiadasz).

testdb=# CREATE TABLE COMPANY( ID INT PRIMARY KEY NOT NULL, NAME TEXT NOT NULL, AGE INT NOT NULL, ADDRESS CHAR(50), SALARY REAL);

aby zachować próbę audytu, utworzymy nową tabelę o nazwie AUDIT, w której będą wstawiane komunikaty dziennika za każdym razem, gdy pojawi się wpis w tabeli firmowej dla nowego rekordu −

testdb=# CREATE TABLE AUDIT( EMP_ID INT NOT NULL, ENTRY_DATE TEXT NOT NULL);

tutaj, ID jest identyfikatorem rekordu audytu, a EMP_ID jest identyfikatorem, który będzie pochodził z tabeli firmowej, a data zachowa znacznik czasu, gdy rekord zostanie utworzony w tabeli firmy. Teraz stwórzmy WYZWALACZ w tabeli firmowej w następujący sposób −

testdb=# CREATE TRIGGER example_trigger AFTER INSERT ON COMPANYFOR EACH ROW EXECUTE PROCEDURE auditlogfunc();

gdzie auditlogfunc() jest procedurą PostgreSQL i ma następującą definicję –

CREATE OR REPLACE FUNCTION auditlogfunc() RETURNS TRIGGER AS $example_table$ BEGIN INSERT INTO AUDIT(EMP_ID, ENTRY_DATE) VALUES (new.ID, current_timestamp); RETURN NEW; END;$example_table$ LANGUAGE plpgsql;

teraz rozpoczniemy rzeczywistą pracę. Zacznijmy wstawiać rekord do tabeli firmowej, co powinno skutkować utworzeniem rekordu dziennika audytu w tabeli audytu. Stwórzmy więc jeden rekord w tabeli firmowej w następujący sposób −

testdb=# INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)VALUES (1, 'Paul', 32, 'California', 20000.00 );

spowoduje to utworzenie jednego rekordu w tabeli firmowej, który jest następujący −

 id | name | age | address | salary----+------+-----+--------------+-------- 1 | Paul | 32 | California | 20000

w tym samym czasie w tabeli audytu zostanie utworzony jeden rekord. Rekord ten jest wynikiem wyzwalacza, który stworzyliśmy podczas operacji INSERT na tabeli firmowej. Podobnie można tworzyć wyzwalacze podczas operacji aktualizacji i usuwania w zależności od wymagań.

 emp_id | entry_date--------+------------------------------- 1 | 2013-05-05 15:49:59.968+05:30(1 row)

Listing wyzwalaczy

możesz wypisać wszystkie wyzwalacze w bieżącej bazie danych z tabeli pg_trigger w następujący sposób −

testdb=# SELECT * FROM pg_trigger;

powyższa instrukcja PostgreSQL wyświetli wszystkie wyzwalacze.

Jeśli chcesz wyświetlić wyzwalacze w określonej tabeli, użyj klauzuli AND o nazwie tabeli w następujący sposób −

testdb=# SELECT tgname FROM pg_trigger, pg_class WHERE tgrelid=pg_class.oid AND relname='company';

powyższa instrukcja PostgreSQL wyświetli również tylko jeden wpis w następujący sposób −

 tgname----------------- example_trigger(1 row)

upuszczanie wyzwalaczy

poniżej znajduje się polecenie upuść, który może być użyty do upuszczenia istniejącego wyzwalacza −

testdb=# DROP TRIGGER trigger_name;
ogłoszenia

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.