PostgreSQL - 트리거: 데이터베이스 자동화의 친절한 안내서

안녕하세요, 미래의 데이터베이스 마법사 여러분! 오늘 우리는 PostgreSQL 트리거의 세계로 흥미로운 여정을 떠납니다. 프로그래밍에 새로운 사람이라면 걱정하지 마세요 - 나는 당신의 신뢰할 수 있는 안내자가 되겠습니다. 이 주제를 단계별로 탐구해 나갈 것입니다. 이 튜토리얼의 끝을 맺을 때, 당신은 프로처럼 트리거를 만들 수 있을 것입니다!

PostgreSQL - Triggers

트리거는 무엇인가요?

이제 구체적인 내용에 들어가기 전에 트리거가 무엇인지 이해해 보겠습니다. 집에서 특정 이벤트가 발생할 때 자동으로 특정 작업을 수행하는 충성스러운 집사를 상상해 보세요. 데이터베이스에서 트리거는 바로 이와 같은 역할을 합니다!

트리거는 데이터베이스에서 특정 이벤트가 발생할 때 자동으로 실행되는 특별한 종류의 저장 절차입니다. 이러한 이벤트는 테이블에 데이터를 삽입하거나 업데이트하거나 삭제하는 것일 수 있습니다.

문법: 트리거의 청사진

이제 PostgreSQL에서 트리거를 만드는 기본 문법을 살펴보겠습니다. 처음에는 조금 두려울 수 있지만, 함께 풀어보겠습니다!

CREATE TRIGGER trigger_name
{BEFORE | AFTER | INSTEAD OF} {INSERT | UPDATE | DELETE}
ON table_name
[FOR [EACH] {ROW | STATEMENT}]
EXECUTE FUNCTION trigger_function();

이 문법을 해부해 보겠습니다:

  1. CREATE TRIGGER trigger_name: 트리거에 이름을 지정합니다.
  2. {BEFORE | AFTER | INSTEAD OF}: 트리거가 이벤트가 발생하기 전, 후, 또는 대신에 발사되도록 지정합니다.
  3. {INSERT | UPDATE | DELETE}: 트리거를 활성화시키는 이벤트를 정의합니다.
  4. ON table_name: 트리거가 연결된 테이블을 지정합니다.
  5. [FOR [EACH] {ROW | STATEMENT}]: 트리거가 전체 문장에 대해 한 번 발사되는지, 또는 영향을 받은 각 행에 대해 발사되는지 결정합니다.
  6. EXECUTE FUNCTION trigger_function(): 트리거가 발사될 때 실행되는 함수를 지정합니다.

예제: 트리거를 만들어 보자!

이제 문법을 이해했으므로 간단한 트리거를 만들어 보겠습니다. 가정해 보겠습니다. 우리는 customers 테이블이 있으며, 고객 정보에 변경이 있을 때 로그를 남기고 싶습니다.

먼저, customers 테이블과 customer_logs 테이블을 만들어 보겠습니다:

CREATE TABLE customers (
id SERIAL PRIMARY KEY,
name VARCHAR(100),
email VARCHAR(100)
);

CREATE TABLE customer_logs (
id SERIAL PRIMARY KEY,
customer_id INTEGER,
old_name VARCHAR(100),
new_name VARCHAR(100),
changed_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

이제 트리거 함수를 만들어 보겠습니다:

CREATE OR REPLACE FUNCTION log_customer_changes()
RETURNS TRIGGER AS $$
BEGIN
IF (TG_OP = 'UPDATE') THEN
INSERT INTO customer_logs (customer_id, old_name, new_name)
VALUES (OLD.id, OLD.name, NEW.name);
END IF;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;

이 함수는 작업이 업데이트인지 확인하고, 그렇다면 customer_logs 테이블에 변경 사항을 기록합니다.

마지막으로 트리거를 만들어 보겠습니다:

CREATE TRIGGER customer_changes
AFTER UPDATE ON customers
FOR EACH ROW
EXECUTE FUNCTION log_customer_changes();

이제 고객의 이름이 업데이트될 때마다 트리거가 자동으로 변경 사항을 로그에 기록합니다!

테스트해 보겠습니다:

INSERT INTO customers (name, email) VALUES ('John Doe', '[email protected]');
UPDATE customers SET name = 'John Smith' WHERE id = 1;
SELECT * FROM customer_logs;

customer_logs 테이블에 'John Doe'에서 'John Smith'로 변경된 새로운 항목이 보이게 될 것입니다!

트리거 목록: 재고점검

데이터베이스가 커지면서, 어떤 트리거가 있는지 확인하고 싶을 수 있습니다. PostgreSQL은 간단한 쿼리로 이를 쉽게 할 수 있습니다:

SELECT * FROM information_schema.triggers;

이 쿼리는 데이터베이스에 있는 모든 트리거를 목록에 보여줍니다.

특정 테이블에 대한 트리거를 더 자세히 보고 싶다면 다음과 같이 사용할 수 있습니다:

SELECT tgname FROM pg_trigger WHERE tgrelid = 'table_name'::regclass;

'테이블 이름'을 실제 테이블 이름으로 바꿔 사용하세요.

트리거 제거: 안녕히 가세요

occasionally, you might need to remove a trigger. The syntax for this is straightforward:

DROP TRIGGER trigger_name ON table_name;

예를 들어, customer_changes 트리거를 제거하려면:

DROP TRIGGER customer_changes ON customers;

트리거를 제거할 때는 항상 조심해야 합니다. 이는 데이터베이스의 자동 프로세스에 영향을 줄 수 있습니다!

결론: 트리거 전문가가 되셨습니다!

축하합니다! 지금까지 PostgreSQL 트리거의 기본을 배웠습니다. 트리거가 무엇인지, 어떻게 만드는지, 목록을 어떻게 보는지, 그리고 어떻게 제거하는지 배웠습니다. 트리거는 많은 데이터베이스 작업을 자동화할 수 있는 강력한 도구이지만, 신중하게 사용해야 합니다. 너무 많은 트리거는 데이터베이스 연산을 느리게 만들 수 있습니다.

PostgreSQL 여정을 계속하면서 더 많은 흥미로운 기능을 발견할 것입니다. 계속 연습하고, 호기심을 가지고 있고, 데이터베이스에 재미를 느껴보세요!

이제 우리가 다룬 방법들의 빠른 참조 표입니다:

방법 문법 설명
트리거 생성 CREATE TRIGGER... 새로운 트리거 생성
모든 트리거 목록 SELECT * FROM information_schema.triggers; 데이터베이스에 있는 모든 트리거 목록
테이블 트리거 목록 SELECT tgname FROM pg_trigger WHERE tgrelid = 'table_name'::regclass; 특정 테이블에 있는 트리거 목록
트리거 제거 DROP TRIGGER trigger_name ON table_name; 트리거 제거

미래의 데이터베이스 마스터 여러분, 즐겁게 트리거를 사용하세요!

Credits: Image by storyset