트리거의 알려진 한계

SQL Server에서 트리거 구축 및 최적화

Florin Angelescu

Instructor

트리거의 장점

  • 데이터베이스 무결성에 사용
  • 비즈니스 규칙을 DB에서 직접 강제
  • 허용되는 문장 제어
  • 단일 이벤트로 복잡한 비즈니스 로직 실행
  • DB와 사용자 작업 감사가 쉬움
SQL Server에서 트리거 구축 및 최적화

트리거의 단점

  • 보기와 탐지가 어려움
  • 클라이언트 앱이나 디버깅 시 보이지 않음
  • 문제 해결 시 로직 추적이 어려움
  • 서버에 오버헤드가 되어 성능 저하 가능
SQL Server에서 트리거 구축 및 최적화

서버 수준 트리거 찾기

SELECT * FROM sys.server_triggers;
| name                 | parent_class_desc | create_date | is_disabled |...|
|----------------------|-------------------|-------------|-------------|---|
| DenyNewDatabases     | SERVER            | 2019-01-22  | 0           |...|
| DenyNewLinkedServers | SERVER            | 2019-01-22  | 1           |...|
| DenyDatabaseDelete   | SERVER            | 2019-01-22  | 1           |...|
SQL Server에서 트리거 구축 및 최적화

데이터베이스·테이블 트리거 찾기

SELECT * FROM sys.triggers;
| name                   | parent_class_desc | create_date | is_disabled | is_instead_of_trigger |
|----------------------|-------------------|-------------|---------------|-----------------------|
| TrackRetiredProducts   | OBJECT_OR_COLUMN  | 2019-04-19  | 0           | 0                     |
| PreventOrdersUpdate    | OBJECT_OR_COLUMN  | 2019-04-22  | 0           | 1                     |
| TrackDatabaseTables    | DATABASE          | 2019-04-23  | 0           | 0                     |
| KeepCanceledOrders     | OBJECT_OR_COLUMN  | 2019-04-27  | 0           | 0                     |
| DiscountsPreventDelete | OBJECT_OR_COLUMN  | 2019-04-27  | 0           | 1                     |
| PreventNewDiscounts    | OBJECT_OR_COLUMN  | 2019-04-27  | 0           | 1                     |
| PreventTableDeletion   | DATABASE          | 2019-04-27  | 0           | 0                     |
SQL Server에서 트리거 구축 및 최적화

트리거 정의 보기 (옵션 1)

SSMS에서 트리거 정의 보기

CREATE TRIGGER PreventOrdersUpdate
ON Orders
INSTEAD OF UPDATE
AS
RAISERROR ('Updates on "Orders" table
            are not permitted.
            Place a new order
            to add new products.', 16, 1);
SQL Server에서 트리거 구축 및 최적화

트리거 정의 보기 (옵션 2)

SELECT definition
FROM sys.sql_modules
WHERE object_id = OBJECT_ID ('PreventOrdersUpdate');
| definition                                                   |
|--------------------------------------------------------------|
| CREATE TRIGGER PreventOrdersUpdate                           |
| ON Orders                                                    |
| INSTEAD OF UPDATE                                            |
| AS                                                           |
| RAISERROR ('Updates on "Orders" table are not permitted.     |
|             Place a new order to add new products.', 16, 1); |
SQL Server에서 트리거 구축 및 최적화

트리거 정의 보기 (옵션 3)

SELECT OBJECT_DEFINITION (OBJECT_ID ('PreventOrdersUpdate'));
| (No column name)                                             |
|--------------------------------------------------------------|
| CREATE TRIGGER PreventOrdersUpdate                           |
| ON Orders                                                    |
| INSTEAD OF UPDATE                                            |
| AS                                                           |
| RAISERROR ('Updates on "Orders" table are not permitted.     |
|             Place a new order to add new products.', 16, 1); |
SQL Server에서 트리거 구축 및 최적화

트리거 정의 보기 (옵션 4)

EXECUTE sp_helptext @objname = 'PreventOrdersUpdate';
| Text                                                         |
|--------------------------------------------------------------|
| CREATE TRIGGER PreventOrdersUpdate                           |
| ON Orders                                                    |
| INSTEAD OF UPDATE                                            |
| AS                                                           |
| RAISERROR ('Updates on "Orders" table are not permitted.     |
|             Place a new order to add new products.', 16, 1); |
SQL Server에서 트리거 구축 및 최적화

트리거 모범 사례

팁:

  • 문서화된 데이터베이스 설계
  • 단순한 트리거 로직
  • 트리거 남용 피하기
SQL Server에서 트리거 구축 및 최적화

연습해 봅시다!

SQL Server에서 트리거 구축 및 최적화

Preparing Video For Download...