• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Niedziałający trigger mysql

VPS Starter Arubacloud
0 głosów
527 wizyt
pytanie zadane 23 maja 2017 w SQL, bazy danych przez fanpajny Obywatel (1,610 p.)
DELIMITER $$
    CREATE TRIGGER zmiana_pkt 
	AFTER UPDATE ON wypozyczenia  
        FOR EACH ROW
				BEGIN
					IF(SELECT datediff(data_odd, data_wyp) FROM wypozyczenia)> 60
                                THEN
					UPDATE czytelnicy
					SET punkty = punkty-10;
				ELSE 
					UPDATE czytelnicy
					SET punkty = punkty+10;
            END IF;
        END $$
DELIMITER ;

Cześć, mam problem z niedziałającym triggerem. Wyskakuje mi błąd 1242, już go sprawdzałem, ale nie umiem tego naprawić. Wstawiam kod, i proszę o pomoc, o jakąkolwiek podpowiedź.

 Wstawiam też kod UPDATE który go wywołuje 

delimiter //
create procedure zwrot_ksiazki(in id int, data_odd data)
begin
	UPDATE wypozyczenia
	SET data_odd = data_odd
	WHERE id_wypozyczenia = id;
end//

call zwrot_ksiazki(3, "2017-06-01")//

Siedzę już nad tym ponad godzine, także każda pomoc się przyda.

Powiedzcie mi, co tu jest źle?

Ps. Przepraszam za chaotyczną wypowiedź.

komentarz 23 maja 2017 przez Chess Szeryf (76,710 p.)
Czy mógłbyś napisać, co konkretnie próbujesz osiągnąć?
komentarz 23 maja 2017 przez fanpajny Obywatel (1,610 p.)
Jeżeli użytkownik przetrzyma więcej niż 60 dni książkę to chce mu odjąć 10 punktów z rankingu (kolumny punkty) a jeżeli odda w terminie to chce mu dodać 10 punktów. W tabeli wypożyczenia mam 2 kolumny na datę. Jedna to jest data_wyp(wypożyczenia) a druga to data_odd(oddania). Date oddania wpisuje się w chwili zwrotu książki, czyli cały rekord jest wypełniony tylko data_odd jest pusta aż do oddania książki. I wtedy poleceniem update dodaje datę dodania(drugie okno z kodem).

1 odpowiedź

0 głosów
odpowiedź 24 maja 2017 przez Chess Szeryf (76,710 p.)
wybrane 25 maja 2017 przez fanpajny
 
Najlepsza

Jeśli chodzi o procedure, to napisałbym to mniej więcej tak:

create procedure zwrot_ksiazki(in param int,data_odd date)

UPDATE tbl_name SET column_table = data_odd
WHERE column_table = param;
 
call zwrot_ksiazki(3, "2017-06-01");

in id int, data_odd data

U siebie w kodzie napisałeś "data", a to oznacza "dane", bo datę się tak pisze: "date". Tak, więc to jest raczej błąd.

Następnie w tym wypadku begin i end są zbędne, ponieważ stosujemy tylko 1. średnik na końcu, gdyby średników byle kilka to użylibyśmy wtedy składni: begin ... end, aby móc połączyć kilka instrukcji w całość dzięki zmianie delimiter'a (separatora).

 

Musisz jeszcze trigger'a poprawić, aby nie zmieniał wartości wszystkich rekordów tylko wybranego ID. Zamień, więc to:

SET punkty = punkty-10; 

na coś takiego z klauzulą where:

SET punkty = punkty-10 where /*id*/ = NEW./* i tutaj musisz wstawic tę wartośc, którą podasz w procedure*/; 

Zapomniałem jeszcze dodać, że aby ci działały te instrukcje (trigger, procedure, czy inne) to musisz mieć odpowiednie uprawnienia do tego w bazie danych. Na użytkowniku root ma się chyba wszystkie uprawnienia, ale musisz je mieć też wszystkie (do testowania) ustawione na odpowiedniej bazie i tabeli. Tylko na czas testów weź przenieś te skrypty do bazy o najwyższych uprawnieniach bo być może w tym tkwi problem.

https://dev.mysql.com/doc/refman/5.7/en/show-grants.html

