DELIMITER $$ SET @saved_sql_mode = @@sql_mode $$ SET @@sql_mode = 'NO_AUTO_VALUE_ON_ZERO' $$ CREATE PROCEDURE `sp_update_user`( IN p_admin_user_id INT, IN p_actor_description VARCHAR(100), IN p_user_id BIGINT, IN p_display_name VARCHAR(100), -- 파라미터명 변경 IN p_account_name VARCHAR(255), -- 파라미터명 변경 IN p_group_id BIGINT, OUT p_result_message VARCHAR(255) ) COMMENT '사용자 정보 수정 및 로그 기록' BEGIN DECLARE v_old_display_name VARCHAR(100); DECLARE v_old_account_name VARCHAR(255); DECLARE v_old_group_id BIGINT; DECLARE v_existing_user_id BIGINT DEFAULT NULL; 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 = '작업 주체 정보는 필수입니다.'; -- RETURN; -- ★ 제거 ELSEIF p_account_name IS NULL OR p_account_name = '' THEN SET p_result_message = '계정 이름은 필수입니다.'; -- RETURN; -- ★ 제거 ELSE -- 기존 정보 조회 및 존재 확인 SELECT display_name, account_name, group_id INTO v_old_display_name, v_old_account_name, v_old_group_id FROM user_info WHERE user_id = p_user_id; IF v_old_account_name IS NULL THEN SET p_result_message = CONCAT('수정할 사용자를 찾을 수 없습니다 (ID: ', p_user_id, ')'); -- RETURN; -- ★ 제거 ELSE -- 계정 이름 중복 검사 (자기 자신 제외) SELECT user_id INTO v_existing_user_id FROM user_info WHERE LOWER(account_name) = LOWER(p_account_name) AND user_id != p_user_id LIMIT 1; IF v_existing_user_id IS NOT NULL THEN SET p_result_message = CONCAT('이미 다른 사용자가 사용 중인 계정 이름입니다: ', p_account_name); -- RETURN; -- ★ 제거 ELSE -- 모든 검증 통과, 트랜잭션 시작 START TRANSACTION; UPDATE user_info SET display_name = p_display_name, account_name = p_account_name, group_id = p_group_id WHERE user_id = p_user_id; INSERT INTO log_update_user (log_date, admin_user_id, actor_description, user_id, old_display_name, old_account_name, old_group_id, new_display_name, new_account_name, new_group_id) VALUES (v_now, p_admin_user_id, p_actor_description, p_user_id, v_old_display_name, v_old_account_name, v_old_group_id, p_display_name, p_account_name, p_group_id); COMMIT; SET p_result_message = CONCAT('사용자 (ID: ', p_user_id, ') 정보 수정 완료.'); END IF; -- 계정 중복 IF 종료 END IF; -- 사용자 존재 IF 종료 END IF; -- 입력값 검증 IF 종료 END $$ DELIMITER ;