source

MySQL에 저장된 프로시저에서 디버깅 정보 인쇄

goodcode 2023. 1. 19. 21:33
반응형

MySQL에 저장된 프로시저에서 디버깅 정보 인쇄

MySQL에서 디버깅 메시지를 stdout, temptable 또는 logfile로 인쇄할 수 있는 방법이 있습니까?예를 들어 다음과 같습니다.

  • printSQL Server에서
  • DBMS_OUTPUT.PUT_LINEOracle에서

옵션 1: 실행 시 stdout에 '댓글'을 인쇄하려면 이 절차를 수행합니다.

SELECT 'Comment';

옵션 2: 변수를 stdout에 인쇄하려면 다음 절차를 수행합니다.

declare myvar INT default 0;
SET myvar = 5;
SELECT concat('myvar is ', myvar);

이 인쇄물은myvar is 5시술을 실행할 때 사용할 수 있습니다.

옵션 3, 텍스트 열 하나가 포함된 표 만들기:tmptable, 및 메시지를 푸시합니다.

declare myvar INT default 0;
SET myvar = 5;
insert into tmptable select concat('myvar is ', myvar);

위의 내용을 스토어드 프로시저에 넣을 수 있기 때문에, 다음과 같이 기입하면 됩니다.

CALL log(concat('the value is', myvar));

그러면 키 입력을 몇 번 줄일 수 있습니다.

옵션 4, 파일에 메시지 기록

select "penguin" as log into outfile '/tmp/result.txt';

이 명령어에는 매우 엄격한 제한이 있습니다.'다른' 그룹에 작성 및 쓰기 권한을 부여하는 디스크의 영역에만 out 파일을 쓸 수 있습니다./tmp 디렉토리에 저장하면 됩니다.

또한 out 파일을 쓴 후에는 덮어쓸 수 없습니다.이는 크래커에 SQL이 삽입되어 MySQL에서 임의의 명령어를 실행할 수 있다는 이유만으로 크래커가 사용자의 웹 사이트를 루팅하는 것을 방지하기 위한 것입니다.

인쇄의 빠른 방법은 다음과 같습니다.

select '** Place your mesage here' AS '** DEBUG:';

디버깅 방법은 다음과 같습니다.

CREATE PROCEDURE procedure_name() 
BEGIN
    DECLARE EXIT HANDLER FOR SQLEXCEPTION
    BEGIN
        SHOW ERRORS;  --this is the only one which you need
        ROLLBACK;   
    END; 
    START TRANSACTION;
        --query 1
        --query 2
        --query 3
    COMMIT;
END 

쿼리 1, 2 또는 3이 오류를 발생시키면 HANDER가 SQLEXCEPTION을 포착하고 SHOW ERRORESS가 오류를 표시합니다.주의: SHOW ERRORS는 핸들러의 첫 번째 문이어야 합니다.

보통 로그 테이블에 기록하기 위해 저장 프로시저를 사용하여 로그 테이블을 만듭니다.개발 중인 절차에서 필요에 따라 로깅 절차를 호출합니다.

이 질문에 대한 다른 게시물을 보면, 몇 가지 대안이 있긴 하지만 일반적인 관행처럼 보입니다.

회피책 중 하나는 다른 구를 사용하지 않고 select를 사용하는 것입니다.

http://lists.mysql.com/mysql/197901

언급URL : https://stackoverflow.com/questions/3314771/print-debugging-info-from-stored-procedure-in-mysql

반응형