delimiter //
create trigger name_trigger
after update on tbl_1 for each row
begin
	if(select datediff(date1,date2) from tbl_1 /*where id=1*/)>50
		then
			update tbl_2 set tbl_column = 'white';
		else
			update tbl_2 set tbl_column = 'grey';
	end if;
end;
//

W tym kodzie powyższym usuń to: /*where id=1*/, bo zapewne nie chcesz tylko zmieniać rekordu z ID=1.

+-------+---------+------+-----+---------+----------------+
| Field | Type    | Null | Key | Default | Extra          |
+-------+---------+------+-----+---------+----------------+
| id    | int(11) | NO   | PRI | NULL    | auto_increment |
| ile   | int(11) | YES  |     | NULL    |                |
| date1 | date    | YES  |     | NULL    |                |
| date2 | date    | YES  |     | NULL    |                |
+-------+---------+------+-----+---------+----------------+

 

+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| id    | int(11)     | NO   | PRI | NULL    | auto_increment |
| kto   | varchar(20) | YES  |     | NULL    |                |
+-------+-------------+------+-----+---------+----------------+

komentarz 24 maja 2017 przez Chess Szeryf (76,710 p.)
edycja 25 maja 2017 przez Chess
delimiter //
create trigger name_trigger
after update on czosnek for each row
 
begin
 
	if(select datediff(date1,date2) from czosnek where id=@zmienna)>50
		then
			update czosnek2 set kto = 'white' where id=@zmienna;
		else
			update czosnek2 set kto = 'grey' where id=@zmienna;
	end if;
end;
//
delimiter ;
CREATE TABLE `czosnek` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `ile` int(11) DEFAULT NULL,
  `date1` date DEFAULT NULL,
  `date2` date DEFAULT NULL,
  PRIMARY KEY (`id`));
 CREATE TABLE `czosnek2` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `kto` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`id`));
select * from czosnek;
+----+------+------------+------------+
| id | ile  | date1      | date2      |
+----+------+------------+------------+
|  1 |   55 | 2015-05-05 | 2014-03-03 |
|  2 |   33 | 2016-04-04 | 2017-05-04 |
+----+------+------------+------------+
select * from czosnek2;
+----+-------+
| id | kto   |
+----+-------+
|  1 | white |
|  2 | grey  |
+----+-------+
set @zmienna=1;
call zwrot_ksiazki(@zmienna,'2018-09-03');
select * from czosnek2;

+----+------+
| id | kto  |
+----+------+
|  1 | grey |
|  2 | grey |
+----+------+
delimiter //
create procedure zwrot_ksiazki(in param1 int, param2 date)
begin
update czosnek set date1 = param2 where id = param1;
end;
//
delimiter ;

 

komentarz 24 maja 2017 przez fanpajny Obywatel (1,610 p.)
wykonałem tak jak ty tą pierwszą i dostałem błąd 1235
komentarz 24 maja 2017 przez fanpajny Obywatel (1,610 p.)
xampp mi się posypał bo nie moge dodać triggera żadnego
komentarz 24 maja 2017 przez Chess Szeryf (76,710 p.)
Wpisz polecenie: show triggers\G i usuń wszystkie tirgger'y, ew. utwórz nową bazę i tabelę. Zaloguj się na: mysql -u root i sprawdź jakie masz uprawnienia na root.

Podaj jakie masz błędy, spróbuj na innym urządzeniu, gdzie masz zainstalowany server np.: apache + mysql.
komentarz 25 maja 2017 przez fanpajny Obywatel (1,610 p.)
dobra poddaje się, mimo iż nie wyskakuje żaden błąd nie aktualizuje się ta tabela. Wielkie Dzięki za pomoc.

Podobne pytania

0 głosów
1 odpowiedź 1,055 wizyt
pytanie zadane 9 maja 2019 w SQL, bazy danych przez poldeeek Mądrala (5,980 p.)
0 głosów
1 odpowiedź 177 wizyt
pytanie zadane 16 czerwca 2015 w SQL, bazy danych przez CzlowiekSkrypt Nałogowiec (26,340 p.)
0 głosów
0 odpowiedzi 368 wizyt
pytanie zadane 9 listopada 2018 w SQL, bazy danych przez Dariusz Piechota Użytkownik (730 p.)

92,455 zapytań

141,263 odpowiedzi

319,099 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...