SQLite - 트리거: 초보자를 위한 친절한 가이드

안녕하세요, 미래의 프로그래머 여러분! 오늘 우리는 SQLite 트리거의 세계로 흥미로운 여정을 떠납니다. 코드를 한 줄도 작성해본 적이 없더라도 걱정하지 마세요 - 나는 여러분의 친절한 가이드가 되어, 이 주제를 단계별로 탐구해 나갈 것입니다. 이 튜토리얼의 끝까지 따라오면, 프로처럼 트리거를 만드는 법을 배울 수 있을 것입니다!

SQLite - Triggers

트리거는 무엇인가요?

들어가기 전에, 작은 도서관을 운영 중이라고 상상해 보세요. 책이 빌려 갈 때마다 여러 기록을 업데이트해야 합니다: 책을 사용할 수 없게 표시하고, 빌리는 날짜를 기록하며, 심지어는 알림 이메일을 보내기도 합니다. 이 모든 작업이 책이 빌려갈 때 자동으로 이루어질 수 있다면 얼마나 좋을까요? 바로 데이터베이스에서 트리거가 하는 일입니다!

SQLite에서 트리거는 지정된 데이터베이스 이벤트가 발생할 때 자동으로 실행되는 데이터베이스 객체입니다. 도미노 효과를 설정하는 것과 같아요 - 하나의 일이 발생하면, 자동으로 다른 일들이 이루어집니다.

첫 번째 트리거 만들기

간단한 예제로 시작해 보겠습니다. 우리 도서관 데이터베이스에 books 테이블이 있다고 상상해 보세요:

CREATE TABLE books (
id INTEGER PRIMARY KEY,
title TEXT,
author TEXT,
available INTEGER
);

이제 책이 빌려갈 때 자동으로 책을 사용할 수 없게 표시하는 트리거를 만들어 보겠습니다:

CREATE TRIGGER make_unavailable
AFTER INSERT ON borrowings
FOR EACH ROW
BEGIN
UPDATE books SET available = 0 WHERE id = NEW.book_id;
END;

이를 단계별로 설명하겠습니다:

  1. CREATE TRIGGER make_unavailable: 새로운 트리거 "make_unavailable"를 생성합니다.
  2. AFTER INSERT ON borrowings: "borrowings" 테이블에 새로운 행이 추가되면 이 트리거가 발동합니다.
  3. FOR EACH ROW: INSERT 연산에 영향을 받는 각 행에 대해 트리거가 실행됩니다.
  4. BEGIN ... END: 이 블록에는 트리거가 수행할 작업이 포함됩니다.
  5. UPDATE books SET available = 0 WHERE id = NEW.book_id: "books" 테이블을 업데이트하여 빌려간 책의 "available" 열을 0으로 설정합니다.

트리거의 종류

SQLite는 여러 가지 트리거를 지원합니다. 이들을 살펴보겠습니다:

1. BEFORE 트리거

이 트리거는 데이터베이스 연산이 발생하기 전에 발동합니다. 데이터가 삽입되거나 업데이트되기 전에 데이터를 검증하거나 수정하는 데 유용합니다.

CREATE TRIGGER check_author
BEFORE INSERT ON books
FOR EACH ROW
BEGIN
SELECT CASE
WHEN NEW.author IS NULL THEN
RAISE(ABORT, 'Author cannot be null')
END;
END;

이 트리거는 새로운 책을 삽입하기 전에 저자가 null인지 확인하고, null이면 오류를 발생시킵니다.

2. AFTER 트리거

이미 첫 번째 예제에서 AFTER 트리거를 보았습니다. 이 트리거는 데이터베이스 연산이 완료된 후에 발동합니다. 관련 데이터를 유지하거나 변경 사항을 로그하는 데 유용합니다.

3. INSTEAD OF 트리거

이 트리거는 뷰에만 사용되는 특별한 트리거입니다. 뷰를 통해 데이터를 수정할 때 사용자 정의 동작을 정의할 수 있습니다.

CREATE VIEW available_books AS
SELECT * FROM books WHERE available = 1;

CREATE TRIGGER update_available_books
INSTEAD OF UPDATE ON available_books
FOR EACH ROW
BEGIN
UPDATE books SET
title = NEW.title,
author = NEW.author
WHERE id = OLD.id;
END;

이 트리거는 "available_books" 뷰를 업데이트할 때 "books" 테이블을 업데이트합니다.

트리거 이벤트

트리거는 다양한 이벤트에 설정할 수 있습니다:

이벤트 설명
INSERT 테이블에 새로운 행이 삽입될 때 발동
UPDATE 테이블의 행이 업데이트될 때 발동
DELETE 테이블에서 행이 삭제될 때 발동

트리거는 단일 트리거에 여러 이벤트를 지정할 수도 있습니다:

CREATE TRIGGER log_changes
AFTER INSERT OR UPDATE OR DELETE ON books
FOR EACH ROW
BEGIN
INSERT INTO log (action, book_id, timestamp)
VALUES (
CASE
WHEN NEW.id IS NOT NULL AND OLD.id IS NULL THEN 'INSERT'
WHEN NEW.id IS NULL AND OLD.id IS NOT NULL THEN 'DELETE'
ELSE 'UPDATE'
END,
COALESCE(NEW.id, OLD.id),
DATETIME('NOW')
);
END;

이 트리거는 "books" 테이블에 대한 모든 변경 사항(삽입, 업데이트, 삭제)을 로그합니다.

트리거 목록 보기

이제 몇 가지 트리거를 만들었으니, "내 데이터베이스에 어떤 트리거가 있는지 보고 싶을 수 있습니다."라는 생각이 드실 수 있습니다. SQLite는 트리거 목록을 보기 위한 편리한 방법을 제공합니다:

SELECT name, sql FROM sqlite_master WHERE type = 'trigger';

이 쿼리는 모든 트리거의 이름과 SQL 생성 문을 보여줍니다. 마치 마법이 일어나는 뒤를 엿보는 것처럼입니다!

트리거 제거

occasionally, you might need to remove a trigger. Perhaps it's no longer needed, or you want to replace it with a different one. Dropping a trigger is quite simple:

DROP TRIGGER IF EXISTS make_unavailable;

이 명령은 우리가 이전에 만든 "make_unavailable" 트리거를 제거합니다. IF EXISTS 절은 트리거가 존재하지 않을 때 오류를 방지하는 안전망입니다.

결론

축하합니다! SQLite 트리거의 세계로 첫 걸음을 뗐습니다. 우리는 트리거 생성, 트리거의 다양한 종류, 트리거 이벤트, 트리거 목록 보기, 그리고 트리거 제거에 대해 다루었습니다.

트리거는 데이터베이스가 더 지능적으로 작동하도록 도와주는 강력한 도구입니다. 그들은 뒤에서 작업을 수행하여 데이터를 일관성 있고 최신 상태로 유지합니다.

프로그래밍 여정을 계속하면서 트리거의 더 많은 용도를 발견할 것입니다.처음에는 약간 어려울 수 있지만, 연습을 통해 복잡한 트리거 시스템을 만드는 법을 배울 수 있을 것입니다.

계속 실험하고, 배우고, 가장 중요한 것은 즐겁게 지내세요! 데이터베이스의 세계는 방대하고 흥미롭며, 여러분이 지금까지 건드렸던 것보다 더 놀라운 것들을 창출할 것입니다. 다음에 무엇을 만들 것인가요?

Credits: Image by storyset