Adatbázisok tervezése

reflexív. Ezt a kapcsolatot nem deklarálhatjuk (PRIMARY KEY korlátozással), mert az Oracle? csak a RESTRICT (alapértelmezett) és az ON CLEAR CASCADE módot támogatja. Ezért fejlesztjük a harmadik módot, ON DELETE NULLIFY, amelyet néhány más relációs DBMS szabványosan támogat. Ne feledje, hogy minden alkalommal, amikor nem adunk meg (vagy nem adhatunk meg) korlátozásokat a kapcsolatok definiálásához, meg kell adnunk saját kódját, amely beír minden szabályt.

Először vegyünk egy nyilvánvaló megoldást, és nézzük meg, miért nem működik. Az alábbiakban bemutatjuk a megoldást illusztráló példát. Trigger emp hálós nem teher egy hiba miatt kapcsolódik a mutáló táblázat: nem kap hozzáférést az asztalra, ami miatt a ravaszt, hogy a tűz (ebben az esetben a táblázat EMP).

CREATE TABLE emp (empno NUMBER (4) NEM NULL

deptno NUMBER (4) NOT NULL

CONSTRAINT emp pk PRIMARY KEY (empno));

INSERT INTO emp VALUES (111, 10, nagy boss, menedzser, NULL); INPUT INTO emp VALUES (123, 11, Kis Guy, Janitor, 111);

CREATE OR REPLACE TRIGGER emp bdr BEFOR TÖRLÉS emp

UPDATE emp SET mgr = NULL WHERE mgr =: régi.empno; END;

DELETE emp WHERE empno = 111;

/ * A következő hiba történik: HIBA az 1. sorban:

ORA-04091: táblázat SCOTT.EMP mutáció, trigger / funkció nem látja ORA-06512: a 2. sorban

ORA-04088: hiba végrehajtása a trigger SCOTT.EMP BDR * /

Mi a hiba oka? A SET és az üzemeltetők, hogy a munka a különböző vonalak, van egy általános, és elég elméleti tulajdon. Az SQL nem garantálja az ilyen operátoron megadott sorok feldolgozásának sorrendjét. Ebből az következik, hogy ha tudjuk, hogy az asztal alatt mutálódik SET utasítást, minden ssshka az asztalra a ravaszt adható előtt vagy után az a tény gfoizoydet pelenkázó. Mivel a sorrend, amelyben a módosításokat kell végrehajtani, nem garantált, hogy nem szükséges, hogy minden egyes alkalommal azonos szereplők azonos adatokat, akkor ugyanazt az eredményt kap.

Hogyan tudja legyőzni ezt a korlátozást és elérni, hogy mit fogsz csinálni? Láttuk, hogyan próbálták megoldani ezt a problémát

módszerek - például tükrözött táblázatok vagy egy dedikált kiszolgálófolyamat használata, amely várakozik egy jelre, hogy végrehajtsa a hibát okozó frissítést. Ezek a megoldások nagyon összetettek és veszélyesek, így két egyszerű módszert kínálunk Önnek, hogy kiléphessünk ebből a helyzetből.

Először is fontolja meg egy olyan módszert, amely rendkívül hatékony, ezért nem ajánlott, de működik. Várja meg a törlés végrehajtását, majd nézze át az egész táblázatot a sorok jelenlétére, ahol az MGR oszlop egy nem létező alkalmazottra utal. Ha vannak olyan sorok, akkor visszaállítja az MGR oszlop értékét. A megvalósítás módja, az alábbiakban látható.

DROP TRIGGER emp bdr;

CREATE OR REPLACE TRIGGER emp ad A TÖRLÉS TÖRLÉSE ON emp BEGIN

HOGY NEM JELZTE (NÉPSZ

FROM emp emp2 WHERE emp2.empno = emp.mgr);

DELETE emp WHERE empno = 111;

SELECT * FROM emp;

> 123 11 Litle Guy Janitor

Annak ellenére, hogy néhány eredménytelenség, ez a megoldás egy érdekes tulajdonság: megszünteti a korábbi hibás hivatkozásokat előfordult eredményeként a program néhány órán belül (vagy hét) véletlenszerűen otvogyuchennym ravaszt. Az első eltávolítását bármely munkavállaló indul a ravaszt, hogy visszaállítja az értéke MGR oszlop megfelel egy nem létező főnök, minden alkalmazott számára, nemcsak azoknak, főnökeik eltávolítjuk a jelenlegi nyilatkozatot.

