본문 바로가기

MySQL/Stored Procedure

(8)
[MySQL / Stored Procedure] 에러 핸들링 (5) SIGNAL [MySQL / Stored Procedure] 에러 핸들링 시리즈(1) DECLARE ... HANDLER(2) Error Logging(3) CONSTRAINT (上)(4) CONSTRAINT (下)(5) SIGNAL 1편 ~ 4편까지 SQLEXCEPTION 이 발생했을 때, 에러 또는 예외에 대한 SP 리턴 값을 지정하고 필요에 따라 로깅하는 방법을 소개해 드렸습니다. 이 글에서는 SQLEXCEPTION 이 발생하지 않는 예외 상황에서도, DECLARE ... HANDLER 를 사용하여 SP 리턴 값을 지정하고 로깅하는 방법을 소개합니다. 어떤 상황이 SQLEXCEPTION 이 없지만 예외로 처리해야하는 상황일까요? 대표적인 예로, 수정하거나 삭제하려는 Row 가 존재하지 않는 경우가 있습니다. 참..
[MySQL / Stored Procedure] 에러 핸들링 (4) CONSTRAINT (下) [MySQL / Stored Procedure] 에러 핸들링 시리즈(1) DECLARE ... HANDLER(2) Error Logging(3) CONSTRAINT (上)(4) CONSTRAINT (下)(5) SIGNAL학생이 강의를 수강하는 모델 테스트 DB와 테이블을 아래와 같이 생성합니다.123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566CREATE DATABASE exception_test DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_general_ci; USE exception..
[MySQL / Stored Procedure] 에러 핸들링 (3) CONSTRAINT (上) [MySQL / Stored Procedure] 에러 핸들링 시리즈(1) DECLARE ... HANDLER(2) Error Logging(3) CONSTRAINT (上)(4) CONSTRAINT (下)(5) SIGNAL 어떻게 에러 핸들링에 Constraint를 활용할 수 있나.. (예 : 학생이 강의를 수강하는 모델) 1. 학생이 강의를 수강 학생이 강의를 수강하려면 attending 테이블에 row를 한 개 insert 해 주면 됩니다. 이 때, 이미 수강한 과목인지.. 그리고 학생과 강의가 실제로 존재하는지 확인할 필요가 있습니다.어떻게 할까요? 그냥 `attending` 테이블에 insert 하면 됩니다. 이미 수강한 과목이라면 `attending` 테이블의 Primary Key 제약 조건에 위..
[MySQL / Stored Procedure] 에러 핸들링 (2) Error Logging [MySQL / Stored Procedure] 에러 핸들링 시리즈(1) DECLARE ... HANDLER(2) Error Logging(3) CONSTRAINT (上)(4) CONSTRAINT (下)(5) SIGNAL 아래와 같은 테이블을 만들고, Stored Procedure 실행 중에 SQL Exception 이 발생했을 때, 디버깅에 필요한 단서를 저장합니다.12345678910111213CREATE TABLE `error_log` ( `error_log_id` SMALLINT(5) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '에러 로그 ID', `proc_name` VARCHAR(100) NOT NULL COMMENT '프로시저 이름', `proc_step` TI..
[MySQL / Stored Procedure] 에러 핸들링 (1) DECLARE ... HANDLER [MySQL / Stored Procedure] 에러 핸들링 시리즈 (1) DECLARE ... HANDLER(2) Error Logging(3) CONSTRAINT (上)(4) CONSTRAINT (下)(5) SIGNAL Stored Procedure가 실행되는 도중에 발생하는 에러는 DECLARE ... HANDLER 구문을 사용해서 처리할 수 있습니다. MS-SQL의 TRY ... CATCH 구문과 비교했을 때 아무런 부족함이 없다는 점... 칭찬해~ 기본 문법12345678910111213141516DECLARE handler_action HANDLER FOR condition_value [, condition_value] ... statement handler_action: CONTINUE | ..
[MySQL/Stored Procedure] 접근 제어 설정 (SQL SECURITY) MySQL의 Stored Procedure는, 실행한 user의 privilege 또는 Stored Procedure를 생성한 user의 privilege에 영향을 받습니다. 물론 개발자가 선택할 수 있는데, SQL SECURITY 특성 값에 따라 좌우되죠. SQL SECURITY DEFINER : 생성한 user의 권한을 따름 SQL SECURITY INVOKER : 실행한 user의 권한을 따름 SP에서 이 구문을 생략하면 DEFINER가 기본값이기 때문에 SP를 생성할 때 사용한 user의 권한으로 SP가 실행됩니다. MS-SQL에서는 SP를 호출한 계정의 권한이 사용되는 것과 대조를 이루는데요.아마도 EXECUTE 권한의 차이에서 비롯된 것 같습니다. MS-SQL에서는 SP에 대한 EXECUTE ..
[MySQL/Stored Procedure] 명명 규칙 Stored Procedure 명명 규칙접두어 usp_ 를 사용한다.SP의 이름을 구성하는 각각의 단어를 underscore 로 연결하는 snake case 를 사용한다.특정 테이블에 대한 단순 CRUD 작업인 경우, 각각 아래와 같은 이름 규칙을 사용한다.CREATEusp_add_{테이블 이름}RETRIEVEusp_get_{테이블 이름} / 단일 행을 반환하는 경우usp_get_list_{테이블 이름} / 여러 행을 반환하는 경우UPDATEusp_mod_{테이블 이름}DELETEusp_del_{테이블 이름}SP가 특정 비즈니스 로직을 처리하는 경우, 적절한 동사와 명사의 조합을 사용한다.(예) usp_validate_applicant, usp_check_brand_user, ...local variab..
MySQL의 Stored Procedure 특성 MS-SQL을 오래 다뤄 본 사람이라면 Stored Procedure는 옵션이 아닌 필수라는 점에 동의할 겁니다. 하지만 MySQL에서 Stored Procedure를 사용하는 것은, MS-SQL에서 만큼 보편적이지 않습니다. 여러가지 이유가 있겠지만 성능 이슈도 한 몫한다고 볼 수 있는데요. 아래 글을 읽어보니 어느 정도 납득이 되더군요. http://www.joinfu.com/2010/05/mysql-stored-procedures-aint-all-that/ 위 글은 MySQL 5.5 기준으로 씌여졌지만, 5.6과 5.7에서도 별 다르지 않습니다. 요약에 앞 서, MS-SQL 개발자들이 SP를 선호하고 실제로 SP의 사용이 권장되는 이유가 무엇일까요? 데이터를 처리하는 하나의 추상화된 레이어를 제공한..