23장. Trigger CREATE TRIGGER 구문 DROP TRIGGER 구문 트리거 사용하기

Slides:



Advertisements
Similar presentations
12 데이터 무결성 제약조건 데이터 무결성 제약조건의 개념 데이터 무결성 제약조건의 종류 무결성 제약조건의 생성 방법.
Advertisements

PARK SUNGJIN Oracle 설치 PARK SUNGJIN
DB 프로그래밍 학기.
DB 프로그래밍 학기.
You YOungseok 데이터베이스 테이블 및 인덱스 You YOungseok.
2장. 프로그램의 기본 구성. 2장. 프로그램의 기본 구성 2-1"Hello, World!" 들여다 보기 /* Hello.c */ #include int main(void) { printf("Hello, World! \n"); return 0;
다양한 예제로 쉽게 배우는 오라클 SQL 과 PL/SQL
Excel 일차 강사 : 박영민.
데이터 베이스 설계 및 실습 #1 - 오라클 설치 및 SQL 기본.
제 09 장 데이터베이스와 MySQL 학기 인터넷비즈니스과 강 환수 교수.
You YoungSEok 고급 SQL You YoungSEok
12장 데이터 읽기 일관성과 락.
6장 Mysql 명령어 한빛미디어(주).
MySQL 및 Workbench 설치 데이터 베이스.
(개정판) 뇌를 자극하는 Red Hat Fedora 리눅스 서버 & 네트워크
11 테이블 관리와 데이터 딕셔너리 데이터베이스 응용 프로젝트 개발 테이블 구조 변경 데이터 딕셔너리.
3장. 데이터베이스 구축의 전체 과정 미리 실습하기
테이블 : 데이터베이스를 구성하는 요소로 같은 성격에 정보의 집합체. 레코드 : 하나의 정보를 가지고 있는 컬럼의 집합체
5장 Mysql 데이터베이스 한빛미디어(주).
4장. 웹로직 서버상에서의 JDBC와 JTA의 운용
6장 그룹 함수.
07 그룹 함수 그룹 함수의 개념 그룹 함수의 종류 데이터 그룹 생성 HAVING 절.
학습목표 학습목표 본 장은 데이터베이스 내에 하나의 객체로 저장되어 관리되는 응용프로그램과 같은 기능을 하는 저장 프로시저에 대해 학습한다. 사용자가 직접 작성하는 사용자 저장 프로시저, DBMS가 관리를 위해 미리 만들어 둔 시스템 저장 프로시저에 대한 여러 가지 사용방법을.
3.2 SQL Server 설치 및 수행(계속) 시스템 데이터베이스 master
11장. 포인터 01_ 포인터의 기본 02_ 포인터와 Const.
SqlParameter 클래스 선문 비트 18기 발표자 : 박성한.
13 인덱스 인덱스의 개념 인덱스의 구조 인덱스의 효율적인 사용 방법 인덱스의 종류 및 생성 방법 인덱스 실행 경로 확인
16장. 테이블의 변경 새로운 행 삽입 테이블에서 테이블로 행을 복사 행 값의 변경 테이블에서 행 삭제
19장. 트랜잭션과 락(LOCK) 트랜잭션이란? MySQL의 트랜잭션 락(LOCK) 쉽게 배우는 MySQL 5.x
메시지 큐[5] – test1.c 메시지 제어: msgctl(2) #include <sys/msg.h>
17강. 데이터 베이스 - I 데이터 베이스의 개요 Oracle 설치 기본적인 SQL문 익히기
MYSQL 설치 SQL언어 SQL언어의 활용 웹과 SQL언어와의 연동
KHS JDBC Programming 4 KHS
자료구조: CHAP 4 리스트 (3) 순천향대학교 컴퓨터공학과 하 상 호.
5장 Mysql 데이터베이스 한빛미디어(주).
KIM HEESANG PL/SQL 2 KIM HEESANG
13 인덱스 인덱스의 개념 인덱스의 구조 인덱스의 효율적인 사용 방법 인덱스의 종류 및 생성 방법 인덱스 실행 경로 확인
You YoungSEok Oracle 설치 You YoungSEok
웹 어플리케이션 보안 2016년 2학기 3. Mongo db.
데이터 수정 데이터 수정 명령문을 이해한다. 데이터 삽입, 갱신 및 삭제 명령문을 이해한다.
사용자 함수 사용하기 함수 함수 정의 프로그램에서 특정한 기능을 수행하도록 만든 하나의 단위 작업
어서와 C언어는 처음이지 제14장.
JDBC Lecture 004 By MINIO.
3장. SQL Server 2008 전체 운영 실습 및 DB와 프로그램의 연동
HTTP 프로토콜의 요청과 응답 동작을 이해한다. 서블릿 및 JSP 를 알아보고 역할을 이해한다.
테이블 만들기 실습 목표 입력할 tableDB <실습1> SSMS에서 테이블 생성
컴퓨터 프로그래밍 기초 - 10th : 포인터 및 구조체 -
5장 선택제어문 if 선택문 switch-case 선택문 다양한 프로그램 작성 조건 연산자.
CHAP 21. 전화, SMS, 주소록.
( Windows Service Application Debugging )
문성우 SQL 실습 Part Ⅰ 문성우.
SQL Server 2000 세미나 View, SP &Trigger
에어 PHP 입문.
10 데이터 조작어 데이터 조작어 데이터 입력 데이터 수정 데이터 삭제 MERGE 트랜잭션 관리 시퀀스.
10 데이터 조작어 데이터 조작어 데이터 입력 데이터 수정 데이터 삭제 MERGE 트랜잭션 관리 시퀀스.
오라클 11g 보안.
7주차: Functions and Arrays
14 뷰(View) 뷰의 개념 뷰 관리.
7장. 다양한 형태의 반복문. 7장. 다양한 형태의 반복문 7-1 반복문이란? 반복문의 기능 세 가지 형태의 반복문 특정 영역을 특정 조건이 만족하는 동안에 반복 실행하기 위한 문장 7-1 반복문이란? 반복문의 기능 특정 영역을 특정 조건이 만족하는 동안에 반복.
제 23 장 오라클에서 보안 기능.
Chapter 10 데이터 검색1.
세션에 대해 알아보고 HttpSession 에 대해 이해한다 세션 관리에 사용되는 요소들을 살펴본다
Stored program 장종원
10주 MariaDB에서 트랜잭션 지원 및 동시성 제어 기능
Mariadb 트랜잭션과 동시성 제어 장종원
9장. spss statistics 20의 데이터 변수계산
14 뷰(View) 뷰의 개념 뷰 관리.
 6장. SQL 쿼리.
