2012-04-16 6 views
5

W pracy mamy tabelę do przechowywania ustawień, które zasadniczo zawiera następujące kolumny:Prevent aktualizacja do nieistniejących wierszy

  • PARAMNAME
  • VALUE

Większość czasu nowych ustawień dodane, ale w rzadkich przypadkach ustawienia są usuwane. Niestety oznacza to, że wszelkie skrypty, które mogły wcześniej zaktualizować tę wartość, będą nadal działać pomimo tego, że aktualizacja zakończy się wynikiem "0 rows updated" i prowadzi do nieoczekiwanego zachowania.

Ta sytuacja została ostatnio zauważona przez niepowodzenie testu regresyjnego, ale dopiero po wielu badaniach, dlaczego dane w systemie były inne.

Moje pytanie brzmi: Czy istnieje sposób generowania warunku błędu, gdy aktualizacja powoduje zaktualizowanie zerowych wierszy?

Oto kilka opcji myślałem o, ale żaden z nich są naprawdę wszystko, co pożądane:

  • PL/SQL wrapper który zauważa uszkodzony aktualizację i zgłasza wyjątek.
    • Nie jest idealny, ponieważ nie zatrzymuje nikogo/skryptu przed ręcznym robieniem aktualizacji.
  • Wyzwalacz na stole, który zgłasza wyjątek.
    • Wynika z naszej obecnej polityki wycofywania wyzwalaczy.
    • Wymaga aktualizacji wyzwalacza za każdym razem, gdy usuwane jest ustawienie i utrzymywania listy przestarzałych ustawień (w przypadku wykluczenia).
    • Może mieć problemy z tabelą mutowania (jeśli włączasz, sprawdzając, jakie ustawienia istnieją).
+0

Jak uaktualnienie 0 wierszy doprowadzić do sygnalizowania czy dane są różne? –

+0

@TheNail Ustawienie dotyczyło opóźnienia. W starym kodzie wartość została zaktualizowana, a dane zawierały dane opóźnienie. W nowym kodzie nie było. Regresja Ergo. Dokładnie to samo by się stało, gdyby ustawienie kontrolowało, czy jakaś funkcja była włączona, czy nie. –

Odpowiedz

1

Niezupełnie rozwiązanie ale metoda organizowania rzeczy trochę:

Utwórz osobny stolik z definicjami parametrów i link do tej tabeli z tabeli wartości parametru. Wprowadź odwołanie do wymaganej definicji parametru (wartości null nie są dozwolone).

tabeli definicji PARAMS (ID, NAME)

Rzeczywiste ustawienia stół PARAM_VALUES (PARAM_ID, VALUE)

(zmiana struktury tabeli jest również bardzo skuteczny sposób, aby wywołać błędy w skryptach, które nie zostały zaktualizowane ...)

3

PL/Wrapper SQL wydaje mi się najlepszą opcją. Wyzwalacze są świetną rzeczą do zaniku, z wyjątkiem generowania sekwencji i wstawiania rekordów historii.

Jeśli obawiasz się, że ktoś ręcznie aktualizuje, a nie używa opakowania PL/SQL, po prostu ogranicz rolę użytkownika, aby nie miał uprawnień UPDATE w tabeli, ale ma uprawnienia EXECUTE do procedury.

1

Może można użyć oświadczenie MERGE tu jest link to

http://www.oracle-developer.net/display.php?id=203

Oświadczenie seryjnej pozwala połączyć wkładkę i aktualizacji w tej samej kwerendy, tak w przypadku, gdy pożądany rząd nie robi istnieją można wstawić rekord w tabeli buforowej sygnalizując, że wiersz nie istnieje, albo można zaktualizować żądany rekord

nadzieję, że pomoże

+0

Niezły pomysł, ale ten problem dotyczy zwykłej aktualizacji, ponieważ wymaga, aby ktoś zauważył, że w tabeli buforów znajdują się nowe rekordy. Gdyby to zauważyli, mogliby z łatwością zauważyć, że zaktualizowano 0 wierszy. Ale nie robią tego. Próbuję opracować możliwość ludzkiego błędu. –