jaka jest różnica pomiędzy wyzwalaczami, twierdzeniami i sprawdzeniami (w bazie danych)

Czy ktoś może wyjaśnić (lub zasugerować stronę lub papier) dokładną różnicę między wyzwalaczami, twierdzeniami i sprawdzeniami, a także opisać, gdzie powinienem ich użyć?

EDIT: mam na myśli bazę danych, a nie inne systemy lub języki programowania.

Author: Am1rr3zA, 2010-03-14

5 answers

Triggers - wyzwalacz jest fragmentem SQL do wykonania przed lub po aktualizacji, wstawiania lub usuwania w bazie danych. Przykład wyzwalacza w prostym języku angielskim może być następujący: przed aktualizacją rekordu klienta Zapisz kopię bieżącego rekordu. Który wyglądałby mniej więcej tak:

CREATE TRIGGER triggerName
AFTER UPDATE
    INSERT INTO CustomerLog (blah, blah, blah)
    SELECT blah, blah, blah FROM deleted

Różnica między twierdzeniami a sprawdzeniami jest nieco bardziej mroczna, wiele baz danych nawet nie obsługuje twierdzeń.

Check Constraint - A check is a kawałek SQL, który zapewnia, że warunek jest spełniony, zanim można podjąć działania na rekord. W prostym języku angielskim byłoby to coś w stylu: wszyscy klienci muszą mieć saldo konta w wysokości co najmniej $100 na swoim koncie. Który wyglądałby mniej więcej tak:

ALTER TABLE accounts 
ADD CONSTRAINT CK_minimumBalance
CHECK (balance >= 100)

Każda próba Wstawienia wartości w kolumnie saldo mniejszej niż 100 spowodowałaby błąd.

Assertions - assertion jest fragmentem SQL, który upewnia się, że warunek jest spełniony lub zatrzymuje działanie wykonane na obiekcie bazy danych . Może to oznaczać zablokowanie całej tabeli lub nawet całej bazy danych.

Aby było bardziej mylące - wyzwalacz może być użyty do wymuszenia ograniczenia sprawdzania, a w niektórych DBs może zająć miejsce twierdzenia (pozwalając na uruchamianie kodu niezwiązanego z modyfikowaną tabelą). Częstym błędem dla początkujących jest użycie ograniczenia sprawdzania, gdy wymagany jest wyzwalacz lub wyzwalacza, gdy wymagane jest ograniczenie sprawdzania.

Przykład: wszystkie nowe klienci otwierający konto muszą mieć saldo w wysokości 100 USD; jednak po otwarciu konta ich saldo może spaść poniżej tej kwoty. W tym przypadku musisz użyć wyzwalacza, ponieważ chcesz, aby warunek był oceniany tylko podczas wstawiania nowego rekordu.

 48
Author: jellomonkey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-14 20:39:04

W standardzie SQL zarówno twierdzenia, jak i ograniczenia sprawdzania są tym, co teoria relacyjna nazywa "ograniczeniami": regułami, z którymi dane faktycznie zawarte w bazie danych muszą być zgodne.

Różnica między nimi polega na tym, że ograniczenia kontroli są w pewnym sensie znacznie "prostsze" : są to reguły odnoszące się tylko do jednego wiersza, podczas gdy twierdzenia mogą dotyczyć dowolnej liczby innych tabel lub dowolnej liczby innych wierszy w tej samej tabeli. To oczywiście sprawia, że (dużo !) bardziej złożone dla konstruktorzy DBMS, aby go wspierać, i to jest z kolei powód, dlaczego tego nie robią : po prostu nie wiedzą, jak to zrobić.

Wyzwalacze to fragmenty kodu wykonywalnego, z których można zadeklarować DBMS, że powinny one być wykonywane za każdym razem, gdy pewna operacja aktualizacji (insert/delete / update) zostanie wykonana w określonej tabeli. Ponieważ wyzwalacze mogą wywoływać wyjątki, są one środkiem do implementacji tego samego twierdzenia. Jednak z wyzwalaczami, to wciąż programista, który musi zrobić kodowanie i nie popełnić żadnego błędu.

EDIT

Onedaywhen ' s comments re. ASSERTION / CHECK cnstr. są poprawne. Różnica jest o wiele bardziej subtelna (i myląca). Standard rzeczywiście pozwala zapytań podrzędnych w ograniczeniach kontroli. (Większość produktów go nie obsługuje, więc moje "odnoszą się do jednego wiersza" jest prawdziwe dla większości produktów SQL, ale nie dla standardu. Czy jest jeszcze jakaś różnica ? Tak, wciąż jest. Więcej niż jeden.

