Wyświetlanie błędu poprzez wyzwalacz

0

Witam, chciałbym żeby trigger sprawdzał, czy ID nowo wstawionego obiektu do bazy nie pokrywa się już z istniejącym i jeśli tak, to wypisywał błąd. Wymyśliłem coś takiego, ale niestety nie działa. Ktoś zna rozwiązanie problemu?
DELIMITER $$

CREATE TRIGGER sprawdz BEFORE INSERT ON tabela
FOR EACH ROW BEGIN
   IF (old.ID_obiektu = new.ID_obiektu ) THEN

print "error";
END$$

DELIMITER ;

0

Ktoś zaproponuje jakieś rozwiązanie?

0

a nie prościej utworzyć unikalny indeks na tym polu ?
przy rozwiązaniu z triggerem i dużej tabeli to i tak pasowało by mieć taki taki indeks na tym polu aby trigger nie spowalniał insertu

0

Ogólnie to po prostu zależy mi na tym, żeby stworzyć kilka przykładowych triggerów w mojej bazie. Nie mam jednak pojęcia gdzie robię błąd. Weźmy chociażby inny przykład, w którym chciałbym, żeby maksymalnie można było w tabeli umieścić 13 rekordów. Podczas wrzucania 14 by wyskakiwał błąd i jego opis. Próbuję w ten sposób:

DELIMITER$$
CREATE TRIGGER wyzwalacz
BEFORE UPDATE ON tabela
FOR EACH ROW
BEGIN
IF ((SELECT COUNT(*) FROM tabela) > 13) THEN
print 'Możesz dołączyć do tablicy jedynie 13 danych'
END IF;
END$$

0

nie wiem gdzie popełniasz błąd bo napisanie że "nie działa" to za mało , ale z tego co widzę to nie bardzo rozumiesz jak i kiedy wyzwalane są triggery
a. w triggerze "before instert" wartość "old.ID_obiektu" zawsze będzie null
b. jeśli chcesz kontrolować liczbę wierszy w tabeli to nie zrobisz tego w triggerze "before update" tylko "before insert"

0

a. W takim razie w jaki sposób można to zrobić inaczej?
b. Oczywiście "before insert", nie mam pojęcia czemu wpisałem "update", jednak nadal nie działa.

0

jak insert ma się nie powieść to trzeba błędem rzucić a nie zrobić print

0

nie znam dobrze mysql ale pisząc z palca to tak bym widział tego triggera

CREATE TRIGGER wyzwalacz
BEFORE insert  ON tabela
    IF ((SELECT COUNT(*) FROM tabela) > 13) THEN
       print 'Możesz dołączyć do tablicy jedynie 13 danych'
    END IF;
END$$
0

a. W takim razie w jaki sposób można to zrobić inaczej?

użyj odpowiedniego "selecta"

0

b. Dalej nie działa, próbowałem już chyba wszystkiego. Oto błąd - #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IF ((SELECT COUNT(*) FROM tabela) > 13) THEN
print 'Możesz dołączy' at line 3

0

masz jakiś błąd w składni triggera

0

Wiem, ale pół dnia próbuję dojść gdzie.

0

bez pokazania kodu sprawiającego problem nikt nie wywróży gdzie masz błąd

0

CREATE TRIGGER wyzwalacz
BEFORE INSERT ON zawodnik
IF ((SELECT COUNT(*) FROM zawodnik) > '13') THEN
print 'Możesz dołączyć do tablicy jedynie 13 danych'
END IF;
END$$

1

Użyj SIGNAL SQLSTATE 45000 jak tu

0

Coś takiego?

CREATE TRIGGER wyzwalacz
BEFORE INSERT ON zawodnik
IF ((SELECT COUNT(*) FROM zawodnik) > '13') THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'An error occurred';
END IF;
END$$

0

Gdzieś FOR EACH ROW zgubiłeś...

0

Coś takiego?

DELIMITER $$
CREATE TRIGGER wyzwalacz
BEFORE INSERT ON zawodnik
FOR EACH ROW
BEGIN
IF ((SELECT COUNT(*) FROM zawodnik) > '13') THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'An error occurred';
END IF;
END$$

0

Dobra, to nie wyrzuciło błędu:

