114 lines
5.1 KiB
SQL
114 lines
5.1 KiB
SQL
DELIMITER $$
|
|
|
|
CREATE PROCEDURE `sp_get_resource_audit_logs`(
|
|
IN p_search_term VARCHAR(100), -- 검색어 (NULL 가능)
|
|
IN p_start_date DATE, -- 시작일 (NULL 가능)
|
|
IN p_end_date DATE, -- 종료일 (NULL 가능)
|
|
IN p_page_num INT, -- 페이지 번호 (기본값 1)
|
|
IN p_page_size INT -- 페이지 크기 (기본값 20)
|
|
)
|
|
COMMENT '자산 관련 감사 로그 통합 조회 (검색, 기간, 페이징)'
|
|
BEGIN
|
|
DECLARE v_offset INT;
|
|
SET @v_search_like = NULL; -- 검색어용 세션 변수
|
|
|
|
-- 입력값 기본 처리
|
|
IF p_search_term IS NOT NULL AND p_search_term != '' THEN
|
|
SET @v_search_like = CONCAT('%', p_search_term, '%');
|
|
END IF;
|
|
IF p_page_num IS NULL OR p_page_num < 1 THEN SET p_page_num = 1; END IF;
|
|
IF p_page_size IS NULL OR p_page_size < 1 THEN SET p_page_size = 20; END IF;
|
|
SET v_offset = (p_page_num - 1) * p_page_size;
|
|
|
|
-- 날짜 범위 조건 문자열 동적 생성
|
|
SET @v_date_condition = '';
|
|
IF p_start_date IS NOT NULL THEN
|
|
SET @v_date_condition = CONCAT('AND l.log_date >= DATE(''', p_start_date, ''') '); -- DATE() 사용하여 시간 무시
|
|
END IF;
|
|
IF p_end_date IS NOT NULL THEN
|
|
-- 종료일 다음 날 0시 미만으로 포함
|
|
SET @v_date_condition = CONCAT(@v_date_condition, 'AND l.log_date < DATE_ADD(DATE(''', p_end_date, '''), INTERVAL 1 DAY) ');
|
|
END IF;
|
|
|
|
-- 검색 조건 문자열 동적 생성 (통합 결과셋 대상)
|
|
SET @v_search_condition = '';
|
|
IF @v_search_like IS NOT NULL THEN
|
|
SET @v_search_condition = CONCAT(
|
|
'WHERE (',
|
|
' actor_info LIKE @v_search_like ', -- 작업자 정보
|
|
' OR CAST(target_id AS CHAR) LIKE @v_search_like ', -- 대상 ID (문자열로 변환하여 검색)
|
|
' OR target_info_at_log LIKE @v_search_like ', -- 대상 정보 (이름 등)
|
|
' OR serial_num LIKE @v_search_like ', -- 시리얼 번호
|
|
' OR details LIKE @v_search_like', -- 상세 내용
|
|
') '
|
|
);
|
|
ELSE
|
|
SET @v_search_condition = 'WHERE 1=1 '; -- 검색어 없으면 모든 결과
|
|
END IF;
|
|
|
|
-- 최종 동적 SQL 구성
|
|
-- 1. 각 로그 테이블에서 기간 필터링 적용하여 UNION ALL
|
|
-- 2. UNION ALL 결과셋에 대해 검색어 필터링 적용
|
|
-- 3. 정렬, 페이징 적용
|
|
SET @v_sql = CONCAT('
|
|
SELECT SQL_CALC_FOUND_ROWS * FROM (
|
|
-- 자산 추가 로그
|
|
SELECT
|
|
\'ADD\' AS log_type, l.log_id, l.log_date,
|
|
COALESCE(au.username, l.actor_description, \'System/Unknown\') AS actor_info,
|
|
l.resource_id AS target_id,
|
|
l.resource_name AS target_info_at_log,
|
|
l.serial_num,
|
|
CONCAT(\'자산 추가: \', l.resource_name, \' (SN:\', IFNULL(l.serial_num, \'-\'), \')\') AS details
|
|
FROM log_add_resource l LEFT JOIN auth_user au ON l.admin_user_id = au.id
|
|
WHERE 1=1 ', @v_date_condition, '
|
|
|
|
UNION ALL
|
|
|
|
-- 자산 수정 로그
|
|
SELECT
|
|
\'UPDATE\' AS log_type, l.log_id, l.log_date,
|
|
COALESCE(au.username, l.actor_description, \'System/Unknown\') AS actor_info,
|
|
l.resource_id AS target_id,
|
|
l.resource_name AS target_info_at_log, -- 변경 후 이름
|
|
l.serial_num AS serial_num, -- 변경 후 시리얼
|
|
-- 상세 내용 생성 (예시: 변경된 필드 표시 - 필요시 복잡하게 구현 가능)
|
|
CONCAT(
|
|
\'자산 수정: \', IFNULL(l.resource_name, \'(이름 미변경)\'),
|
|
\' (ID:\', l.resource_id, \')\'
|
|
-- 여기에 변경된 필드 정보 추가 가능 (예: IF(old_value!=new_value, ...))
|
|
) AS details
|
|
FROM log_update_resource l LEFT JOIN auth_user au ON l.admin_user_id = au.id
|
|
WHERE 1=1 ', @v_date_condition, '
|
|
|
|
UNION ALL
|
|
|
|
-- 자산 삭제 로그
|
|
SELECT
|
|
\'DELETE\' AS log_type, l.log_id, l.log_date,
|
|
COALESCE(au.username, l.actor_description, \'System/Unknown\') AS actor_info,
|
|
l.resource_id AS target_id,
|
|
l.resource_name AS target_info_at_log, -- 삭제 시점 이름
|
|
l.serial_num AS serial_num, -- 삭제 시점 시리얼
|
|
CONCAT(\'자산 삭제: \', l.resource_name, \' (SN:\', IFNULL(l.serial_num, \'-\'), \')\') AS details
|
|
FROM log_delete_resource l LEFT JOIN auth_user au ON l.admin_user_id = au.id
|
|
WHERE 1=1 ', @v_date_condition, '
|
|
) AS combined_logs
|
|
', @v_search_condition, ' -- 최종 검색 조건 적용
|
|
ORDER BY log_date DESC
|
|
LIMIT ? OFFSET ? -- 페이징 적용
|
|
');
|
|
|
|
-- SQL 문 실행
|
|
PREPARE stmt FROM @v_sql;
|
|
-- LIMIT 절에 파라미터 바인딩
|
|
EXECUTE stmt USING p_page_size, v_offset;
|
|
|
|
-- 전체 결과 수 계산 값 반환 (두 번째 결과셋)
|
|
SELECT FOUND_ROWS() AS total_count;
|
|
|
|
DEALLOCATE PREPARE stmt;
|
|
END
|
|
$$
|
|
|
|
DELIMITER ; |