임시테이블과 테이블변수 SQLWorld Study Group - 최명환 -.
Ⅰ. 데이터베이스 정의 Ⅱ. MS SQL 서버 Ⅲ. 데이터베이스 인터페이스
Presentation transcript:

23장. Trigger CREATE TRIGGER 구문 DROP TRIGGER 구문 트리거 사용하기 2019-05-02 쉽게 배우는 MySQL 5.x

트리거란? 이름이 있는 데이터베이스 오브젝트(named database object)로서 데이터베이스가 미리 정해 놓은 조건을 만족하거나 어떤 동작이 수행되면 자동적으로 수행되는 저장 프로시저이다. mysql> CREATE TABLE account (acct_num INT, amount DECIMAL(10,2)); Query OK, 0 rows affected (0.03 sec) mysql> CREATE TRIGGER ins_sum BEFORE INSERT ON account     -> FOR EACH ROW SET @sum = @sum + NEW.amount; Query OK, 0 rows affected (0.06 sec) 하나의 테이블과 하나의 INSERT 트리거를 생성하고 생성된 트리거는 테이블의 칼럼에 삽입된 값들을 더하게 한다. 23.1 CREATE TRIGGER 구문 -CREATE TRIGGER 는 MySQL 5.0.2에 추가된 기능 -트리거를 사용하기 위해서는 SUPER 권한이 필요 -tbl_name으로 명기된 테이블과 연결되고 영구(Permanent)테이블을 참조 -트리거를 TEMPORARY테이블 또는 하나의 뷰(view)에 연결할 수는 없다. 2019-05-02 쉽게 배우는 MySQL 5.x

