programing

트리거를 저장, 변경 또는 삭제할 경우 MySql이 전체 프로그램을 중지합니다.

javamemo 2023. 8. 23. 21:33
반응형

트리거를 저장, 변경 또는 삭제할 경우 MySql이 전체 프로그램을 중지합니다.

나는 일반적으로 SQL에 익숙하지 않아서, 나는 배우고, 나는 전에 많은 문제를 겪었고, 그래서 코드가 충분히 깨끗하지 않습니다.

여기 제 트리거가 있습니다. 모든 제품의 업데이트입니다. html로 테이블을 생성합니다.만약 당신이 그것을 할 수 있는 다른 방법을 생각해 낼 수 있다면, 나는 그것을 배우기 위해 그것을 알고 싶다, 처음에 나는 다른 커서 안에 커서를 만들려고 했지만 그것은 나에게 많은 오류를 주었다, 어떤 사람은 업데이트 전에 트리거를 해서 모든 제품을 살펴보고 내가 필요로 하는 검사만 하도록 추천했다, 모든 것에 감사합니다 <3.

(내 영어도 미안해, 네가 나를 이해할 수 있기를 바래)

BEGIN

        declare contentCursor text;
        declare tableContent text default "<table width=""250"" cellpadding=""0"" cellspacing=""0""><tbody>";
        declare alegenos varchar(30);
        declare contieneAlergenos int;
        declare trazasCerca int;
        declare siCerca text default "";

        DECLARE ch_done INT DEFAULT 0;

    DECLARE alegenosCursor cursor for select Nombre from ps_ets_ept_alegenos;

        

        DECLARE CONTINUE HANDLER FOR NOT FOUND SET ch_done = 1;


        -- Guardo el contenido de la descr (En los primeros 150 productos era una tabla que convertir en otra)
    -- SELECT contentCursor;
        -- Generar tabla correctamente apartir de la tabla equivocaeda
            -- Recorro una tabla con la lista de alergenos


            BLOCK2: begin
    open alegenosCursor;
                bucleAlergenos:LOOP fetch alegenosCursor into alegenos;


                IF(ch_done = 1) THEN 
                        -- handle the No data error!
                    set ch_done=1;
                END IF;
                    -- Veo si el alergeno actual lo tiene la tabla incorrecta
                    SELECT LOCATE(alegenos, old.content) into contieneAlergenos;
                    if contieneAlergenos>0 then 
                        -- En el caso de que este busco si tiene un Trazas o un Si, si me coloco al final de la palabra del alergeno, sumandole los 44 Es donde empieza el Si o el Trazas, el siete es por el largo de trazas + 1 espacio
                        SELECT LOCATE("Trazas",SUBSTR(old.content,contieneAlergenos+length(alegenos)+44,7)) INTO trazasCerca;
                        -- Si trazasCerca es mayor que 0 el contenido de ese alergeno son Trazas, asi que se lo asigno a la variable siCerca, en caso de que sea 0 le asigno un Si
                        if trazasCerca>0 then SET siCerca="Trazas";
                        else SET siCerca="Si";
                        end if;
                    
                        -- Concadeno el Si o el Trazas
                        SELECT CONCAT(tableContent,"<tr><td width=""60%"" align=""left""><strong>", alegenos, "</strong></td><td width=""40%"" align=""left""> ", siCerca, "</td></tr>") INTO tableContent; -- devuelve Alergeno y una string si tiene Trazas o si, hace falta un locate de Si o Trazas y generar la tabla
                    
                    -- En caso de no encontrar el alergeno, le meto el campo de la tabla con el alergeno y un no
                    else SELECT CONCAT(tableContent,"<tr><td width=""60%"" align=""left""><strong>", alegenos, "</strong></td><td width=""40%"" align=""left"">No</td></tr>")INTO tableContent ; -- tienes el alergeno que no está en la tabla, aqui generare la td de el alergeno con un No
                    end if;
                            
                        -- reinicio las variables que suelo concadenar
                        SET siCerca="";
                        SET trazasCerca=0;  
                        SET contieneAlergenos=0;

                         -- select tableContent as Dentro;
                END LOOP bucleAlergenos;
                    select CONCAT(tableContent,"</tbody></table>")INTO tableContent;
                    insert into pruebaTablas VALUES (tableContent);
                                                                                             set tableContent="";
                    close alegenosCursor;
            END BLOCK2; 




END

언급URL : https://stackoverflow.com/questions/72992579/mysql-freezes-the-whole-program-if-i-save-alter-or-try-to-delete-a-trigger

반응형