DELIMITER $$ SET @saved_sql_mode = @@sql_mode $$ SET @@sql_mode = 'NO_AUTO_VALUE_ON_ZERO' $$ CREATE PROCEDURE `sp_delete_category`( IN p_admin_user_id INT, IN p_actor_description VARCHAR(100), IN p_category_id TINYINT UNSIGNED, OUT p_result_message VARCHAR(255) ) COMMENT '카테고리 삭제 및 로그 기록 (사용 자산 확인 포함)' BEGIN DECLARE v_category_name VARCHAR(40); DECLARE v_asset_count INT DEFAULT 0; DECLARE v_now DATETIME DEFAULT NOW(); DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN GET DIAGNOSTICS CONDITION 1 @sqlstate = RETURNED_SQLSTATE, @errno = MYSQL_ERRNO, @text = MESSAGE_TEXT; ROLLBACK; SET p_result_message = CONCAT('DB 오류 (', @errno, '): ', @text); END; -- 입력값 검증 IF p_admin_user_id IS NULL AND p_actor_description IS NULL THEN SET p_result_message = '작업 주체 정보는 필수입니다.'; ELSE -- 삭제 대상 정보 조회 SELECT category_name INTO v_category_name FROM resource_category WHERE category_id = p_category_id; IF v_category_name IS NULL THEN SET p_result_message = CONCAT('삭제할 카테고리를 찾을 수 없습니다 (ID: ', p_category_id, ')'); ELSE -- 사용 중인 자산 확인 SELECT COUNT(*) INTO v_asset_count FROM resource_info WHERE category_id = p_category_id; IF v_asset_count > 0 THEN SET p_result_message = CONCAT('카테고리 "', v_category_name, '"를 사용하는 자산 ', v_asset_count, '개가 있어 삭제할 수 없습니다. 자산 카테고리를 먼저 변경하세요.'); ELSE -- 모든 검증 통과, 트랜잭션 시작 START TRANSACTION; INSERT INTO log_delete_category (log_date, admin_user_id, actor_description, category_id, category_name) VALUES (v_now, p_admin_user_id, p_actor_description, p_category_id, v_category_name); DELETE FROM resource_category WHERE category_id = p_category_id; COMMIT; SET p_result_message = CONCAT('카테고리 "', v_category_name, '" (ID: ', p_category_id, ') 삭제 완료.'); END IF; -- 자산 확인 IF 종료 END IF; -- 카테고리 존재 IF 종료 END IF; -- 입력값 검증 IF 종료 END $$ DELIMITER ;