62 lines
2.5 KiB
MySQL
62 lines
2.5 KiB
MySQL
|
|
DELIMITER $$
|
|||
|
|
|
|||
|
|
SET @saved_sql_mode = @@sql_mode
|
|||
|
|
$$
|
|||
|
|
SET @@sql_mode = 'NO_AUTO_VALUE_ON_ZERO'
|
|||
|
|
$$
|
|||
|
|
CREATE PROCEDURE `sp_delete_user`(
|
|||
|
|
IN p_admin_user_id INT,
|
|||
|
|
IN p_actor_description VARCHAR(100),
|
|||
|
|
IN p_user_id BIGINT,
|
|||
|
|
OUT p_result_message VARCHAR(255)
|
|||
|
|
)
|
|||
|
|
COMMENT '사용자 삭제 및 로그 기록 (할당 자산 확인 포함)'
|
|||
|
|
BEGIN
|
|||
|
|
DECLARE v_display_name VARCHAR(100);
|
|||
|
|
DECLARE v_account_name VARCHAR(255);
|
|||
|
|
DECLARE v_group_id BIGINT;
|
|||
|
|
DECLARE v_assigned_assets_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 = '작업 주체 정보는 필수입니다.';
|
|||
|
|
-- RETURN; -- ★ 제거
|
|||
|
|
ELSE
|
|||
|
|
-- 삭제 대상 정보 조회 및 존재 확인
|
|||
|
|
SELECT display_name, account_name, group_id INTO v_display_name, v_account_name, v_group_id
|
|||
|
|
FROM user_info WHERE user_id = p_user_id;
|
|||
|
|
IF v_account_name IS NULL THEN
|
|||
|
|
SET p_result_message = CONCAT('삭제할 사용자를 찾을 수 없습니다 (ID: ', p_user_id, ')');
|
|||
|
|
-- RETURN; -- ★ 제거
|
|||
|
|
ELSE
|
|||
|
|
-- 할당된 자산 확인
|
|||
|
|
SELECT COUNT(*) INTO v_assigned_assets_count FROM resource_info WHERE user_id = p_user_id;
|
|||
|
|
IF v_assigned_assets_count > 0 THEN
|
|||
|
|
SET p_result_message = CONCAT('사용자 "', IFNULL(v_display_name, v_account_name), '"에게 할당된 자산 ', v_assigned_assets_count, '개가 있어 삭제할 수 없습니다. 자산 할당을 먼저 해제하세요.');
|
|||
|
|
-- RETURN; -- ★ 제거
|
|||
|
|
ELSE
|
|||
|
|
-- 모든 검증 통과, 트랜잭션 시작
|
|||
|
|
START TRANSACTION;
|
|||
|
|
INSERT INTO log_delete_user (log_date, admin_user_id, actor_description, user_id,
|
|||
|
|
display_name, account_name, group_id)
|
|||
|
|
VALUES (v_now, p_admin_user_id, p_actor_description, p_user_id,
|
|||
|
|
v_display_name, v_account_name, v_group_id);
|
|||
|
|
|
|||
|
|
DELETE FROM user_info WHERE user_id = p_user_id;
|
|||
|
|
COMMIT;
|
|||
|
|
SET p_result_message = CONCAT('사용자 "', IFNULL(v_display_name, v_account_name), '" (ID: ', p_user_id, ') 삭제 완료.');
|
|||
|
|
END IF; -- 자산 확인 IF 종료
|
|||
|
|
END IF; -- 사용자 존재 IF 종료
|
|||
|
|
END IF; -- 입력값 검증 IF 종료
|
|||
|
|
|
|||
|
|
END
|
|||
|
|
$$
|
|||
|
|
|
|||
|
|
DELIMITER ;
|