• UPDATE : 트리거는 하나의 행이 수정될 때마다 활성화된다. 예를 들면, UPDATE 명령문을 사용 CREATE [DEFINER = { user | CURRENT_USER }]     TRIGGER trigger_name trigger_time trigger_event     ON tbl_name FOR EACH ROW trigger_stmt 트리거 구문 형식 설명 • trigger_time : 트리거 동작시간으로 트리거를 명령문 실행 전에 활성화 시킬지 또는 실행 후에 활성화 시킬지를 나타내는 BEFORE 또는 AFTER 가 될 수 있다. • trigger_event : 트리거를 활성화시키는 명령문의 종류를 나타낸다. 예를 들면, INSERT 트리거는 INSERT 명령문 뿐만 아니라 LOAD DATA명령문에 의해서도 활성화 된다. 이것은 두 가지 명령문이 모두 테이블에 행(row)을 삽입하기 때문이다. trigger_event 는 아래의 명령문중 하나가 될 수 있다. • INSERT : 트리거는 새로운 행(row)이 테이블 속으로 삽입될 때마다 활성화 된다. 예를 들면, INSERT, LOAD DATA, 및 REPLACE 명령문을 사용 • UPDATE : 트리거는 하나의 행이 수정될 때마다 활성화된다. 예를 들면, UPDATE 명령문을 사용 • DELETE : 트리거는 하나의 행이 테이블에서 삭제될 때마다 활성화 된다. 예를 들면, DELETE 및 REPLACE 명령문을 사용 2019-05-02 쉽게 배우는 MySQL 5.x

• INSERT INTO ... ON DUPLICATE KEY UPDATE ... : 혼란스러움을 줄 수 있다. BEFORE INSERT 트리거는 모든 행(row)에 대해 활성화가 되는데, AFTER INSERT 또는 BEFORE UPDATE 와 AFTER UPDATE 가 모두 따라오게 되는데, 행이 이중화 되어 있는지에 따라 쓸 수 있다. • 동일한 트리거 동작 시간 및 이벤트를 갖는 테이블에 대해서는 두 개의 트리거를 가질 수 없다. ① 한 테이블에 대해 두 개의 BEFORE UPDATE 트리거를 가질 수 없다. ② 한개의 BEFORE UPDATE, 한개의 BEFORE INSERT 트리거는 가질 수 있다. ③ 한개의 BEFORE UPDATE, 한개의 AFTER UPDATE 트리거는 가질 수 있다. • trigger_stmt : 트리거가 활성화될 때 실행할 수 있는 명령문 ① 다중 명령문을 실행하고자 한다면, BEGIN ... END 복합 명령문 구성하여 사용 ② 스토어드 루틴내에서 사용 가능한 동일한 명령문에서도 적용 • 주의사항 ① 현재의 버전에서는, 연속적인 외부 키 동작(cascaded foreign key actions)으로 트리거를 활성화 시킬 수는 없다. ② MySQL 5.0.10 이전에는, 이름을 가지고 직접 테이블을 참조할 수는 없었다. 2019-05-02 쉽게 배우는 MySQL 5.x

CREATE TABLE test1(a1 INT); CREATE TABLE test2(a2 INT); CREATE TABLE test3(a3 INT NOT NULL AUTO_INCREMENT PRIMARY KEY); CREATE TABLE test4(   a4 INT NOT NULL AUTO_INCREMENT PRIMARY KEY,   b4 INT DEFAULT 0 ); DELIMITER | CREATE TRIGGER testref BEFORE INSERT ON test1   FOR EACH ROW BEGIN     INSERT INTO test2 SET a2 = NEW.a1;     DELETE FROM test3 WHERE a3 = NEW.a1;      UPDATE test4 SET b4 = b4 + 1 WHERE a4 = NEW.a1;   END; | DELIMITER ; INSERT INTO test3 (a3) VALUES   (NULL), (NULL), (NULL), (NULL), (NULL),   (NULL), (NULL), (NULL), (NULL), (NULL); INSERT INTO test4 (a4) VALUES   (0), (0), (0), (0), (0), (0), (0), (0), (0), (0); 2019-05-02 쉽게 배우는 MySQL 5.x