Pierwszy przypadek: TABLE MEN (ID: INTEGER) oraz TABLE WOMEN (ID:INTEGER). Teraz wyobraź sobie zasadę, że "żadna wartość ID nie może pojawić się zarówno w tabeli mężczyzn, jak i kobiet". To jedna zasada. Celem twierdzenia jest właśnie to, że projektant bazy danych określi tę pojedynczą regułę [i będzie z nią zrobiony], a DBMS będzie wiedział, jak sobie z tym poradzić [oczywiście efektywnie] i jak wyegzekwować tę regułę, bez względu na to, jaka konkretna aktualizacja zostanie wykonana w bazie danych. W przykładzie DBMS wiedziałby, że musi sprawdź tę regułę po wstawieniu do mężczyzn i po wstawieniu do kobiet, ale nie po usunięciu z mężczyzn/kobiet, lub wstaw do .

Ale DBMS nie są wystarczająco inteligentne, aby to wszystko zrobić. Co zatem należy zrobić ? Projektant bazy danych musi dodać dwa ograniczenia wyboru do swojej bazy danych, jeden do tabeli mężczyzn (sprawdzanie nowo wstawionych identyfikatorów mężczyzn względem tabeli kobiet) i jeden do tabeli kobiet (sprawdzanie odwrotnie). Jest twoja pierwsza różnica : jedna zasada, jedna Twierdzenie, dwa sprawdzanie ograniczeń. Ograniczenia kontroli są niższym poziomem abstrakcji niż twierdzenia, ponieważ wymagają od projektanta większego myślenia o (A) wszystkich rodzajach aktualizacji, które potencjalnie mogą spowodować naruszenie jego twierdzenia, oraz (b) jakie szczególne kontrole powinny być przeprowadzane dla każdego z konkretnych "rodzajów aktualizacji", które znalazł w (a). (Chociaż nie lubię robić" absolutnych "stwierdzeń o tym, co wciąż jest "czym", a co "jak", podsumowałbym ograniczenia te wymagają więcej myślenia" jak "(proceduralnego) przez projektanta baz danych, podczas gdy twierdzenia pozwalają projektantowi baz danych skupić się wyłącznie na" co " (deklaratywnym).)

Drugi przypadek ( choć nie jestem tego do końca pewien - więc weź z przymrużeniem oka): po prostu twoja Przeciętna zasada RI. Oczywiście są używane do określenia tego za pomocą klauzuli reference. Ale wyobraź sobie, że klauzula odniesienia nie była dostępna. Zasada " każde zamówienie musi być złożone przez znanego klienta" jest to tak naprawdę tylko reguła , a więc jedno twierdzenie. Jednak wszyscy wiemy, że taka zasada zawsze może zostać naruszona na dwa sposoby: wstawianie zamówienia (w tym przykładzie) i usuwanie klienta. Teraz, zgodnie z powyższym przykładem Mężczyzna / Kobieta, gdybyśmy chcieli zaimplementować tę pojedynczą regułę / twierdzenie za pomocą ograniczeń sprawdzania, musielibyśmy napisać ograniczenie sprawdzania, które sprawdza istnienie klienta po wstawieniu do porządku, ale jakie ograniczenie sprawdzania możemy napisać, które robi to, co jest potrzebne po usunięciu od klienta ? Po prostu nie są zaprojektowane do tego celu, o ile mogę powiedzieć. Jest druga różnica : ograniczenia wyboru są związane wyłącznie z wstawianiem, twierdzenia mogą definiować reguły, które będą również sprawdzane przy usuwaniu.

