SQL Triggers: The Essential Guide

Spouštěče jsou databázové entity na serveru SQL Server. Technicky jde o konkrétní třídu volání funkcí, která reaguje na konkrétní databázové operace.

Tento základní průvodce vám poskytne podrobné informace o SQL Triggerech, které mohou být ve vaší profesi docela užitečné. Začněme!

Co jsou spouštěče SQL?

Slovo „spouštěč“ popisuje prohlášení, že server automaticky provede dotaz pokaždé, když je obsah v databázi změněn.

Spouštěč je skupina speciálně pojmenovaných SQL dotazů, které jsou uloženy v paměťovém prostoru. Je to specifický typ volání funkce, které je okamžitě vyvoláno, kdykoli dojde k jakékoli databázové události. Každý trigger má přiřazenou tabulku.

Spouštěč může být například aktivován vždy, když je do určité tabulky přidán nový sloupec nebo když jsou změněny určité záznamy.

Podle Microsoft Developer Network jsou spouštěče konkrétní třídou uložených procedur. V příkazu spouště nejprve definujeme, kdy se má spouštěč spustit, a poté poskytujeme akci, která by měla být provedena po aktivaci spouštěče.

Syntax:

CREATE TRIGGER trigger_name
BEFORE/AFTER
INSERT/UPDATE/DELETE
ON tableName
FOR EACH ROW SET operation [trigger_body];

Vysvětlení každého parametru

  • CREATE TRIGGER název_spouštěče – Používá se ke konstrukci spouštěče nebo ke změně názvu existujícího spouštěče.
  • BEFORE/AFTER – Tento dotaz se používá k definování doby provedení spouštěče (před nebo po určité události).
  • INSERT/UPDATE/DELETE – Popisuje akci, kterou chceme na stolech provést.
  • ON tableName – Zde definujeme název tabulky pro nastavení triggeru.
  • PRO KAŽDÝ ŘÁDEK – Tento příkaz se týká spouštěče řádku, což znamená, že spouštěče budou provedeny při každé změně řádku.
  • trigger_body – Určuje akci, která má být provedena, když je trigger aktivován.

Spouštěče jsou uložené funkce s charakteristickými identitami, které nám umožňují znovu použít dotazy, které již byly provedeny a bezpečně uloženy v paměti. Nyní se pokusme pochopit, proč je SQL potřebuje.

Spouštěče se většinou používají k regulaci nasazení kódu, kdykoli dojde k události. Jinými slovy, použití spouštěčů je ideální volbou, pokud požadujete, aby byl určitý fragment kódu neustále spouštěn v reakci na zadanou událost.

