ORACLE - 트리거로 서버 jar 실행

개미는뚠뚠·2024년 3월 24일
0

oracle

목록 보기
2/2
post-thumbnail

🚀 개요

DB 시스템 내에서 데이터의 입력, 갱신, 삭제 등의 이벤트가 발생할 때 사용자가 정의한 내용으로 자동적으로 수행되는 trigger 라는 기능이 있다.

최근 작업 중 DB에 신규 데이터가 들어오면 리눅스 서버 내 jar을 가동하게끔 하는 요청이 왔었다. 나는 처음에 java 소스 내에서 select를 통한 데이터 감지, 이후 서버와의 연계를 생각하였다. 하지만 너무 많은 리소스 낭비와 깔끔하지 않은 구현 내용에 대해 고민이 많았다.

그러다 다른 프로젝트 내에 구현된 trigger 내용 중 힌트를 얻었고, 해당 코드와 간단한 설명을 정리하려고 한다.


🚀 SQL

CREATE OR REPLACE TRIGGER example_trigger 
AFTER INSERT ON test_table
FOR EACH ROW
DECLARE
    PRAGMA AUTONOMOUS_TRANSACTION;
    script_content VARCHAR2(32767);
    cnt INTEGER;
BEGIN
    SELECT COUNT(*) INTO cnt FROM all_scheduler_jobs WHERE job_name LIKE 'call_exe_info';
    
    IF (cnt > 0) THEN
        DBMS_SCHEDULER.DROP_JOB('call_exe_info');
    END IF;

    script_content := '#!/bin/bash
		ssh remoteuser@192.168.1.100 "/bin/bash /home/admin/testDir/server.sh"';

    BEGIN
        DBMS_SCHEDULER.CREATE_JOB(
            job_name        => 'call_exe_info',
            job_type        => 'EXECUTABLE',
            job_action      => script_content,
            start_date      => SYSDATE,
            repeat_interval => NULL,
            end_date        => NULL,
            enabled         => FALSE,
            auto_drop       => FALSE
        );

        DBMS_SCHEDULER.ENABLE('call_exe_info');
    END;
END;

🚀 풀이

1. 트리거 정의

1-1. 트리거 생성: test_table에 데이터가 삽입된 후 실행되는 트리거 example_trigger를 생성한다.

2. 독립적인 트랜잭션 선언

2-1. PRAGMA AUTONOMOUS_TRANSACTION: 트리거 내에서 독립적인 트랜잭션을 시작하고, 이는 트리거가 외부 작업(예: 원격 스크립트 실행)을 수행하고 커밋할 수 있게 해준다.

3. 기존 스케줄러 작업 확인 및 삭제

3-1. 작업 확인: all_scheduler_jobs에서 job_name이 'call_exe_info'인 작업이 있는지 확인한다.

3-2. 작업 삭제: 해당 작업이 이미 존재한다면, DBMS_SCHEDULER.DROP_JOB을 사용하여 삭제한다.

4. 원격 스크립트 실행을 위한 스케줄러 작업 생성

4-1. 스크립트 내용 정의: 원격 서버에서 실행할 스크립트의 내용을 script_content 변수에 저장한다.

4-2. 스케줄러 작업 생성: DBMS_SCHEDULER.CREATE_JOB을 사용하여 원격 스크립트 실행을 위한 작업을 생성한다. 작업 유형은 EXECUTABLE이며, job_action에는 script_content가 지정된다.

4-3. 작업 활성화: DBMS_SCHEDULER.ENABLE을 호출하여 작업을 활성화한다.


위와 같은 내용으로 리눅스 서버 내 jar 파일을 실행할 수 있었다.

참고로 해당 코드에는 sh 파일을 실행하고 있다(나는 sh 파일 내에 jar 실행코드를 작성하였음).
만약에 필요하다면 아래 코드를 참조하여 작성하면 될 거 같다.

#!/bin/bash

JAR_PATH="/home/admin/testDir/jarfile.jar"

# 인자가 필요하다면 추가 작성해줌(ex.arg)
java -jar $JAR_PATH arg

실제로 해당 코드는 웹 프로젝트 내에 독자적으로 돌아가는 모듈에 대해서 사용하였고, 다양한 방면에서 활용하기 좋은 코드라고 생각하며 애용하는 코드가 될 거 같다👍

0개의 댓글