Spoušť protokolu - Log trigger
v relační databáze, Spoušť protokolu nebo Spoušť historie je mechanismus pro automatické zaznamenávání informací o vkládání a / nebo aktualizaci a / nebo mazání změn řádky v databázová tabulka.
Je to zvláštní technika pro změnit sběr dat a v skladování dat pro jednání s pomalu se měnící rozměry.
Definice
Předpokládejme, že existuje stůl které chceme auditovat. Tento stůl obsahuje následující sloupce:
Sloupec1, Sloupec2, ..., Sloupec
The sloupec Sloupec1
se předpokládá, že primární klíč.
Tyto sloupce jsou definovány jako následující typy:
Type1, Type2, ..., Typen
The Spustit protokol práce na psaní změn (VLOŽIT, AKTUALIZACE a VYMAZAT operace) na stůl v jiném, tabulka historie, definováno takto:
VYTVOŘIT STŮL Tabulka historie ( Sloupec1 Typ1, Sloupec2 Typ2, : : Columnn Typen, Datum začátku ČAS SCHŮZKY, Datum ukončení ČAS SCHŮZKY)
Jak je uvedeno výše, tento nový stůl obsahuje to samé sloupce jako originál stůl, a navíc dva nové sloupce typu ČAS SCHŮZKY
: Datum začátku
a Datum ukončení
. Toto je známé jako verze n-tice. Tyto dva další sloupce definovat časové období "platnosti" dat spojených s určitou entitou (entita primární klíč ), nebo jinými slovy, ukládá, jaká byla data v časovém období mezi Datum začátku
(v ceně) a Datum ukončení
(není v ceně).
Pro každou entitu (odlišně primární klíč ) na originálu stůl, je v historii vytvořena následující struktura stůl. Data jsou uvedena jako příklad.