Níže jsou uvedeny některé výhody použití spouštěčů v operacích databáze SQL.

  • Provádí další kontroly při vkládání, aktualizaci nebo odstraňování dat z ovlivněné tabulky.
  • Zkracuje dobu odezvy, což pomáhá zvýšit náklady na výpočetní techniku.
  • Umožňuje kódování sofistikovaných výchozích parametrů, které jsou nepřístupné počátečním omezením.
  •   Jak vyrobit pivovarský stojan v Minecraftu

    Referenční integrita je klíčovou základní vlastností relačních databázových systémů. To znamená, že data uchovávaná v databázovém systému musí být vždy přesná pro každou transakci a každou operaci.

    Pokud jsou dvě tabulky umístěny v samostatných databázích nebo systémech, neexistuje způsob, jak v nich zajistit ověření dat pomocí hodnot omezení. V takové situaci jsou spouštěče jedinou možností pro provedení.

    Kombinace spouštěcích argumentů

    Pro každou tabulku můžeme určit šest různých typů spouštění. Jedná se o kombinaci argumentů Trigger obsažených v Triggerech na úrovni řádků SQL.

    BEFORE INSERT: Tyto spouštěče provedou akci na řádcích před provedením jakékoli operace INSERT v zadané tabulce nebo v databázi.

    AFTER INSERT: Provede akci na řádcích bezprostředně po jakékoli aktivitě INSERT databáze.

    PŘED AKTUALIZACÍ: S těmito spouštěči je funkce na řádcích provedena před akcí AKTUALIZACE v databázi.

    PO AKTUALIZACI: Provede akci na řádcích bezprostředně následujících po jakékoli aktivitě UPDATE databáze nebo konkrétní tabulky.

    BEFORE DELETE: Provede určitou operaci na řádcích ještě předtím, než je databáze nebo tabulka podrobena akci DELETE.

    AFTER DELETE: Tyto spouštěče provedou akci na řádcích následujících po každé transakci DELETE.

    Typy spouštěčů SQL

    Spouštěče SQL jsou uložené funkce, které se spustí okamžitě, když nastanou určité události. Připomíná plánování řízené událostmi. Následující situace mohou spustit provádění spouštěčů.

    DML Triggers – DML je zkratka pro Data Manipulation Language. Spouštění kódu v reakci na modifikaci dat je umožněno pomocí DML Triggers. Tento spouštěč se aktivuje, když jsou provedeny příkazy DML jako INSERT, UPDATE a DELETE. Nazývají se také „spouštěče na úrovni tabulky“.

    Spouštěče DDL – DDL je zkratka pro Data Definition Language. Spouštěče DDL nám umožňují spouštět kód v reakci na změny schématu databáze, jako je přidávání nebo mazání tabulek nebo události serveru, například když se uživatel přihlásí. Tyto události se nazývají „spouštěče na úrovni databáze“.

    Tyto spouštěče lze aktivovat, když jsou v aktivní databázi provedeny určité příkazy DDL, jako je CREATE, ALTER nebo DROP. Ty lze také využít ke sledování a řízení prováděných činností.

    LOGON Triggers – Kdykoli nastane událost LOGON (spuštění, přihlášení, odhlášení, vypnutí), jsou okamžitě vyvolány spouštěče přihlášení. Provádějí se pouze po procesu autentizace uživatele ještě před zahájením uživatelské transakce. Pokud autorizace selže, spouštěče LOGON se nespustí.

    Tyto spouštěče lze použít k záznamu historie přihlášení nebo k vytvoření omezení události pro konkrétní přihlášení, mimo jiné funkce auditování a správy identit pro připojení k serveru.

    CLR Triggers – CLR znamená Common Language Runtime. Spouštěče CLR jsou skutečně jedinečnou podmnožinou spouštěčů postavených převážně na CLR v rámci technologie .NET. Tyto spouštěče jsou užitečné, pokud spouštěč potřebuje provádět mnoho výpočtů nebo se musí vztahovat k jiné entitě než SQL.

      8 způsobů nápravy Nelze odeslat zprávu do mnoha neodeslaných multimediálních zpráv

    Spouštěče DML a DDL lze skutečně vytvořit povolením kódování podporovaných spouštěčů CLR v technologiích .NET včetně Visual Basic, C# a F-sharp.

    Ukázkový spouštěč SQL Server

    Pojďme pochopit tyto spouštěcí koncepty na příkladu.

    Nejprve si vytvoříme databázi pomocí SQL příkazů.

    CREATE DATABASE testdb;
    use testdb;

    Zde jsem jako název databáze uvedl „testdb“. A dalším krokem je vytvoření tabulky.

    CREATE TABLE student(
      name varchar(25),
      id int(2),
      maths int(2),
      physics int(2),
      biology int(2),
      social int(2),
      total int(2)
     );

    Vytvořil jsem tabulku pro ukládání podrobností o studentech. A zde je příkaz k popisu struktury tabulky. Zde „student“ je název tabulky, který jsem uvedl.

    DESC student;

    Níže je struktura tabulky, kterou jsem vytvořil.

    +---------+-------------+------+-----+---------+-------+
    | Field   | Type        | Null | Key | Default | Extra |
    +---------+-------------+------+-----+---------+-------+
    | name    | varchar(25) | YES  |     | NULL    |       |
    | id      | int         | YES  |     | NULL    |       |
    | maths   | int         | YES  |     | NULL    |       |
    | physics | int         | YES  |     | NULL    |       |
    | biology | int         | YES  |     | NULL    |       |
    | social  | int         | YES  |     | NULL    |       |
    | total   | int         | YES  |     | NULL    |       |
    +---------+-------------+------+-----+---------+-------+
    7 rows in set (0.00 sec)

    Po vytvoření tabulky je dalším krokem nastavení spouštěče. Zkusme použít argument BEFORE INSERT.

    Název spouštěče, který jsem vytvořil, je „marks“. Jakmile je tabulka upravena známkami studenta, spouštěč níže se pokusí automaticky určit celkovou známku studenta.

    CREATE TRIGGER marks
    BEFORE INSERT
    ON
    student
    FOR EACH ROW
    set new.total=new.maths+new.physics+new.biology+new.social;

    Vzhledem k tomu, že jsme povinni nahrazovat data řádků místo práce se starými, definovali jsme „total“ pomocí nového názvu třídy a všechny následující výrazy mají za součtem předponu s novými klíčovými slovy pomocí operátoru tečka. Nyní přidáme hodnoty do každého řádku a uvidíme výsledky. Zpočátku je celková známka 0 pro každého studenta.

    INSERT INTO student VALUES("George",02,99,87,92,91,0);
    INSERT INTO student VALUES("James",03,91,81,94,90,0);
    INSERT INTO student VALUES("Harry",04,86,70,73,88,0);
    INSERT INTO student VALUES("John",05,73,89,78,92,0);
    INSERT INTO student VALUES("Lisa",01,94,75,69,79,0);
    

    Spouštěcí příkaz se v tomto případě automaticky spustí při vložení dat do studentské tabulky. Celkové známky každého studenta budou vypočítány spouštěčem. Nyní se podívejme, zda je spouštěč vyvolán nebo ne pomocí příkazu SELECT.

    SELECT * FROM table_name;

    A zde je finální výstup.

    mysql> select * from student;
    +--------+------+-------+---------+---------+--------+-------+
    | name   | id   | maths | physics | biology | social | total |
    +--------+------+-------+---------+---------+--------+-------+
    | George |    2 |    91 |      81 |      94 |     90 |   356 |
    | James  |    3 |    86 |      70 |      73 |     88 |   317 |
    | Harry  |    4 |    73 |      89 |      78 |     92 |   332 |
    | John   |    5 |    94 |      75 |      69 |     79 |   317 |
    | Lisa   |    1 |    99 |      87 |      92 |     91 |   369 |
    +--------+------+-------+---------+---------+--------+-------+
    5 rows in set (0.00 sec)

    Ve výše uvedeném výsledku vidíte, že se každému studentovi automaticky sčítají všechny známky z předmětů. Můžeme tedy dojít k závěru, že spouštěč byl úspěšně vyvolán.

    Další spouštěcí operace

    Pomocí triggerů můžeme provádět mnoho operací. Některé mohou být jednoduché a některé trochu složité, ale jakmile si projdeme dotazy, je snadné je pochopit. Použitím příkazů Transact-SQL můžete aktivovat, deaktivovat nebo odstranit spouštěče pomocí následujících příkazů.

      Jak zobrazit neodeslané zprávy na lince

    Dotaz, abyste zkontrolovali, zda existuje konkrétní spouštěč nebo ne

    Tento příkaz zkontroluje zadaný spouštěč v celé databázi.

    SELECT * FROM [sys].[triggers] WHERE [name] = 'Trigger_name'

    Dotaz na zobrazení spouštěčů

    Všechny spouštěče, které jsou k dispozici v aktivní databázi, budou zobrazeny následujícím příkazem.

    SHOW TRIGGERS;

    Dotaz na deaktivaci spouštěče

    Níže uvedený příkaz deaktivuje spouštěč v pracovní databázi.

    DISABLE TRIGGER trigger_name ON DATABASE;

    Můžete také zadat určitý název tabulky a deaktivovat spouštěč.

    DISABLE TRIGGER trigger_name ON table_name;

    Dotaz na aktivaci spouštěče

    Následující příkaz nejprve deaktivuje konkrétní spouštěč, který byl definován v zadané tabulce v aktivní databázi, než jej znovu povolíte.

    ALTER TABLE table_name DISABLE TRIGGER trigger_name
    
    ALTER TABLE table_name ENABLE TRIGGER trigger_name

    Před pokusem o aktivaci musí být spouštěč deaktivován,

    Dotaz pro povolení nebo zakázání všech spouštěčů v tabulce

    Pomocí výše uvedeného příkazu SQL můžeme deaktivovat nebo aktivovat všechny spouštěče tabulky najednou tím, že místo konkrétního názvu spouštěče nahradíme „ALL“.

    ALTER TABLE table_name DISABLE TRIGGER ALL 
    
    ALTER TABLE table_name ENABLE TRIGGER ALL

    Dotaz na smazání nebo zrušení spouštění

    Spouštěč lze odstranit jeho smazáním nebo smazáním celé tabulky. Každý související spouštěč je také odstraněn, když je odstraněna tabulka.

    DROP TRIGGER [trigger_name];

    Kdykoli je spouštěč odstraněn, související data jsou odstraněna z datové tabulky sys.objects.

    Výhody spouštěčů

    • Je jednoduché vytvořit spouštěče a samotný spouštěč může vyvolat uložené funkce a metody.
    • Uživatelé mohou implementovat jednoduché auditování pomocí spouštěčů.
    • Je tragické, že nemůžete vytvořit omezení mezi entitami v databázových systémech pomocí SQL Server, ačkoli můžete emulovat provoz omezení pomocí spouštěčů.
    • Omezení integrity lze implementovat napříč databázemi pomocí spouštěčů.
    • Pokud je vyžadováno skupinové ověření namísto ověření řádku po řádku nově zadaných nebo změněných dat, mohou být užitečné spouštěče.

    Nevýhody spouštěčů

    Spouštěče SQL nemusí být v některých situacích tou nejlepší volbou kvůli jejich omezením.

    • Spouštěče musí být přesně zdokumentovány.
    • Kvůli simultánnímu spouštění databáze, která nemusí být přístupná komponentám aplikace, může být náročné ladit spouštěče.
    • Příkazy DML jsou při použití spouštěčů složitější.
    • I malý problém se spouštěčem může vést k logickým chybám v prohlášení.

    Závěr

    Spouštěče jsou velmi užitečné součásti Transact-SQL a SQL a můžete je použít i v Oracle. Použití spouštěčů je zásadní při volání uložených metod. Tyto spouštěče SQL nám umožňují analyzovat časové osy aktivit a určit, jak na ně v případě potřeby reagovat. Můžeme také zkontrolovat určitou tabulku, která je připojena ke spouštěči pro získávání dat.

    Rekurzi lze povolit pomocí spouštěčů. Kdykoli spouštěč v tabulce provede příkaz v nadřazené tabulce, spustí se druhá iterace spouštěče, která se nazývá rekurzivní spouštěč. To pomáhá při snaze vyřešit korelaci identity.

    Spouštěče navíc regulují vzor aktualizace, který může databáze přijímat. Je velmi výhodné zachovat omezení integrity dat v databázovém systému, pokud neexistují klíče omezení SQL, zejména primární klíč a cizí klíč.

    Doufám, že vám tento článek pomohl při poznávání spouštěčů SQL.

    Pokud se chcete naučit databáze do hloubky, zde je několik vynikajících zdrojů, jak se naučit SQL a NoSQL.