Używam następującego skryptu SQL w moim IDE DBeaver, MySQL 8.0.21 Linux (Pojemnik Docker). Baza danych znajduje się w kodowania UTF8MB4 / UTF8MB4_General_CI.

DELIMITER //
CREATE OR REPLACE TRIGGER trg_line_total
BEFORE INSERT ON LINE
FOR EACH ROW
BEGIN
    SET NEW.LINE_TOTAL = NEW.LINE_UNITS * NEW.LINE_PRICE;
END //
DELIMITER ;

Wydaje się, że jest ważny SQL, ale zwraca następujący błąd, tak jakby nie czytał pełnej linii. Mogę usunąć zakładki, zwroty linii i czytanie więcej lub mniej znaków.

Error occurred during SQL script execution

Reason:
SQL Error [1064] [42000]: 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 'TRIGGER trg_line_total
BEFORE INSERT ON LINE
FOR EACH ROW
BEGIN
    SET NEW.LINE_TO' at line 1

Już wydaje mi się ten błąd raz dzisiaj, usuwając wszystko, co miałem w moim redaktorze i wpisując go od podstaw, jak gdyby była pewna niewidzialna linia zakończona, która zadziałała w górę lub zinterpretować. Spojrzałem w VIM i używałem polecenia :set list i widzę, że są regularnymi powrotem liniowych wagonów. Co to mogło być?

0
Aaron Chamberlain 18 październik 2020, 06:30

1 odpowiedź

Najlepsza odpowiedź

Niestety, nie ma ALTER TRIGGER lub CREATE OR REPLACE TRIGGER w Oracle MySQL. Obsługuje tylko {x2}} format.

Dla MariaDB, w wersji 10.1.4, dodano wsparcie CREATE OR REPLACE TRIGGER do ich opadania zamiennikiem MySQL.

Jeśli jesteś pewien, że wyzwalacz nie istnieje

Użyj CREATE zamiast CREATE OR REPLACE.

Jeśli modyfikujesz istniejący wyzwalacz

Sugerowałbym, że najlepszą praktyką jest zablokowanie stołu, w którym życie wyzwalacza, więc nie ma wpływu z wyzwalaczem. Upuszczenie i dodawanie wyzwalaczy, gdy stół jest zablokowany jest zablokowany.

mysql> LOCK TABLES t1 WRITE; -- the next prompt appears once you've obtained the lock
mysql> DROP TRIGGER t1_bi; 
mysql> DELIMITER $$
mysql> CREATE TRIGGER ti_bi BEFORE INSERT ON t1 FOR EACH ROW 
       BEGIN
       ...
       END $$
mysql> DELIMITER ;
mysql> UNLOCK TABLES;

Odniesienie: Modyfikuj istniejącą definicję wyzwalacza w MySQL.

1
Dark Knight 18 październik 2020, 03:49