CS/데이터베이스시스템

저장 객체 - 저장 프로시저/함수/트리거

haong_ 2025. 4. 27. 18:16

데이터베이스 언어의 특징

SQL

  • DBMS에 대한 강력한 작업 지시 기능을 제공
  • 인간의 언어와 매우 유사하고 간단, 명료
  • 비절차적 언어, 필요한 데이터만 기술

비절차적 언어(non-procedural language)

  • 필요한 데이터만 기술하고 수행 절차는 기술하지 않음
  • 높은 가독성과 동작 순서에 대한 구체적 기술이 없어 오류가 상대적으로 적음
  • 프로그램의 성능 최적화, 디버깅, 오류 추적 및 복잡한 로직 구현에 한계 

저장 객체의 이해

저장 객체란

  • SQL문을 확장하여 절차적으로 처리하기 위한 기능을 제공하는 언어 
  • SQL/PSM(Stored Procedure Language) 기반의 확장 언어 

저장 객체의 장단점

  • 장점
    • 네트워크 전송 효율: 클라이언트와 서버 간 데이터 교환량을 줄일 수 있음
    • 효율적 실행 속도: 서버 내에서 실행되므로 빠름
    • 모듈화: 복잡한 로직을 모듈 단위로 관리할 수 있음
    • 보안성 향상: 직접 테이블 접근을 막고 프로시저를 통해 제어할 수 있음
  • 단점
    • 처리 성능 저하: 과도한 사용 시 오히려 부하가 될 수 있음
    • 어려운 디버깅: 저장 객체 내 로직 디버깅이 쉽지 않음

저장 객체의 종류 

  • 저장 프로시저: 자주 사용되거나 복잡한 과정을 거치는 SQL문을 하나의 개체로 저장
  • 함수: 저장 프로시저와 비슷하지만 결과값 반환에 특화, SELECT만 사용 
  • 트리거: 데이터 변경 이벤트에 반응하여 자동으로 동작하는 특별한 형태의 저장 프로시저

저장 프로시저

응용작업중 자주 사용되거나 다수의 SQL문으로 구성되는 복잡한 과정이 저장된 개체 

저장 프로시저의 특징 

  • 함수와 달리 이름을 이용해 값 반환하지 않음
  • 매개변수 받거나 반환
  • 프로시저에서 또 다른 프로시저 호출가능
  • 실행과 관련된 제어값과 메시지 반환 

저장 프로시저의 생성

생성 구문 

CREATE PROCEDURE 프로시저명 (매개변수)
BEGIN
    -- SQL 로직
END;

매개변수 정의 예시

CREATE PROCEDURE example_proc(IN param1 INT, OUT param2 VARCHAR(100))
BEGIN
    SELECT col_name INTO param2 FROM example_tbl WHERE id = param1;
END;

저장 프로시저의 호출

CALL example_proc(1, @result);
SELECT @result;

저장 프로시저의 수정과 삭제

  • 수정: ALTER PROCEDURE 명령 사용, 보안 속성 변경에 한정 
  • 실질적 수정은 삭제 후 재생성 
  • 삭제: DROP PROSEDURE 프로시저명; 

매개변수의 사용

역할 외부로부터 주어지는 값이나 기본값을 매개변수를 통해 저장 프로시저로 전달하고 실행한 결과값 반환 
  • IN, OUT, INOUT 세 타입의 매개변수 제공 
    • IN: 기본 타입, 외부로부터 값을 전달
    • OUT: 반환값을 저장
    • INOUT: IN과 OUT의 목적으로 모두 사용 

매개변수의 활용 예시 

CREATE PROCEDURE get_user_name(IN user_id INT)
BEGIN
    SELECT name FROM users WHERE id = user_id;
END;

변수의 사용 

저장객체에서 처리하는 응용 과정에서 발생하는 임시적인 값을 저장하고 재사용하는 기능제공 

변수 종류

  • 사용자 정의 변수: @ 시작, 별도의 선언 없이 사용
  • 로컬 변수: 저장 객체 내에서만 사용, DECLARE로 선언 
  • DECLARE 변수명 데이터타입 [DEFAULT 기본값];

변수값 할당

  • SET 명령: SET 변수명 = 값;
  • SELECT INTO 문: SELECT 컬럼명 INTO 변수명 FROM 테이블명 WHERE 조건;

선택 구조 

IF 구문

IF condition THEN
    -- 실행문
ELSE
    -- 다른 실행문
END IF;

CASE 구문

CASE 
    WHEN condition1 THEN result1
    WHEN condition2 THEN result2
    ELSE default_result
END CASE;

반복 구조 

WHILE 

WHILE 조건 DO
    -- 실행문
END WHILE;

REPEAT 

REPEAT
    -- 실행문
UNTIL 조건
END REPEAT;

LOOP

[레이블] LOOP
    -- 실행문
    LEAVE [레이블];
END LOOP;

함수

  • DBMS는 문자함수, 숫자함수, 날짜함수, 집계함수등 많은 편리한 함수를 제공 
  • 사용자 정의 함수: 사용자가 직접 프로그래밍하여 필요한 기능을 구현할 수 있음 
  • 저장 프로시저와 함수의 차이 
    • 저장 프로시저는 OUT 매개변수를 통해 결과를 반환하고 CALL 명령으로 실행
    • 함수는 RETURN문으로 값을 반환하며 SELECT문 안에서 호출

함수의 생성

CREATE FUNCTION get_user_email(IN user_id INT)
RETURNS VARCHAR(255)
BEGIN
    DECLARE email VARCHAR(255);
    SELECT email INTO email FROM users WHERE id = user_id;
    RETURN email;
END;
  • 매개변수: IN 타입의 매개변수만 사용 가능 

트리거

테이블에 데이터 변경(insert, update, delete) 이벤트가 발생했을 때 자동으로 실행되는 저장 객체
  • 전체적인 데이터베이스의 무결성과 일관성을 유지하도록 동작
  • 조건에 따른 데이터 적합성 검사 가능
  • 연속적 트리거 실행 시 다른 데이터베이스나 서버에 대한 광범위한 참조 무결성도 검사가능 

주의사항 

  • 실제 DBMS 내부에서 동작시 어떤 트리거 발동되었는지 유추하기 힘듬
  • 연쇄적인 트리거 발생은 DBMS 실패 유발할 수 있음

트리거의 종류 

  • 트리거 이벤트: 자동으로 반응하는 SQL 문
  • 트리거 시점: 트리거가 실핻될 시점을 명시 

insert, update, delete 의 before/after 6개 

트리거의 생성

CREATE TRIGGER trigger_name
BEFORE INSERT ON table_name
FOR EACH ROW
BEGIN
    -- 실행할 SQL문
END;

트리거의 활용 

PostgreSQL에서 updated_at 자동 갱신 트리거 예시 

CREATE  FUNCTION updated_tbl()
RETURNS TRIGGER AS $$
BEGIN
    NEW.updated_at = current_timestamp;
    RETURN NEW;
END;
$$ language 'plpgsql';

CREATE TRIGGER example_updated_at
    BEFORE UPDATE
    ON
        example_tbl
    FOR EACH ROW
EXECUTE PROCEDURE updated_tbl();