본문 바로가기

2018/06

(9)
[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] 명명 규칙 (Naming Convention) 공통 소문자를 사용합니다. 축약어의 사용을 최소화합니다. 축약어를 사용하는 경우에도 소문자를 사용합니다. 테이블 snake_case를 사용합니다. 복수형 명사를 사용합니다. many-to-many 관계에 사용하는 교차 테이블 적절한 명사가 없다면 두 테이블을 and로 연결합니다. movies 테이블과 genres 테이블 사이의 교차 테이블 ⇒ movies_and_genres 컬럼 snake_case를 사용합니다. 특별한 이유가 없다면 Auto Increment 속성의 대체키 (Surrogate Key)를 Primary Key로 사용하고, 컬럼의 이름은 “테이블 이름의 단수형” + “_id” 형식으로 합니다. movies 테이블의 PK 컬럼: movie_id 참조 관계에서 자식 테이블의 Foreign Ke..
[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] 가장 가까운 시설물 조회 - 두 좌표 (위도, 경도) 사이 거리 계산 보통 위도와 경도로 표현된 두 좌표 간의 거리를 계산할 때 Haversine 수식을 사용합니다. 하지만, 이 글에서는 MySQL 5.7.6 이상에서 사용할 수 있는 Spatial 함수로 문제를 풀어봅니다. 예제로 사용할 테이블은 아래와 같습니다. 12345678910CREATE TABLE library_in_seoul ( seq int UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY COMMENT '고유번호' , fclty_nm varchar(50) NOT NULL COMMENT '시설명' , gu_nm varchar(10) NOT NULL COMMENT '구명' , neadres_nm varchar(100) NOT NULL COMMENT '새주소명' , fclty_loc..
[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 ..