it-swarm-eu.dev

Proč se nemusím dopouštět při spouštění databáze?

Nemůžeme COMMIT/ROLLBACK ve spouštěch DML, protože transakce je zpracována ručně po příkazu DML. Spouštěče databáze se však zdají být výjimkou. Předpokládejme například, že existuje spouštěč databáze:

CREATE OR REPLACE TRIGGER user_login_as
  AFTER LOGON 
    ON SCHEMA
BEGIN
  INSERT INTO user_login_log(username, log_date, action) VALUES (user, sysdate, 'User has logged in');
END user_login_as;

Spoušť neobsahuje autonomní transakční proceduru s potvrzením uvnitř, takže kdo zavazuje vložení? Tento spouštěč funguje jako kouzlo a po přihlášení uživatele vloží nový záznam do tabulky protokolu. Voní to jako skrytá funkce Oracle a v dokumentech Oracle o tom nemůžu najít žádný odkaz. Používám Oracle11g.

7
Centurion

Automaticky získáte autonomní transakční kontext pro tyto spouštěče.

Z CREATE TRIGGER dokumenty:

Jeden nebo více konkrétních stavů databáze, které mohou způsobit spuštění spouště. Spouštěče pro tyto události můžete vytvořit na DATABASE nebo SCHEMA, pokud není uvedeno jinak. Pro každou z těchto spouštěcích událostí otevře databáze autonomní rozsah transakcí , spustí aktivační událost a provede každou samostatnou transakci (bez ohledu na existující transakci uživatele) .

Co se stane, když spoušť selže, závisí na přesné spoušti/události. Viz Zpracování výjimek v aktivačním modul . Zejména přihlašovací spoušť, která selže s výjimkou, může velmi dobře uzamknout uživatele, kteří nejsou dba - výjimka způsobí selhání přihlášení, pokud uživatel nemá určitá oprávnění.

13
Mat