테이블 test1에 아래와 같이 데이터를 삽입한다고 가정 : mysql> INSERT INTO test1 VALUES     -> (1), (3), (1), (7), (1), (8), (4), (4); Query OK, 8 rows affected (0.01 sec) Records: 8  Duplicates: 0  Warnings: 0 SELECT * FROM test1; +------+ | a1   | |    1 | |    3 | |    7 | |    8 | |    4 | 8 rows in set (0.00 sec) SELECT * FROM test2; +------+ | a2   | |    1 | |    3 | |    7 | |    8 | |    4 | SELECT * FROM test3; +----+ | a3 | |  2 | |  5 | |  6 | |  9 | | 10 | 5 rows in set (0.00 sec) SELECT * FROM test4; +----+------+ | a4 | b4   | |  1 |    3 | |  2 |    0 | |  3 |    1 | |  4 |    2 | |  5 |    0 | |  6 |    0 | |  7 |    1 | |  8 |    1 | |  9 |    0 | | 10 |    0 | 10 rows in set (0.00 sec) Test3의 경우 test1의 열 값(1,3,4,7,8)을 삭제한 값만 출력 Test4의 경우 test1의 열 값(1,3,4,7,8)과 값이 같은 경우 b4에 1씩 가산해 준다. 예 : 1의 경우 3번 나오므로 3이 출력 2019-05-02 쉽게 배우는 MySQL 5.x

23.2 DROP TRIGGER 구문 23.3 TRIGGER 사용하기 [형식] DROP TRIGGER [schema_name.] trigger_name -트리거를 드롭(drop) 시킨다. -만일 스키마가 생략되면, 트리거는 디폴트 스키마로부터 드롭된다. -DROP TRIGGER은 MySQL 5.0.2에서 추가되었다. -DROP TRIGGER를 사용하기 위해서는 SUPER 권한이 요구된다. 23.3 TRIGGER 사용하기 -데이터베이스 오브젝트이고, 테이블과 연관된 이름으로, 테이블에 대해 특정 이벤트가 발생하면 활성화된다. -테이블 안으로 삽입하고자 하는 값을 검사하는 기능을 수행 -테이블 업데이트에서 호출한 값을 계산하는 기능을 수행 -테이블에 대한 INSERT, DELETE 또는 UPDATE 명령문이 실행될 때에 활성화 -트리거는 실행하는 명령문의 앞 또는 뒤에서 활성화 되도록 설정할 수 있다. 2019-05-02 쉽게 배우는 MySQL 5.x

테이블의 칼럼 중 한개에 삽입된 값을 더하는 연산자의 역할을 한다. mysql> CREATE TABLE account (acct_num INT, amount DECIMAL(10,2)); mysql> CREATE TRIGGER ins_sum BEFORE INSERT ON account     -> FOR EACH ROW SET @sum = @sum + NEW.amount; -ins_sum 트리거를 생성하고, account라는 테이블과 연관성이 있다. -트리거의 동작 시간, 트리거가 행하는 이벤트, 그리고 트리거를 활성화 하면서 해야 할 일을 지정 -키워드 BEFORE는 트리거 실행 시간, 각 줄이 테이블에 삽입되기 전에 실행 -키워드 INSERT는 트리거를 실행시키는 이벤트를 가리킨다. -FOR EACH ROW에 따라오는 명령문은 트리거를 활성화를 위한 명령문 정의 -트리거를 사용하기 위해서는, 누산기 변수를 0으로 설정 mysql> SET @sum = 0; mysql> INSERT INTO account VALUES(137,14.98),(141,1937.50),(97,-100.00); mysql> SELECT @sum AS '삽입된 amount의 총합'; +----------------------+ | 삽입된 amount의 총합 | | 1852.48              | 1 row in set (0.00 sec) 2019-05-02 쉽게 배우는 MySQL 5.x