Trzeci przypadek: Imagine a table COMPOS (componentID:... procent: liczba całkowita), a zasada mówiąca, że "suma wszystkich procentów musi być zawsze równa 100". To jedna reguła, a twierdzenie jest zdolne do / align = "left" / Ale spróbuj i wyobraź sobie, jak można przejść o egzekwowanie takiej zasady z ograniczeń kontroli ... Jeśli masz poprawną tabelę z, powiedzmy, trzema niezerowymi wierszami, które sumują się do stu, jak zastosujesz jakąkolwiek zmianę do tej tabeli, która mogłaby przetrwać ograniczenie czeku ? Nie można usunąć ani zaktualizować(zmniejszyć) żadnego wiersza bez konieczności dodawania innych zastępujących wierszy lub aktualizacji pozostałych wierszy, które sumują się do tego samego procentu. Podobnie dla insert lub update (increase). Potrzebowałbyś odroczenia przynajmniej sprawdzanie ograniczeń, a potem co zamierzasz sprawdzić ? Jest trzecia różnica : ograniczenia sprawdzania są ukierunkowane na poszczególne wiersze, podczas gdy twierdzenia mogą również definiować / wyrażać reguły, które "obejmują" kilka wierszy (np. reguły dotyczące agregacji wierszy).

 10
Author: Erwin Smout,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-06 16:15:04

Twierdzenia nie modyfikują danych, sprawdzają tylko określone warunki

Wyzwalacze są potężniejsze, ponieważ mogą sprawdzać warunki, a także modyfikować dane

--------------------------------------------------------------------------------

Twierdzenia nie są powiązane z konkretnymi tabelami w bazie danych i nie są powiązane z konkretnymi zdarzeniami

Wyzwalacze są powiązane z konkretnymi tabelami i konkretnymi zdarzeniami

 5
Author: Mohamed Adel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-06 13:25:16

Ograniczenie bazy danych obejmuje warunek, który musi być spełniony, gdy baza danych jest aktualizowana. W SQL, jeśli warunek ograniczenia zostanie obliczony na false, to aktualizacja nie powiedzie się, dane pozostaną niezmienione, a DBMS wygeneruje błąd.

Zarówno CHECK jak i {[2] } są ograniczeniami baz danych zdefiniowanymi przez standardy SQL. Ważną różnicą jest to, że CHECK jest stosowana do określonej tabeli bazowej, podczas gdy {[2] } jest stosowana do całej bazy danych. Rozważmy ograniczenie, które ogranicza połączone wiersze w tabelach T1 i T2 W sumie 10 wierszy, np.

CHECK (10 >= (
              SELECT COUNT(*)
                FROM (
                      SELECT *
                        FROM T1
                      UNION
                      SELECT * 
                        FROM T2
                     ) AS Tn
             ))

Załóżmy, że tabele są puste. Jeśli zostanie to zastosowane tylko jako ASSERTION i użytkownik spróbuje wstawić 11 wierszy do T1, wtedy aktualizacja nie powiedzie się. To samo miałoby zastosowanie, gdyby ograniczenie było stosowane jako ograniczenie CHECK Tylko do T1. Jednak, jeśli ograniczenie zostanie zastosowane jako CHECK ograniczenie do T2 tylko ograniczenie powiedzie się, ponieważ polecenie targeting T1 nie powoduje ograniczeń stosowane do T1 do badania.

Zarówno an ASSERTION, jak i a CHECK mogą zostać odroczone (jeśli zadeklarowane jako DEFERRABLE), co pozwala na czasowe naruszenie warunku ograniczenia, ale tylko w ramach transakcji.

ASSERTION i CHECK ograniczenia związane z zapytaniami podrzędnymi są funkcjami poza podstawowym standardem SQL i żaden z głównych produktów SQL nie obsługuje tych funkcji. MS Access (niezupełnie przemysłowy produkt) obsługuje CHECK ograniczenia dotyczące zapytań podrzędnych, ale nie można ich odroczyć ograniczenia Plus testowanie ograniczeń jest zawsze wykonywane wiersz po wierszu, a praktyczne konsekwencje są takie, że funkcjonalność jest bardzo ograniczona.

W połączeniu z ograniczeniami CHECK, wyzwalacz jest stosowany do określonej tabeli. Dlatego wyzwalacz może być użyty do implementacji tej samej logiki co ograniczenie CHECK, ale nie ASSERTION. Wyzwalacz jest kodem proceduralnym i w przeciwieństwie do ograniczeń, użytkownik musi wziąć znacznie większą odpowiedzialność za problemy, takie jak wydajność i obsługa błędów. Najbardziej komercyjne produkty SQL obsługują wyzwalacze (wspomniany MS Access nie).

 1
Author: onedaywhen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-04 10:58:51

Wyrażenie powinno być prawdziwe dla trigger to fire, ale check będzie obliczany wszędzie tam, gdzie wyrażenie jest fałszywe.

 0
Author: Feri,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-18 08:26:29