Všimněte si, že pokud jsou zobrazeny chronologicky, Datum ukončení
sloupec ze všech řádek je přesně to Datum začátku
jeho nástupce (pokud existuje). To neznamená, že obojí řádky jsou v tomto okamžiku společné, protože - podle definice - hodnota Datum ukončení
není součástí dodávky.
Existují dvě varianty Spoušť protokolu, v závislosti na tom, jak jsou staré hodnoty (DELETE, UPDATE) a nové hodnoty (INSERT, UPDATE) vystaveny spouštěči (záleží na RDBMS):
Staré a nové hodnoty jako pole struktury dat záznamu
VYTVOŘIT SPOUŠŤ Tabulka historie NA OriginalTable PRO VLOŽIT, VYMAZAT, AKTUALIZACE TAK JAKOPROHLÁSIT @Nyní ČAS SCHŮZKYSOUBOR @Nyní = GETDATE()/ * mazání sekce * /AKTUALIZACE Tabulka historie SOUBOR Datum ukončení = @Nyní KDE Datum ukončení JE NULA A Sloupec1 = STARÝ.Sloupec1/ * vkládací část * /VLOŽIT DO Tabulka historie (Sloupec1, Sloupec2, ...,Columnn, Datum začátku, Datum ukončení) HODNOTY (NOVÝ.Sloupec1, NOVÝ.Sloupec2, ..., NOVÝ.Columnn, @Nyní, NULA)
Staré a nové hodnoty jako řádky virtuálních tabulek
VYTVOŘIT SPOUŠŤ Tabulka historie NA OriginalTable PRO VLOŽIT, VYMAZAT, AKTUALIZACE TAK JAKOPROHLÁSIT @Nyní ČAS SCHŮZKYSOUBOR @Nyní = GETDATE()/ * mazání sekce * /AKTUALIZACE Tabulka historie SOUBOR Datum ukončení = @Nyní Z Tabulka historie, VYMAZÁNO KDE Tabulka historie.Sloupec1 = VYMAZÁNO.Sloupec1 A Tabulka historie.Datum ukončení JE NULA/ * vkládací část * /VLOŽIT DO Tabulka historie (Sloupec1, Sloupec2, ..., Columnn, Datum začátku, Datum ukončení)VYBRAT (Sloupec1, Sloupec2, ..., Columnn, @Nyní, NULA) Z VLOŽENO
Poznámky ke kompatibilitě
- Funkce
GetDate ()
slouží k získání konkrétního data a času systému RDBMS mohl použít jiný název funkce nebo získat tyto informace jiným způsobem. - Několik RDBMS (DB2, MySQL) nepodporují, že ke stejné operaci lze připojit více než jednu operaci (VLOŽIT, VYMAZAT, AKTUALIZACE ). V takovém případě musí být pro každou operaci vytvořen spouštěč; Pro VLOŽIT provoz pouze vkládací část musí být specifikováno, pro a VYMAZAT provoz pouze mazání sekce musí být specifikováno a pro AKTUALIZACE operace musí být přítomny obě sekce, stejně jako je uvedeno výše ( mazání sekce nejprve, pak vkládací část), protože AKTUALIZACE operace je logicky reprezentována jako a VYMAZAT operace následovaná VLOŽIT úkon.
- V zobrazeném kódu se volá datová struktura záznamu obsahující staré a nové hodnoty
STARÝ
aNOVÝ
. Na konkrétní RDBMS mohli mít různá jména. - V zobrazeném kódu se volají virtuální tabulky
VYMAZÁNO
aVLOŽENO
. Na konkrétní RDBMS mohli mít různá jména. Další RDBMS (DB2) dokonce umožňuje zadat název těchto logických tabulek. - V zobrazeném kódu jsou komentáře ve stylu C / C ++, konkrétní je nelze podporovat RDBMS, nebo by měla být použita jiná syntaxe.
- Několik RDBMS požadovat, aby tělo spouště bylo uzavřeno mezi
ZAČÍT
aKONEC
klíčová slova.
Skladování dat
Podle pomalu se měnící dimenze metodiky řízení, spoušť protokolu spadá do následujícího:
- Typ 2 (verze n-tice varianta)
- Typ 4 (použití historických tabulek)
Společná implementace RDBMS
IBM DB2[1]
- Spoušť nelze připojit k více než jedné operaci (VLOŽIT, VYMAZAT, AKTUALIZACE ), takže pro každou operaci musí být vytvořen spouštěč.
- Staré a nové hodnoty jsou vystaveny jako pole záznamových datových struktur. Názvy těchto záznamů lze definovat, v tomto příkladu jsou pojmenovány jako
Ó
pro staré hodnoty aN
pro nové hodnoty.
- Spouštěč pro VLOŽITVYTVOŘIT SPOUŠŤ Databáze.TableInsert PO VLOŽIT NA Databáze.OriginalTableREFERENCE NOVÝ TAK JAKO NPRO KAŽDÝ ŘÁDEK REŽIM DB2SQLZAČÍT PROHLÁSIT Nyní TIMESTAMP; SOUBOR NYNÍ = PROUD TIMESTAMP; VLOŽIT DO Databáze.Tabulka historie (Sloupec1, Sloupec2, ..., Columnn, Datum začátku, Datum ukončení) HODNOTY (N.Sloupec1, N.Sloupec2, ..., N.Columnn, Nyní, NULA);KONEC;- Spouštěč pro DELETEVYTVOŘIT SPOUŠŤ Databáze.TableDelete PO VYMAZAT NA Databáze.OriginalTableREFERENCE STARÝ TAK JAKO ÓPRO KAŽDÝ ŘÁDEK REŽIM DB2SQLZAČÍT PROHLÁSIT Nyní TIMESTAMP; SOUBOR NYNÍ = PROUD TIMESTAMP; AKTUALIZACE Databáze.Tabulka historie SOUBOR Datum ukončení = Nyní KDE Sloupec1 = Ó.Sloupec1 A Datum ukončení JE NULA;KONEC;- Spoušť pro UPDATEVYTVOŘIT SPOUŠŤ Databáze.TableUpdate PO AKTUALIZACE NA Databáze.OriginalTableREFERENCE NOVÝ TAK JAKO N STARÝ TAK JAKO ÓPRO KAŽDÝ ŘÁDEK REŽIM DB2SQLZAČÍT PROHLÁSIT Nyní TIMESTAMP; SOUBOR NYNÍ = PROUD TIMESTAMP; AKTUALIZACE Databáze.Tabulka historie SOUBOR Datum ukončení = Nyní KDE Sloupec1 = Ó.Sloupec1 A Datum ukončení JE NULA; VLOŽIT DO Databáze.Tabulka historie (Sloupec1, Sloupec2, ..., Columnn, Datum začátku, Datum ukončení) HODNOTY (N.Sloupec1, N.Sloupec2, ..., N.Columnn, Nyní, NULA);KONEC;
Microsoft SQL Server[2]
- Ke všem zařízením lze připojit stejnou spoušť VLOŽIT, VYMAZAT, a AKTUALIZACE operace.
- Staré a nové hodnoty jako řádky pojmenovaných virtuálních tabulek
VYMAZÁNO
aVLOŽENO
.
VYTVOŘIT SPOUŠŤ TableTrigger NA OriginalTable PRO VYMAZAT, VLOŽIT, AKTUALIZACE TAK JAKOPROHLÁSIT @NYNÍ ČAS SCHŮZKYSOUBOR @NYNÍ = CURRENT_TIMESTAMPAKTUALIZACE Tabulka historie SOUBOR Datum ukončení = @Nyní Z Tabulka historie, VYMAZÁNO KDE Tabulka historie.ColumnID = VYMAZÁNO.ColumnID A Tabulka historie.Datum ukončení JE NULAVLOŽIT DO Tabulka historie (ColumnID, Sloupec2, ..., Columnn, Datum začátku, Datum ukončení)VYBRAT ColumnID, Sloupec2, ..., Columnn, @NYNÍ, NULA Z VLOŽENO
MySQL
- Spoušť nelze připojit k více než jedné operaci (VLOŽIT, VYMAZAT, AKTUALIZACE ), takže pro každou operaci musí být vytvořen spouštěč.
- Staré a nové hodnoty jsou vystaveny jako pole záznamových datových struktur s názvem
Starý
aNový
.
ODDĚLOVAČ $$/ * Spouštěč pro VLOŽENÍ * /VYTVOŘIT SPOUŠŤ HistoryTableInsert PO VLOŽIT NA OriginalTable PRO KAŽDÝ ŘÁDEK ZAČÍT PROHLÁSIT N ČAS SCHŮZKY; SOUBOR N = Nyní(); VLOŽIT DO Tabulka historie (Sloupec1, Sloupec2, ..., Columnn, Datum začátku, Datum ukončení) HODNOTY (Nový.Sloupec1, Nový.Sloupec2, ..., Nový.Columnn, N, NULA);KONEC;/ * Spouštěč pro ODSTRANĚNÍ * /VYTVOŘIT SPOUŠŤ HistoryTableDelete PO VYMAZAT NA OriginalTable PRO KAŽDÝ ŘÁDEK ZAČÍT PROHLÁSIT N ČAS SCHŮZKY; SOUBOR N = Nyní(); AKTUALIZACE Tabulka historie SOUBOR Datum ukončení = N KDE Sloupec1 = STARÝ.Sloupec1 A Datum ukončení JE NULA;KONEC;/ * Spouštěč pro UPDATE * /VYTVOŘIT SPOUŠŤ HistoryTableUpdate PO AKTUALIZACE NA OriginalTable PRO KAŽDÝ ŘÁDEK ZAČÍT PROHLÁSIT N ČAS SCHŮZKY; SOUBOR N = Nyní(); AKTUALIZACE Tabulka historie SOUBOR Datum ukončení = N KDE Sloupec1 = STARÝ.Sloupec1 A Datum ukončení JE NULA; VLOŽIT DO Tabulka historie (Sloupec1, Sloupec2, ..., Columnn, Datum začátku, Datum ukončení) HODNOTY (Nový.Sloupec1, Nový.Sloupec2, ..., Nový.Columnn, N, NULA);KONEC;
Věštec
- Ke všem zařízením lze připojit stejnou spoušť VLOŽIT, VYMAZAT, a AKTUALIZACE operace.
- Staré a nové hodnoty jsou vystaveny jako pole záznamových datových struktur s názvem
:STARÝ
a:NOVÝ
. - Je nutné otestovat neplatnost polí pole
:NOVÝ
záznam, který definuje primární klíč (když VYMAZAT operace se provádí), aby se zabránilo vložení nového řádku s nulovými hodnotami do všech sloupců.
VYTVOŘIT NEBO NAHRADIT SPOUŠŤ TableTriggerPO VLOŽIT NEBO AKTUALIZACE NEBO VYMAZAT NA OriginalTablePRO KAŽDÝ ŘÁDEKPROHLÁSIT Nyní TIMESTAMP;ZAČÍT VYBRAT CURRENT_TIMESTAMP DO Nyní Z Dvojí; AKTUALIZACE Tabulka historie SOUBOR Datum ukončení = Nyní KDE Datum ukončení JE NULA A Sloupec1 = :STARÝ.Sloupec1; LI :NOVÝ.Sloupec1 JE NE NULA PAK VLOŽIT DO Tabulka historie (Sloupec1, Sloupec2, ..., Columnn, Datum začátku, Datum ukončení) HODNOTY (:NOVÝ.Sloupec1, :NOVÝ.Sloupec2, ..., :NOVÝ.Columnn, Nyní, NULA); KONEC LI;KONEC;
Historické informace
Typicky, zálohy databáze slouží k ukládání a načítání historických informací. A zálohování databáze je bezpečnostní mechanismus, více než efektivní způsob získávání historických informací připravených k použití.
Plný) zálohování databáze je pouze snímek dat v konkrétních časových bodech, takže bychom mohli znát informace o každém snímku, ale nemůžeme vědět nic mezi nimi. Informace v zálohy databáze je diskrétní v čase.
Za použití spoušť protokolu informace, které můžeme znát, nejsou diskrétní, ale spojité, můžeme znát přesný stav informací v kterémkoli okamžiku, omezený pouze na granularitu času poskytovaného ČAS SCHŮZKY
datový typ souboru RDBMS použitý.
Výhody
- Je to jednoduché.
- Nejedná se o komerční produkt, pracuje s dostupnými funkcemi společně RDBMS.
- Je to automatické, jakmile je vytvořeno, funguje bez dalších lidských zásahů.
- Není nutné mít dobré znalosti o tabulkách databáze nebo datovém modelu.
- Změny v aktuálním programování nejsou nutné.
- Změny v proudu tabulky nejsou povinné, protože data protokolu libovolného stůl je uložen v jiném.
- Funguje pro programované i ad hoc příkazy.
- Pouze změny (VLOŽIT, AKTUALIZACE a VYMAZAT operace), takže rostoucí rychlost tabulek historie je úměrná změnám.
- Není nutné použít spoušť na všechny tabulky v databázi, lze ji použít na určité tabulky nebo jisté sloupce a stůl.
Nevýhody
- Neukládá automaticky informace o uživateli, který změny provádí (uživatel informačního systému, nikoli uživatel databáze). Tyto informace mohou být poskytnuty výslovně. Mohlo by to být vynuceno v informačních systémech, ale ne v ad hoc dotazech.
Příklady použití
Získání aktuální verze tabulky
VYBRAT Sloupec1, Sloupec2, ..., Columnn Z Tabulka historie KDE Datum ukončení JE NULA
Mělo by vrátit stejnou sadu výsledků celého originálu stůl.
Získání verze tabulky v určitém časovém okamžiku
Předpokládejme @DATUM
proměnná obsahuje bod nebo čas zájmu.
VYBRAT Sloupec1, Sloupec2, ..., Columnn Z Tabulka historie KDE @datum >= Datum začátku A (@datum < Datum ukončení NEBO Datum ukončení JE NULA)
Získání informací o entitě v určitém časovém okamžiku
Předpokládejme @DATUM
proměnná obsahuje bod nebo čas zájmu a @KLÍČ
proměnná obsahuje primární klíč subjektu zájmu.
VYBRAT Sloupec1, Sloupec2, ..., Columnn Z Tabulka historie KDE Sloupec1 = @Klíč A @datum >= Datum začátku A (@datum < Datum ukončení NEBO Datum ukončení JE NULA)
Získání historie entity
Předpokládejme @KLÍČ
proměnná obsahuje primární klíč subjektu zájmu.
VYBRAT Sloupec1, Sloupec2, ..., Columnn, Datum začátku, Datum ukončení Z Tabulka historie KDE Sloupec1 = @Klíč OBJEDNAT PODLE Datum začátku
Zjištění, kdy a jak byla entita vytvořena
Předpokládejme @KLÍČ
proměnná obsahuje primární klíč subjektu zájmu.
VYBRAT H2.Sloupec1, H2.Sloupec2, ..., H2.Columnn, H2.Datum začátku Z Tabulka historie TAK JAKO H2 VLEVO, ODJET VNĚJŠÍ PŘIPOJIT SE Tabulka historie TAK JAKO H1 NA H2.Sloupec1 = H1.Sloupec1 A H2.Sloupec1 = @Klíč A H2.Datum začátku = H1.Datum ukončení KDE H2.Datum ukončení JE NULA
Neměnnost primární klíče
Protože to vyžaduje spouštěč primární klíč jsou stejné po celou dobu, je žádoucí buď zajistit, nebo maximalizovat jejich neměnnost, pokud a primární klíč změnil svou hodnotu, entita, kterou představuje, by porušila svou vlastní historii.
Existuje několik možností, jak dosáhnout nebo maximalizovat primární klíč neměnnost:
- Použití a náhradní klíč jako primární klíč. Protože neexistuje žádný důvod ke změně hodnoty, která by kromě identity a jedinečnosti neměla žádný jiný význam, nikdy by se nezměnila.
- Použití neměnného přirozený klíč jako primární klíč. V dobrém designu databáze a přirozený klíč které se mohou změnit, by neměly být považovány za „skutečné“ primární klíč.
- Použití proměnlivého přirozený klíč jako primární klíč (obecně se nedoporučuje), kde se změny šíří všude, kde se jedná o cizí klíč. V takovém případě by měla být ovlivněna také tabulka historie.
Alternativy
Někdy Pomalu se měnící dimenze se používá jako metoda, tento diagram je příkladem:

Viz také
- Relační databáze
- Primární klíč
- Přirozený klíč
- Náhradní klíč
- Změňte sběr dat
- Pomalu se měnící dimenze
- Správa verzí n-tice
Poznámky
Spouštěč protokolu napsal Laurence R. Ugalde automaticky generovat historii transakčních databází.