Az adatok önkorrekciója első pillantásra nagyon jónak tűnhet, de nemkívánatos következményekkel jár. Minden alkalommal, amikor egy alkalmazott eltávolításra kerül, az egész EMP-táblát olyan alkalmazottakra keresik, akik egy nem létező főnök számára dolgoznak. Például egy kétsoros tábla esetében ez nem fontos, de egy több ezer soros asztal esetében a teljesítmény szörnyen alacsony. Valamilyen módon korlátozni kell a keresést csak azokhoz a sorokhoz, amelyek a távoli főnökre hivatkoznak, anélkül, hogy problémát okozna a mutációs táblával.

Milyen más módszerekkel lehet megoldani ezt a problémát? A második (előnyös) módszer egy ügyes trükk - kivéve a távoli alkalmazottak egy sor szintű trigger és tegye kereső alkalmazottak, akik volt vezetője a távoli munkavállaló kiváltó utasítás után. Be kell használni PL / SQL összefoglaló táblázat átmeneti tárolására távoli alkalmazottak.

Mi a globális PL / SQL tábla? A PL / SQL csomagok globális változókat tartalmazhatnak. A csomagban vagy a csomagban (ha kívülről hozzáférhetőek) vagy a csomagolás testében, de minden eljáráson és funkción kívül nyilatkoznak. Az utóbbi esetben csak ezt a csomagot láthatják. Mindkét típusváltozó létrejön a csomag első alkalommal történő eléréséért (bármilyen okból), és a memóriában marad, amíg az Oracle munkamenet megszakítja a kapcsolatot. A PL / SQL 2.3 verzió lehetővé teszi a táblázatok törlését, de minden olyan csomópont esetében, amely Oracle 7.2-es vagy annál kisebb verziót használ, a globális csomagváltozók memóriájának fokozatos növelése problémát jelenthet a tervezés során. Ahogy az asztal egyik mérőszáma törlődik, egy ugyanolyan típusú üres táblát rendelhet.

A megoldás globális csomagváltozókkal történő végrehajtásának kódját a B.1 példában adjuk meg. Ez a kód egy háromdimenziós csomagból és három triggerből áll az EMP táblán, amelyek mindegyikét egy másik esemény indítja el, és felhívja az egyik kötegelt eljárásokat. Egy csomagváltozó egy tábla a távoli EMPNO számára, a másik egy index. A kezelői szint BEFORE DELETE triggerje egyszerűen olyan eljárást hív meg, amely ezt az indexet nullára állítja, azaz. Logikailag törli az asztalt. A sorszint előtti DELETE ELŐTÉTELE elhagyja a törlendő rekord elsődleges kulcsát (EMPNO), és hozzáfűzi a táblázat végéhez. Az operátor szintű AFTER DELETE trigger elhalad az asztalon, és visszaállítja az MGR oszlopot minden olyan alkalmazottnak, amelynek távoli alkalmazottja volt a vezető.

A B.1. Példa a kötegelt eljáráshívásokat használja a ravaszt belül, hogy a globális csomagváltozók helyiek maradhassanak az eljárás során. Ugyanez a módszer alacsony költséggel hajtható végre, ha egyszerűen elhelyezi a globális csomagváltozókat a csomagban (és nem a csomagtestben), és manipulálja őket közvetlenül a kiváltóktól. Amint azt valószínűleg kitalálja (ha olvassuk a könyv többi részét), inkább egy kizárólag kapszulázott megközelítést preferálunk.

B. példa 1. Hogyan lehet elkerülni a mutációs táblázatok megjelenését azáltal, hogy a cselekvést az üzemeltetők szintjére halasztják?

DROP TRIGGER emp ad;

CREATE OR REPLACE PACKAGE pk emp mgr AS ELJÁRÁS tiszta számlálás;

ELJÁRÁS add mgr (p empno IN emp.empno% TYPE); AZ ELJÁRÁS megsemmisíti a jelentéstételt; END pk emp mgr, -

Kapcsolódó cikkek