-트리거의 이름은 스키마(데이터베이스) 이름란에 존재 -하나의 스키마에 있는 트리거들은 서로 다른 이름을 가져야 함을 의미 -서로 다른 스키마에 있는 트리거들은 같은 이름을 가져도 된다. -하나의 테이블에는 동일한 활성화 시간 및 이벤트를 갖는 두 개의 트리거를 가질 수 없다. -하나의 테이블에 대해 두 개의 BEFORE INSERT 트리거 또는 두 개의 AFTER UPDATE 트리거를 가질 수 없다. -OLD와 NEW 키워드를 사용해서 트리거에 의해 영향을 받는 행에 있는 칼럼을 활성화 시킬 수 있다. -INSERT 트리거는 NEW.col_name만 사용, 이전에 삽입된 행(old row)은 없다. -DELETE 트리거는 OLD.col_name만사용, 새로운 행(new row)은 없다. -UPDATE 트리거는 행이 업데이트되기 전에 그 행에 있는 칼럼을 참조하도록 OLD.col_name을 사용하고,  행이 업데이트된 후에 그 행에 있는 칼럼을 참조하도록 NEW.col_name을 사용할 수 있다. -OLD로 표시된 칼럼은 읽기 전용이므로, SELECT권한이 있다면 참조 가능하나 수정은 불가능 -NEW로 표시된 칼럼은 SELECT권한이 있다면 참조 가능하고,  UPDATE권한이 있는 경우에는 SET NEW.col_name = value 을 가지고 그 값을 변경할 수 있다. -BEFORE 트리거에 있어서 AUTO_INCREMENT 칼럼에 대한 NEW의 값은 0이 되며, 이 값은 실제로 새로운 데이터가 삽입될 때 나오게 되는 자동 생성 시퀀스 숫자는 아니다. 2019-05-02 쉽게 배우는 MySQL 5.x

-BEGIN 블록 안에서는 조건문과 루프와 같은 스토어드 루틴 안에서 사용 가능한 다른 신텍스를 사용할 수도 있다. -OLD와 NEW는 트리거에 대한 MySQL의 확장 기능이다. -BEGIN ... END 명령문 구성을 사용해서 다중 명령문을 실행하는 트리거를 정의할 수 있다. -BEGIN 블록 안에서는 조건문과 루프와 같은 스토어드 루틴 안에서 사용 가능한 다른 신텍스를 사용할 수도 있다. -트리거 정의에서  명령문 구획 문자를 사용하기 위해서는 MySQL명령문 구획 문자(delimiter)를 재 정의하는 것이 필요하다. mysql> delimiter // mysql> CREATE TRIGGER upd_check BEFORE UPDATE ON account     -> FOR EACH ROW     -> BEGIN     ->     IF NEW.amount < 0 THEN     ->         SET NEW.amount = 0;     ->     ELSEIF NEW.amount > 100 THEN     ->         SET NEW.amount = 100;     ->     END IF;     -> END;// mysql> delimiter ; UPDATE 트리거는 각 행의 업데이트에 사용되는 새로운 값을 검사하도록 정의되며, 그 값이 0에서부터 100의 범위 내에 있도록 수정한다. BEFORE 트리거를 사용하는 이유는 값이 행을 업데이트하기 전에 검사되어야 하기 때문이다. 2019-05-02 쉽게 배우는 MySQL 5.x

트리거가 활성화 될 때 실행하는 명령문에는 몇 가지 제약 사항 -트리거는 데이터를 클라이언트에 돌려주는 스토어드 프로시저 또는 동적SQL을 사용하는 스토어드 프로시저를 호출하는 CALL명령문은 사용할 수 없다. -스토어드 프로시저가 OUT 또는 INOUT파라미터를 통해서 데이터를 트리거에 돌려주는 것은 허용된다. -트리거는 START TRANSACTION, COMMIT, 또는 ROLLBACK과 같은  확정적으로 트랜잭션을 시작 또는 종료하는 명령문은 사용할 수 없다. -MySQL 5.0.10 이전 버전에서는, 트리거는 이름을 가지고 테이블 직접 참조를 할 수 없었다. -MySQL은 트리거 실행 동안에 발생하는 에러를 아래와 같이 처리한다. -BEFORE 트리거가 실패할 경우, 대응하는 행에 대한 동작은 수행되지 않는다. -AFTER 트리거는 BEFORE 트리거가 존재하는 경우와 행에 대한 동작 모두 성공적으로 실행될 경우에만 실행된다. -BEFORE 또는 AFTER 트리거의 실행 동안 발생되는 에러는 트리거 호출을 일으키는 전체 명령문의 실패를 일으킨다. -트리거의 실패는 명령문에 의해 진행된 변경된 모든 데이터는 롤백된다. -비 트랜잭션 테이블(non-transactional tables)에 대해서는, 이러한 롤백은 일어날 수 없으며, 따라서 비록 명령문이 실패한다 하더라도, 에러가 발생한 시점 이전에 진행된 어떠한 데이터 변경도 그대로 유지된다. 2019-05-02 쉽게 배우는 MySQL 5.x