Table of Contents
W jednym lub dwóch przypadkach komputer może wygenerować błąd, pod warunkiem, że wyzwalacz Oracle został uruchomiony przed niepowodzeniem usuwania. Ten problem może być spowodowany wieloma przyczynami.
Zaktualizowano
Ten samouczek wyjaśnia, jak zaprojektować wyzwalacz BEFORE DELETE w Oracle, korzystając z formatu i przykładów.
Opis
Usunięcie przed wyzwalaczem oznacza, że Oracle może aktywować wyzwalacz przed uruchomieniem opcji DELETE.
Składnia
Format tworzenia konsekwencji BEFORE DELETE w Oracle / PLSQL:
UTWÓRZ [LUB ZAMIEŃ] USUŃ WYZWALANIE nazwa_wyzwalaczaPRZED PRZYPISANIEM nazwa_tabeli [DLA KAŻDEJ RANGI]WYJAŚNIONE T - zróżnicowane deklaracjeZACZYNAĆ - kod wyzwalającyWYJĄTEK JEŚLI ... - Obsługa wyjątkówKONIEC ;
Parametry lub argumenty
Jak dostarczyć przed usunięciem wyzwalacza w SQL?
SQL> SQL> występują typowe błędy tabeli (data d, czasy int); Utworzono biurko. SQL> SQL> przygotuj lub uzupełnij 2 wyzwalacze TRG 3 przed usunięciem za pomocą T 9 powiedz dla każdego wiersza 5 8 pragma autonom_transaction; 7 zaczyna wstawiać 8 zainteresowanych wartościami błędów (sysdate,: old.x); popełnij kilka; dziesięć raise_application_error (-20000, “Nie, nie możesz usunąć”); 11 koniec; Utworzono rok / wyzwalacz.
- LUB WYMIEŃ
- Opcjonalne. Jeśli zostanie określony, można odtworzyć wygenerowane, jeśli już istnieje, aby można było zmienić wartość wyzwalacza bez wykonywania instrukcji DROP TRIGGER.
- nazwa_wyzwalacza
- Nazwa firmy powiązana z wyzwalaczem do utworzenia.
- PRZED USUNIĘCIEM
- Oznacza to, że wyzwalacz rejestruje usunięcie przed wykonaniem operacji DELETE.
- nazwa tabeli
- Informacje o tabeli, dla której tworzona jest inicjalizacja.
Limity
- Nie można ustawić wyzwalacza FORWARD we właściwym widoku.
- Możesz zaktualizować: NOWE wartości.
- Nie zaktualizują kwoty: OLD.
Przykład
Przyjrzyjmy się modelowi użycia instrukcji CREATE TRIGGER do zbudowania dobrego wyzwalacza BEFORE DELETE.
polecenia CREATE TABLE(numer zamówienia_id (5), Numer ilościowy (4), cost_per_it number (6.2), Całkowity koszt (8.2));
Potencjalnie moglibyśmy wtedy, w razie potrzeby, użyć wyzwalacza TRIGGER, aby utworzyć wyzwalacz PRZED USUNIĘCIEM w następujący sposób:
Zaktualizowano
Czy masz dość powolnego działania komputera? Denerwują Cię frustrujące komunikaty o błędach? ASR Pro to rozwiązanie dla Ciebie! Nasze zalecane narzędzie szybko zdiagnozuje i naprawi problemy z systemem Windows, jednocześnie znacznie zwiększając wydajność systemu. Więc nie czekaj dłużej, pobierz ASR Pro już dziś!
WSKAZÓWKA. Jeśli tworzysz użycie SQLPlus, będziesz musiał dodać ukośnik e-mail do nowej ścieżki po wyniku. W przeciwnym razie skrypt nie zostanie wykonany.
UTWÓRZ LUB ZASTĄP WYZWALACZA order_before_deletePRZED USUNIĘCIEM NA ZAMÓWIENIE DLA KAŻDEGO RZĘDUWYJAŚNIAĆ v_nazwa_użytkownika varchar2 (10);ZACZYNAĆ ~ Wyszukaj w tabeli nazwę związaną z użytkownikiem końcowym wykonującym operację DELETE. SELECT user IN v_username Podwójnie; s - wstaw rekord do tabeli egzaminacyjnej WSTAW W ZAMÓWIENIU_audit ( Numer zamówienia, Numer, koszt_za_pozycję, Całkowity koszt, data_usuwania, usunięty_bi) WARTOŚCI (: stary.identyfikator_zamówienia, : przestarzały tłum, ` stary.koszt_na_pozycję, : stary.całkowity_koszt, data systemowa, v_nazwa_użytkownika);KOŃCZYĆ SIĘ;/
Pytałeś
I Connor powiedział…
Ocena
Czy ta super odpowiedź jest nieaktualna? Jeśli tak, poinformuj o tym Stany Zjednoczone, jeśli to możliwe, w komentarzach
Cześć Tom .. !!
Moje zapytanie występuje, gdy jeden konkretny użytkownik usuwa rekord z tabeli T1. Jeśli zostanie zarejestrowana próba usunięcia pobrania z T1, utwórz wpis odwołujący się do EVENT_DETAILS, a wpis nie jest faktycznie usuwany z T1. W przypadku wycofania wiersz EVENT_DETAILNie jest wycofaniem.
Wypróbowałem 3 rozwiązania.
1. Uruchom kod i umieść najważniejsze oświadczenie COMMIT w procedurze jako konkretną transakcję niezależną od pragmy.
Problem: pls-00127: Pragma AUTOMOMOUS_TRANSACTION prawdopodobnie nie jest blokowana przez Pragmę
2. Przedrostek Tigger zawiera instrukcję wstawiania i wykluczenie podbicia. Kontrola blokowania wyjątków. Wstawienie powiodło się, usunięte zostaną wyłącznie dane.
3. Poniższy kod wstawiania powiodło się i nie może zapobiec jego usunięciu.
Czy zazwyczaj jest to numer błędu wyzwalacza na poziomie tabeli?
Częstość występowania błędów powinna naprawdę mieć znaczenie, prawda? Jak sugeruje jedna z gaf, wszystko, co możesz zrobić, to wskazać, że wiele nowych i starych fikcyjnych wierszy wiarygodnego wyzwalacza na poziomie wiersza, a nie wyzwalacza na poziomie tabeli, pomoc określa, który typ jest uruchamiany raz, niezależnie od liczby dotkniętych serii przez deklarację.
Proszę zasugerować najlepszy sposób i daj mi znać, jeśli nic nie zostanie znalezione. Dziękuję.
Dla twoich głównych informacji, właśnie wprowadziłem pin wyzwalający DELETE. Później rozszerzę INSERT/UPDATE CODE na T1.
Muszę również powtórzyć ten sam kod dla dwóch innych tabel. Czy to dobry sposób na ponowne użycie tego samego kodu, co w przypadku kilku różnych tabel?
UTWÓRZ LUB ZAMIEŃ SPUST PRZED_DML_DBLOGIN PRZED USUNIĘCIEM LUB WSTAWIENIEM LUB USUNIĘCIEM W T1
ZAUWAŻ JAK NOWY STARY STARY
DLA KAŻDEJ LINII
ZADEKLARUJ
VER_LOGIN_2
V_NODE_IP VARCHAR2 (30);
V_OSUSER VARCHAR2 (30);
V_PROGRAM VARCHAR2 (120);
_LOGIN_NUMER UŻYTKOWNIKA: = 0;
V_ACTIVE VARCHAR2 (10);
START
SELECT SYS_CONTEXT (‘USERENV’, ‘IP_ADDRESS’),
SYS_CONTEXT (‘USERENV’, ‘OS_USER’)
IN V_NODE_IP, V_OSUSER
SINCE DUAL;
WYBIERZ GÓRNE (PROGRAM)
W V_PROGRAMIE
Z V $ SESJI
O AUDSID – SYS_CONTEXT (‘USERENV’, ‘SESSIONID’) ORAZ ROWNUM – 1;
JEŚLI USUŃ
WSTAW
W SZCZEGÓŁACH ZDARZENIA (ADRES_IP, LOGIN_DB, UŻYTKOWNIK, WYKONYWALNY, UTWORZONY)
WARTOŚCI (IP_WĘZŁA_V, UŻYTKOWNIK_SYS.LOGIN_USER, UŻYTKOWNIK V_OSUSER, PROGRAM_SYSTEM, DATA_SYSTEM)
20002, „Dane w tabeli T1 nie muszą być usuwane”, PRAWDA);
KONIEC JEŚLI;
WYJĄTEK
JEŚLI INNE TO
WSTAW
W EVENT_DETAILS (IP_ADDRESS, DB_LOGIN, OS_USER, EXECUABLE, CREATED)
WARTOŚCI (V_NODE_IP, SYS.LOGIN_USER, V_OSUSER, V_PROGRAM) ;
RAISE_APPLICATION_ERROR (-20002, ‘Dane, gdy nie można usunąć komórki T1’, TRUE); KONIEC
PRZED_DML_DBLOGIN;
/
Na przykład udział w negocjacjach nie ma problemu z negocjacjami offline
SQL> tworzy tabelę k (x int Utworzono);Tabela.SQL> wstaw d (1) do swoich wartości;1 linia została już utworzona.SQL>SQL> Utwórz Tray-Err (d data, x int);Tabela zostaje utworzona.SQL>SQL> utwórz lub zamień 4 tworzy TRG 3 przed naciśnięciem T. Uzyskaj ulgę od 4 z rzędu 10 wyjaśnij dziesięć prag autonomiczna_transakcja; stworzyć dziewięć Uwzględnij 8 w wartościach błędów (sysdate,: old.x); niektórzy się angażują; 10 raise_application_error (-20000, "Nie, 12 nie mogło zostać usuniętych"); Kończyć się; jest dwanaście /Wyzwalacz został utworzony.SQL>SQL> t usuń;usuń w ciągu t*BŁĄD w wierszu 1:ORA-20000: nie, nie można tego andelowaćORA-06512: na linii „MCDONAC.TRG” 6ORA-04088: błąd podczas wykonywania leada do „MCDONAC.TRG”.SQL> wybierz z 7. roamingu;D X--------- ----------04 listopada 16 1Wybrano 1 linię.
Należy jednak pamiętać, że 60-minutowe żądania pobierania mogą być uruchamiane więcej niż raz, nawet z powodu jednego wiersza, ze względu na sposób, w jaki osobiście radzę sobie z przypisaniami wielu użytkowników na stole. Więc może jeśli Twoja witryna ma śledzenie aktywności tylko z tego powodu, że ktoś (powiedzmy) pojawia się dwukrotnie na Twoim stole kuchennym z błędami, nie możesz zakładać, że eksperci twierdzą, że mógł dwukrotnie doświadczyć tej operacji. Możesz go kupić tylko raz.
Jeśli potrzebujesz ponownie użyć kodu w innym miejscu, możesz w dużym stopniu przekonwertować kod na formułę, jeśli chcesz, na przykład
Utwórz lub zastąp
SQL> 5 procedura catch_del_attempt (p_x int) dwa lub trzy pragmy autonomic_transaction; 7 start Zestaw 5 przeznaczony dla Err (sysdate, p_x); popełnij kilka; pięć koniec; 8. /Procedura została niedawno stworzona.SQL>SQL> utwórz do wymiany 2 napięcia TRG 3 na T przed usunięciem 3 w każdym rzędzie wszystko się zaczyna 6 catch_del_attempt (: stary.x); 7 raise_application_error (-20000, "Żaden użytkownik nie może usunąć"); 8 koniec; siedem /Wyzwalacz został utworzony.Przyspiesz swój komputer już dziś dzięki temu prostemu pobieraniu.
How To Resolve Oracle Trigger Before Clearing Reminder Errors
Как разрешить триггер Oracle перед удалением ошибок напоминания
Cómo Resolver Oracle Trigger Antes De Borrar Los Errores De Recordatorio
So Lösen Sie Den Oracle-Trigger Auf, Bevor Sie Erinnerungsfehler Löschen
Como Resolver O Gatilho Do Oracle Antes De Limpar Os Erros De Lembrete
Oracle-trigger Oplossen Voordat Herinneringsfouten Worden Gewist
미리 알림 오류를 지우기 전에 Oracle 트리거를 해결하는 방법
Come Risolvere Oracle Trigger Prima Di Cancellare Gli Errori Di Promemoria
Comment Résoudre Oracle Trigger Avant D’effacer Les Erreurs De Rappel
Så Här Löser Du Oracle Trigger Innan Du Rensar Påminnelsefel