DELIMITER //
CREATE TRIGGER wyzwalacz
BEFORE INSERT ON zawodnik
FOR EACH ROW
BEGIN
IF ((SELECT COUNT(*) FROM zawodnik) > 13) THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'An error occurred';
END IF;
END

Teraz tylko przetestuje, czy będzie śmigało przy dodawaniu zawodnika, jeśli jest ich już 13.

0

I mam ostatnie pytanie jeszcze, czy istnieje możliwość wybrania SELECTEM (ewentualnie jakiś inny sposób) zawodników w ten sposób, abym nie musiał sprawdzać każdej drużyny osobno wpisując jej ID w celu sprawdzenia liczby graczy należących do niej - (SELECT COUNT(*) FROM zawodnik WHERE ID_druzyna=20) Tylko żeby trigger sprawdzał drużyny wszystkich zawodników i nie dopuścił, aby było więcej niż 13 z tą samą?

0

select z group by i having

0

Wymyśliłem coś takiego, jednak nie wiem, czy jest poprawne?

CREATE TRIGGER wyzwalacz BEFORE INSERT ON zawodnik
FOR EACH ROW BEGIN
IF ((select count(ID_druzyna) c from zawodnik
group by ID_druzyna having c >1) > 13) THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Błąd';
END IF;
END

0

Niestety nie mogłem edytować, więc wrzucam tutaj w znacznikach.

CREATE TRIGGER wyzwalacz BEFORE INSERT ON zawodnik
 FOR EACH ROW BEGIN
        IF ((select count(ID_druzyna) c from zawodnik
group by ID_druzyna having c >1) > 13) THEN
           SIGNAL SQLSTATE '45000'
          SET MESSAGE_TEXT = 'Błąd';
            END IF;
END
0

nie znam dobrze MYSql, dla bazy Firebird trigger tak by wyglądął

CREATE TRIGGER WYZWALACZ FOR ZAWODNIK 
ACTIVE BEFORE INSERT OR UPDATE 
POSITION 0
AS
begin
        IF ((select count(id_druzyna)  from zawodnik where id_druzyna=new.id_druzyna)>=13) then 
        begin
             exception ERROR1;
        END
END

"Tylko żeby trigger sprawdzał drużyny wszystkich zawodników i nie dopuścił, aby było więcej niż 13 z tą samą?"
a w jakim celu sprawdzać WSZYSTKIE drużyny ?? wystarczy sprawdzić tylko tę jedną do której ma być dopisany zawodnik

jeśli chodzi o Twój trigger to aby wykonać jakąkolwiek sensowną weryfikację nowych danych to musisz się posłużyć zmienną "new.id_druzyna"

0

Masz rację, niepotrzebnie chciałem sprawdzać wszystkich. W mysql stworzyłem coś takiego:

CREATE TRIGGER `wyzwalacz` BEFORE INSERT ON `zawodnik`
 FOR EACH ROW BEGIN
        IF ((SELECT COUNT(ID_druzyna)  FROM zawodnik WHERE ID_druzyna=NEW.ID_druzyna)>13) THEN
           SIGNAL SQLSTATE '45000'
          SET MESSAGE_TEXT = 'Przekroczono limit graczy w jednej drużynie';
            END IF;
END

Niby nie wywala błędu, ale będę wdzięczny jeśli ktoś potwierdzi poprawność powyższego wyzwalacza.

0

Ktoś może potwierdzić?

0

Wybaczcie za odświeżenie, ale czy ktoś może potwierdzić? Bardzo mi na tym zależy.

1

zrób kilka testów i będziesz widział czy działa poprawnie
jeśli maksymalna liczba zawodników w drużynie wynosi 13 to zmień warunek z '>13' na '>=13'
sam trigger podpiął bym również pod zdarzenie

BEFORE UPDATE
0

Zastanawia mnie czemu radzisz podpiąć trigger jeszcze pod

BEFORE UPDATE

Przecież to powoduje jedynie zmianę zawartości, liczba graczy nie wzrośnie. Jedynym powodem wydaje mi się możliwość zmiany id_drużyny piłkarza i powstanie przykładowo 14 zawodników z tą samą. Czy to miałeś na myśli sugerując takie rozwiązanie?

0

@Colomboaf
dokładnie to miałem na myśli

1 użytkowników online, w tym zalogowanych: 0, gości: 1