Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[SQL] TRIGGER nie działa.

Thomas1988 09 Wrz 2010 16:01 2237 5
  • #1 09 Wrz 2010 16:01
    Thomas1988
    Poziom 16  

    Muszę zrobić bazę danych w programie SQL Serwer. Dodatkowo muszę umieścić w niej wyzwalacze i tutaj mam problem. Proszę powiedźcie mi co mam źle z tym kodem:

    Code:

    Create TRIGGER Licznik
    ON dbo.Wyjazdy
    For insert
    As
    IF(select count(*) from WyjazdyStanLicznikaPrzed) > (select count(*) from WyjazdyStanLicznikaPo)
    BEGIN
    RAISERROR('Nie mozesz wprowadzic godziny wyjazdu pozniejszej niż godzina powrotu.',12,1)
    ROLLBACK TRANSACTION
    END


    Chcę aby nastąpiło porównanie dwóch wartości podczas wprowadzania: stanu licznika przed i po. Niestety wszystko się implementuje ale nie działa warunek niezależnie czy wprowadzę wartość mniejszą czy większą wyskakuje błąd. Niestety nie wiem dlaczego w treści błędu nie ma treści umieszczonej w wyzwalaczu.
    Proszę o pomoc

    0 5
  • #2 09 Wrz 2010 16:20
    arnoldziq
    Moderator Programowanie

    Coś nie "nie gra" tutaj :

    Code:
    select count(*) from WyjazdyStanLicznikaPrzed

    Chcesz sprawdzać wartość, czy ilość rekordów/pól ?
    Zamieść może tekst CREATE do tej tabeli.

    0
  • #3 09 Wrz 2010 16:28
    Thomas1988
    Poziom 16  

    Nie, chcę odczytać wartość z komórki we wprowadzonej kolumnie.
    Próbowałem tak:

    Code:

    Create TRIGGER Godzina
    ON dbo.Wyjazdy
    For Update
    AS
    IF(select WyjazdyStanLicznikaPrzed from dbo.Wyjazdy) > (select WyjazdyStanLicznikaPo from dbo.Wyjazdy)
    BEGIN
    RAISERROR('Nie mozesz wprowadzic godziny wyjazdu pozniejszej niż godzina powrotu.',12,1)
    ROLLBACK TRANSACTION
    END


    Niestety też się sypie :cry:

    0
  • #4 09 Wrz 2010 17:01
    arnoldziq
    Moderator Programowanie

    Gdyby to był firebird, to sugerowałbym coś takiego :

    Code:
    CREATE TRIGGER LICZNIK FOR WYJAZDY ACTIVE BEFORE INSERT POSITION 0 
    
    As
    BEGIN
     IF (new.STANLICZNIKAPRZED > new.STANLICZNIKAPO) THEN
       BEGIN
       [...]
       END
    END;

    0
  • Pomocny post
    #5 09 Wrz 2010 18:05
    marcinj12
    Poziom 40  

    Thomas1988 napisał:
    Nie, chcę odczytać wartość z komórki we wprowadzonej kolumnie.
    Próbowałem tak:
    Code:

    Create TRIGGER Godzina
    ON dbo.Wyjazdy
    For Update
    AS
    IF(select WyjazdyStanLicznikaPrzed from dbo.Wyjazdy) > (select WyjazdyStanLicznikaPo from dbo.Wyjazdy)
    BEGIN
    RAISERROR('Nie mozesz wprowadzic godziny wyjazdu pozniejszej niż godzina powrotu.',12,1)
    ROLLBACK TRANSACTION
    END


    Niestety też się sypie :cry:

    A jaki jest komunikat błędu?
    Ja bym obstawiał że nie można porównać dwóch wielowierszowych wartości:
    Code:
    IF(select WyjazdyStanLicznikaPrzed from dbo.Wyjazdy) > (select WyjazdyStanLicznikaPo from dbo.Wyjazdy)

    Spróbuj zamiast tego:
    Code:
    IF(select WyjazdyStanLicznikaPrzed from Inserted) > (select WyjazdyStanLicznikaPo from Inserted)

    Ewentualnie najpierw zadeklaruj zmienne, do nich przypisz wynik selecta i porównaj zmienne. Niestety nie mam sql servera zainstalowanego żeby to sprawdzić w praktyce...

    0
  • #6 09 Wrz 2010 18:49
    Thomas1988
    Poziom 16  

    marcinj12 Jesteś dla mnie geniuszem :D Coś mi nie pasowało w tym błędzie było coś odnoście value czyli by pasowało :D Z drugiej strony czytałem o tych trzech tabelkach tymczasowych Inserted, Deleted i Updated ale nie za bardzo wiedziałem o co w tym chodzi. Nawet pasuje bo jak zrobiłem sobie taką mała bazę z jednym wierszem to działało tak jak napisałem wcześniej a jak było więcej to już było za dużo wierszy i nie wiedział do jakiego się odwołać :D

    Jeszcze raz wielkie dzięki

    Hmmm no i mam już ostatni problem z wyzwalaczem

    Code:

    Create Trigger LiczbaAutobusow
    On Autobusy
    For Insert
    AS
    BEGIN
       DECLARE @Lautobusy int
       SET @Lautobusy=(SELECT COUNT(*) FROM Autobusy)
       SELECT 'Liczba autobusów wynosi: ' + str(@Lautobusy)
    END


    Chcę żeby po dodatniu autobusu nastąpiło wyświetlenie informacji o ilości autobusów. Niestety nie mogę zastosować Riserror do wyświetlenia informacji, a jeden z moich kolegów zastosował selecta niestety to nie działa.

    0