SQLite에서 트리거(trigger)를 사용하는 방법은 무엇인가요?
_____A1: 트리거는 특정 테이블에 대해 삽입(INSERT), 수정(UPDATE), 삭제(DELETE) 작업이 일어날 때 자동으로 실행되는 사용자 정의 프로시저입니다. 데이터 무결성 유지, 자동 로그 기록, 복잡한 비즈니스 로직 수행 등에 활용됩니다.
---
Q2: SQLite에서 트리거를 생성하는 기본 문법은 어떻게 되나요?
A2: 기본 문법은 다음과 같습니다.
```sql
CREATE TRIGGER [IF NOT EXISTS] trigger_name
[BEFORE | AFTER | INSTEAD OF] {INSERT | UPDATE | DELETE}
ON table_name
[FOR EACH ROW]
BEGIN
-- 실행할 SQL 문장들
END;
```
- `BEFORE`: 작업 전에 실행
- `AFTER`: 작업 후에 실행
- `INSTEAD OF`: 뷰(view)에 주로 사용, 해당 작업 대신 실행
- `FOR EACH ROW`: 행 단위 트리거 실행 (SQLite는 행 단위만 지원)
---
Q3: 트리거에서 OLD와 NEW 키워드란 무엇인가요?
A3:
- `OLD`: 삭제되거나 변경되기 전 행의 데이터를 참조
- `NEW`: 삽입되거나 변경된 후 행의 데이터를 참조
단, INSERT 트리거는 `NEW`만, DELETE 트리거는 `OLD`만 사용 가능합니다.
---
Q4: 예를 들어, 특정 테이블에 데이터 삽입 시 로그 테이블에 기록하는 트리거를 만들어보려면 어떻게 하나요?
A4: 다음 예시를 참고하세요.
```sql
CREATE TABLE users (
id INTEGER PRIMARY KEY,
username TEXT
);
CREATE TABLE user_logs (
log_id INTEGER PRIMARY KEY AUTOINCREMENT,
user_id INTEGER,
action TEXT,
);
CREATE TRIGGER log_user_insert
AFTER INSERT ON users
FOR EACH ROW
BEGIN
INSERT INTO user_logs (user_id, action) VALUES (NEW.id, 'INSERT');
END;
```
---
Q5: 트리거를 삭제하려면 어떻게 하나요?
A5: `DROP TRIGGER` 명령어를 사용합니다.
```sql
DROP TRIGGER IF EXISTS trigger_name;
```
---
Q6: 트리거가 항상 동기적으로 실행되나요?
A6: 네, SQLite 트리거는 원자적이고 동기적으로 실행되어 트리거 내 SQL 문장이 모두 성공해야 원래 작업도 완료됩니다.
---
Q7: 트리거를 사용 시 주의할 점은 무엇인가요?
A7:
- 복잡한 로직으로 인해 성능 저하 가능성
- 무한 재귀 호출 방지 (예: 트리거 내에서 테이블을 다시 수정하지 않도록 주의)
- 뷰에 대한 INSTEAD OF 트리거는 뷰 업데이트용으로만 사용 가능
---
Q8: 트리거의 실행 순서는 어떻게 되나요?
A8: 동일한 이벤트에 여러 트리거가 존재할 경우, SQLite는 생성된 순서대로 실행합니다.
---
Q9: 트리거에서 여러 SQL 문을 실행하려면 어떻게 하나요?
A9: `BEGIN ... END;` 블록 내에 여러 SQL문을 세미콜론(;)으로 구분해서 작성할 수 있습니다.
---
Q10: 트리거 작성 시 기타 참고할 만한 SQLite 기능이 있나요?
A10: TRIGGER와 함께 `PRAGMA foreign_keys` 옵션을 설정해 외래키 제약조건과 연계하거나, 트리거에서 사용자 정의 함수(UDF)를 호출해 복잡한 처리를 할 수 있습니다.
트리거는 데이터베이스의 무결성을 유지하고, 자동화된 작업을 수행하는 데 유용합니다.
예를 들어, 데이터가 삽입, 업데이트 또는 삭제될 때 특정 작업을 자동으로 수행하도록 설정할 수 있습니다.
트리거의 기본 구성 요소 1. 이벤트 : 트리거가 실행되는 조건입니다.
일반적으로 `INSERT`, `UPDATE`, `DELETE` 중 하나입니다.
2. 타이밍 : 트리거가 실행되는 시점입니다.
`BEFORE` 또는 `AFTER`로 설정할 수 있습니다.
`BEFORE`는 이벤트가 발생하기 전에, `AFTER`는 이벤트가 발생한 후에 트리거가 실행됩니다.
3. 대상 테이블 : 트리거가 적용될 테이블입니다.
4. 트리거 동작 : 트리거가 실행될 때 수행할 SQL 명령어입니다.
트리거 생성 방법 트리거를 생성하기 위해서는 `CREATE TRIGGER` 문을 사용합니다.
기본 구문은 다음과 같습니다: ```sql CREATE TRIGGER trigger_name timing event ON table_name BEGIN -- SQL statements END; ``` 예제 1. INSERT 트리거 예제 : 사용자가 새로운 레코드를 추가할 때, 자동으로 `created_at` 필드를 현재 시간으로 설정하는 트리거를 만들어 보겠습니다.
```sql CREATE TABLE users ( id INTEGER PRIMARY KEY, name TEXT, created_at DATETIME ); CREATE TRIGGER set_created_at BEFORE INSERT ON users BEGIN NEW.created_at = CURRENT_TIMESTAMP; END; ``` 위의 예제에서 `set_created_at` 트리거는 `users` 테이블에 새로운 레코드가 삽입되기 전에 `created_at` 필드를 현재 시간으로 설정합니다.
2. UPDATE 트리거 예제 : 사용자가 레코드를 업데이트할 때, `updated_at` 필드를 현재 시간으로 설정하는 트리거를 만들어 보겠습니다.
```sql CREATE TABLE products ( id INTEGER PRIMARY KEY, name TEXT, price REAL, updated_at DATETIME ); CREATE TRIGGER update_product_timestamp AFTER UPDATE ON products BEGIN UPDATE products SET updated_at = CURRENT_TIMESTAMP WHERE id = NEW.id; END; ``` 이 트리거는 `products` 테이블의 레코드가 업데이트된 후에 `updated_at` 필드를 현재 시간으로 설정합니다.
3. DELETE 트리거 예제 : 레코드가 삭제될 때, 삭제된 레코드를 기록하는 로그 테이블에 추가하는 트리거를 만들어 보겠습니다.
```sql CREATE TABLE deleted_users ( id INTEGER, name TEXT, deleted_at DATETIME ); CREATE TRIGGER log_deleted_user AFTER DELETE ON users BEGIN INSERT INTO deleted_users (id, name, deleted_at) VALUES (OLD.id, OLD.name, CURRENT_TIMESTAMP); END; ``` 이 트리거는 `users` 테이블에서 레코드가 삭제될 때마다 해당 레코드의 정보를 `deleted_users` 테이블에 기록합니다.
트리거 관리 - 트리거 삭제 : 트리거를 삭제하려면 `DROP TRIGGER` 문을 사용합니다.
```sql DROP TRIGGER trigger_name; ``` - 트리거 확인 : SQLite에서는 `sqlite_master` 테이블을 조회하여 현재 데이터베이스에 존재하는 트리거를 확인할 수 있습니다.
```sql SELECT name FROM sqlite_master WHERE type='trigger'; ``` 주의사항 - 트리거는 무한 루프를 방지하기 위해 주의해서 사용해야 합니다.
예를 들어, 트리거가 다른 트리거를 호출하는 경우 무한 루프가 발생할 수 있습니다.
- 트리거는 성능에 영향을 줄 수 있으므로, 필요한 경우에만 사용하는 것이 좋습니다.
- 트리거 내에서 오류가 발생하면 해당 트랜잭션이 롤백됩니다.
결론 SQLite에서 트리거는 데이터베이스의 자동화 및 무결성 유지에 매우 유용한 도구입니다.
다양한 이벤트에 대해 자동으로 작업을 수행할 수 있도록 설정함으로써, 데이터베이스 관리의 효율성을 높일 수 있습니다.
트리거를 적절히 활용하면 데이터베이스의 일관성을 유지하고, 개발자의 수고를 덜 수 있습니다.
작성자:
이서현 [비회원]
| 작성일자: 1년 전
2024-11-09 09:01:56
조회수: 229 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
조회수: 229 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
내용이 부정확하다면 싫어요를 클릭해주세요.