MS SQL Server의 트리거 예. 트리거(데이터베이스). DDL 트리거 및 해당 애플리케이션

방아쇠:

<Определение_триггера>::= (CREATE | ALTER) TRIGGER Trigger_name ON (테이블_이름 | 뷰_이름) ( ( ( FOR | AFTER | INSTEAD OF ) ( [ DELETE] [,] [ INSERT] [,] [ 업데이트] ) [ WITH APPEND ] [ NOT FOR REPLICATION ] AS sql_statement[...n] ) | ( (FOR | AFTER | INSTEAD OF ) ( [,] ) [ WITH APPEND] [ NOT FOR REPLICATION] AS ( IF UPDATE(열 이름) [ (AND | OR) UPDATE( 열 이름)] [...n] | IF (COLUMNS_UPDATES() (process_bit_operator) 변경_비트_마스크) (비교_비트_연산자) 비트_마스크 [...n]) sql_operator [...n] ) )

트리거는 현재 데이터베이스에서만 생성할 수 있지만 원격 서버에 있는 데이터베이스를 포함하여 트리거 내의 다른 데이터베이스에 액세스할 수 있습니다.

CREATE | 변경 트리거.

트리거 이름은 데이터베이스 내에서 고유해야 합니다. 또한 소유자 이름을 지정할 수 있습니다.

WITH ENCRYPTION 인수를 지정하면 서버는 관리자를 포함한 누구도 액세스하거나 읽을 수 없도록 트리거 코드를 암호화합니다. 암호화는 프로그래머의 지적 재산이거나 영업 비밀인 독점 데이터 처리 알고리즘을 숨기는 데 자주 사용됩니다.

트리거 유형

안에 SQL 서버트리거의 동작을 결정하는 두 가지 매개변수가 있습니다.

  • 후에. 트리거는 이를 호출한 명령이 성공적으로 완료된 후에 실행됩니다. 어떤 이유로든 명령을 성공적으로 완료할 수 없으면 트리거가 실행되지 않습니다. 사용자 요청 실행 및 트리거 실행의 결과로 발생하는 데이터 변경은 하나의 트랜잭션 본문에서 수행됩니다. 트리거가 롤백되면 사용자 변경 사항도 거부됩니다. 각 작업(INSERT, UPDATE, DELETE)에 대해 여러 AFTER 트리거를 정의할 수 있습니다. 테이블에 AFTER 트리거가 여러 개 있는 경우 sp_settriggerorder 시스템 저장 프로시저를 사용하여 먼저 실행될 트리거와 마지막으로 실행될 트리거를 지정할 수 있습니다. 기본적으로 SQL Server에서는 모든 트리거가 AFTER 트리거입니다.
  • 대신에 . 명령을 실행하는 대신 트리거가 호출됩니다. AFTER 트리거와 달리 INSTEAD OF 트리거는 테이블과 뷰 모두에 대해 정의할 수 있습니다. 각 INSERT, UPDATE, DELETE 작업에 대해 하나의 INSTEAD OF 트리거만 정의할 수 있습니다.

트리거는 응답하는 명령 유형에 따라 구별됩니다.

트리거에는 세 가지 유형이 있습니다.

  • INSERT TRIGGER – INSERT 명령을 사용하여 데이터를 삽입하려고 시도할 때 트리거됩니다.
  • UPDATE TRIGGER – UPDATE 명령을 사용하여 데이터를 변경하려고 시도할 때 트리거됩니다.
  • DELETE TRIGGER – DELETE 명령을 사용하여 데이터를 삭제하려고 시도할 때 트리거됩니다.

건축 [ 삭제] [,] [ 삽입] [,] [ 업데이트]그리고 에 대한 | 이후 | 대신에 ) ([,]트리거가 응답할 명령을 결정합니다. 생성 시 최소한 하나의 명령을 지정해야 합니다. 허용된 트리거 생성, 두 개 또는 세 가지 명령 모두에 응답합니다.

WITH APPEND를 사용하면 각 유형의 여러 트리거를 만들 수 있습니다.

~에 트리거 생성 NOT FOR REPLICATION 인수를 사용하면 복제 메커니즘에 의해 테이블이 수정되는 동안 실행이 금지됩니다.

AS sql_operator[...n] 구성은 트리거가 시작될 때 실행될 SQL 문 및 명령 집합을 정의합니다.

다음과 같은 여러 작업은 트리거 내에서 허용되지 않습니다.

  • 데이터베이스 생성, 수정 및 삭제
  • 회복 백업 복사본데이터베이스 또는 트랜잭션 로그.

해당 명령은 트리거가 실행된 트랜잭션이 롤백되면 롤백할 수 없으므로 실행이 허용되지 않습니다. 이 금지는 생성된 트리거의 기능에 어떤 식으로든 영향을 미칠 가능성이 없습니다. 예를 들어, 테이블 행을 변경한 후 트랜잭션 로그 백업을 복원해야 하는 상황을 찾기는 어렵습니다.

트리거 프로그래밍

레코드를 추가, 수정, 삭제하는 명령을 실행할 때 서버는 두 개의 특수 테이블을 생성합니다. 삽입됨그리고 삭제됨. 여기에는 트랜잭션이 완료될 때 삽입되거나 삭제될 행 목록이 포함됩니다. 삽입 및 삭제된 테이블의 구조는 트리거가 정의된 테이블의 구조와 동일합니다. 각 트리거는 삽입 및 삭제된 테이블의 자체 세트를 생성하므로 다른 트리거는 해당 테이블에 액세스할 수 없습니다. 트리거를 실행하게 만든 작업 유형에 따라 삽입된 테이블과 삭제된 테이블의 내용이 다를 수 있습니다.

  • INSERT 명령 – 삽입된 테이블에는 사용자가 테이블에 삽입하려는 모든 행이 포함됩니다. 삭제된 테이블에는 단일 행이 없습니다. 트리거가 완료되면 삽입된 테이블의 모든 행이 소스 테이블로 이동됩니다.
  • DELETE 명령 – 삭제된 테이블에는 사용자가 삭제하려는 모든 행이 포함됩니다. 트리거는 각 행을 확인하고 삭제가 허용되는지 여부를 결정할 수 있습니다. 삽입된 테이블에는 행이 없습니다.
  • UPDATE 명령 - 실행되면 삭제된 테이블에는 성공적으로 완료되면 삭제될 이전 행 값이 포함됩니다.

마지막 업데이트: 2017년 11월 9일

트리거는 테이블이나 뷰에서 특정 작업이 수행될 때, 특히 데이터를 추가, 변경 또는 삭제할 때, 즉 INSERT, UPDATE, DELETE 명령을 수행할 때 자동으로 호출되는 특별한 유형의 저장 프로시저입니다.

트리거의 공식 정의:

CREATE TRIGGER Trigger_name ON (테이블_이름 | 뷰_이름) (AFTER | INSTEAD OF) AS sql_expressions

트리거를 생성하려면 CREATE TRIGGER 문 뒤에 트리거 이름을 사용합니다. 일반적으로 트리거 이름은 작업 유형과 작업이 수행되는 테이블의 이름을 반영합니다.

각 트리거는 ON이라는 단어 뒤에 이름이 표시되는 특정 테이블이나 뷰와 연결됩니다.

그런 다음 트리거 유형이 설정됩니다. 다음 두 가지 유형 중 하나를 사용할 수 있습니다.

    AFTER: 작업이 완료된 후 실행됩니다. 테이블에 대해서만 정의됩니다.

    INSTEAD OF: 작업 대신 실행됩니다(즉, 추가, 변경, 삭제 등의 작업이 전혀 수행되지 않습니다). 테이블 및 뷰에 대해 정의됨

트리거 유형 뒤에는 트리거가 정의된 작업(INSERT, UPDATE 또는 DELETE)이 표시됩니다.

AFTER 트리거의 경우 UPDATE 및 INSERT와 같은 여러 작업에 동시에 사용할 수 있습니다. 이 경우 작업은 쉼표로 구분되어 표시됩니다. INSTEAD OF 트리거에 대해 하나의 작업만 정의할 수 있습니다.

그런 다음 AS라는 단어 뒤에는 실제로 트리거의 본문을 구성하는 일련의 SQL 표현식이 옵니다.

트리거를 만들어 보겠습니다. 다음 정의를 가진 productsdb 데이터베이스가 있다고 가정해 보겠습니다.

데이터베이스 생성 productdb; 제품DB를 사용하세요; CREATE TABLE 제품(Id INT IDENTITY PRIMARY KEY, ProductName NVARCHAR(30) NOT NULL, 제조업체 NVARCHAR(20) NOT NULL, ProductCount INT DEFAULT 0, Price MONEY NOT NULL);

데이터를 추가하고 업데이트할 때 실행되는 트리거를 정의해 보겠습니다.

제품DB 사용; GO CREATE TRIGGER Products_INSERT_UPDATE ON 제품 삽입 후 업데이트 제품 세트 가격 = 가격 + 가격 * 0.38 WHERE Id = (삽입된 ID 선택)

Products 테이블에 제품에 대한 데이터가 저장되어 있다고 가정해 보겠습니다. 그러나 제품 가격에는 부가가치세, 부패세 등 다양한 추가 요금이 포함되는 경우가 많습니다. 데이터를 추가하는 사람은 과세 기준과 관련된 이러한 모든 세부 사항을 알지 못할 수 있으며 순 가격을 결정합니다. 트리거를 사용하면 제품 가격을 일정 금액만큼 조정할 수 있습니다.

이렇게 하면 Products 테이블의 INSERT 또는 UPDATE 작업 시 트리거가 실행됩니다. Trigger 자체가 상품의 가격을 변경하게 되며, 추가되거나 변경된 상품을 얻으려면 ID로 이 상품을 찾습니다. 그런데 그러한 제품의 ID는 어떤 가치를 가져야 할까요? 사실 데이터를 추가하거나 변경하면 삽입된 중간 테이블에 저장됩니다. 자동으로 생성됩니다. 그리고 이를 통해 추가/변경된 제품에 대한 데이터를 얻을 수 있습니다.

그리고 Products 테이블에 제품을 추가한 후 실제로 제품 가격은 추가 시 결정된 가격보다 약간 더 높습니다.

트리거 제거

트리거를 제거하려면 DROP TRIGGER 명령을 사용해야 합니다.

DROP TRIGGER 제품_INSERT_UPDATE

트리거 비활성화

트리거를 일시 중지하고 싶지만 완전히 제거하고 싶지는 않은 경우가 있습니다. 이 경우 DISABLE TRIGGER 명령을 사용하여 일시적으로 비활성화할 수 있습니다.

제품에 대한 TRIGGER 제품_INSERT_UPDATE 비활성화

트리거가 필요한 경우 ENABLE TRIGGER 명령을 사용하여 활성화할 수 있습니다.

제품에 대해 TRIGGER Products_INSERT_UPDATE 활성화

방아쇠테이블의 레코드를 변경, 삭제 또는 추가할 때 DBMS에 의해 자동으로 호출되는 데이터베이스 프로시저와 유사한 서브루틴입니다. 트리거는 프로그램에서 액세스할 수 없고 매개변수를 전달하거나 결과를 받을 수도 없습니다. 대부분의 경우 트리거는 데이터베이스에서 참조 무결성 및 계단식 작업을 유지하는 데 사용됩니다. 계단식 삭제 및 업데이트 작업을 정의하고 테이블이 선언될 때 생성되는 참조 사양도 트리거를 통해 구현되지만 이러한 트리거의 텍스트는 편집할 수 없습니다.

트리거의 목적

변경 방지(예: 송장 발송 후 변경 방지)
. 변경 사항을 기록합니다(예: 이전 데이터의 복사본 보관).
. 변경 사항을 감사합니다(예: 변경 사항과 관련된 사용자 및 역할에 대한 로그 유지).
. 변경 사항을 캡처합니다(예를 들어 모든 변경 사항이 클라이언트 시계가 아닌 서버 시계에 따라 날짜가 지정되었는지 확인).
. 비즈니스 규칙 구현.
. 데이터 복제(예: 이후 버전에서 다른 데이터베이스로 전송될 모든 변경 사항에 대한 기록 저장)
. 생산성 향상(예: 쿼리 속도를 높이기 위해 각 거래 세부 사항 이후 잔액 업데이트)

트리거 선언

트리거 생성 {이전|이후} {삭제|삽입|업데이트 [ ]} 참조 {오래된 {[]|테이블 [처럼] } 새로운 {행|테이블} [처럼] }] [각각 {명령문|행 [언제 ]}]
[원자 시작]

[]

키워드

. 이전|이후– 트리거 시작 시간 – 이전 | 업데이트 작업 후.
. 삭제|삽입|업데이트= 이벤트를 트리거합니다.
. 각 행에 대해– 각 라인에 대해(라인 트리거 다음에는 WHEN).
. 각 명세서에 대해– 전체 팀용(기본적으로 유효함).
. 참조– 이전 및 | 또는 새 줄 및 | 또는 트리거로 액세스할 수 있는 테이블입니다.

트리거 제한

트리거 본문에는 다음 문이 포함될 수 없습니다.
. 데이터베이스 개체(테이블, 도메인 등) 정의, 삭제 및 변경
. 트랜잭션 처리(COMMIT, ROLLBACK)
. 데이터베이스에 대한 연결 및 연결 해제(CONNECT, DISCONNECT)

응용 프로그램의 특징
. 트리거는 다른 모든 (선언적) 무결성 검사가 적용된 후에 실행되며 테스트 기준이 매우 복잡할 때 유용합니다. 선언적 검사가 업데이트 작업을 거부하면 트리거가 실행되지 않습니다. 트리거는 트랜잭션 컨텍스트에서 작동하지만 FK 제약 조건은 그렇지 않습니다.
. 트리거로 인해 기본 테이블이 추가로 수정되는 경우 대부분 재귀 실행으로 이어지지는 않지만 이를 명확히 해야 합니다. SQL Server 2005에서는 OPTION(MAXRECURSIV 3) 키워드를 사용하여 최대 255개 수준까지 재귀를 지정하는 기능을 제공합니다.
. 대형 이진 열(BLOB)을 처리할 때는 일반적으로 트리거가 실행되지 않습니다.
. 데이터가 업데이트될 때마다 DBMS는 자동으로 소위 트리거를 생성한다는 점을 기억해야 합니다. 가상 테이블, 이는 서로 다른 DBMS에서 서로 다른 이름을 갖습니다. InterBase와 Oracle에서는 새로운 것과 오래된 것입니다. SQL Server에서 - 삽입 및 삭제되었습니다. 또한 데이터가 변경되면 둘 다 생성됩니다. 이러한 테이블에는 업데이트되는 테이블과 동일한 이름 및 도메인을 가진 동일한 수의 열이 있습니다. SQL Server 2005 DBMS는 OUTPUT Inserted.ID,... INTO @ 키워드를 사용하여 데이터를 삽입해야 하는 임시 테이블을 비롯한 테이블을 지정하는 기능을 제공합니다.
. 많은 DBMS에서는 여러 작업에 대한 트리거를 동시에 선언하는 것이 허용됩니다. 다양한 작업에 대한 다양한 반응을 구현하기 위해 Oracle은 해당 업데이트 유형에 대해 True를 반환하는 삭제, 삽입, 업데이트 조건자를 제공합니다.
. Oracle DBMS에서는 업데이트 트리거에 대한 열 목록(업데이트 후)을 지정할 수 있습니다. 그러면 해당 열의 값만 변경될 때만 트리거가 호출됩니다.
. 각 트리거 이벤트에 대해 여러 트리거를 선언할 수 있으며(Oracle에는 테이블당 12개의 트리거가 있음) 일반적으로 트리거가 실행되는 순서는 생성된 순서에 따라 결정됩니다. InterBase와 같은 일부 DBMS에서는 추가 POSITION 키워드를 사용하여 시작 순서를 지정합니다. 일반적으로 트리거는 먼저 각 명령에 대해 실행된 다음 각 라인에 대해 실행되어야 합니다.
. 트리거는 서로 내장될 수 있습니다. 따라서 SQL Server에서는 32개의 중첩 수준을 허용합니다(@@NextLevel 전역 변수를 사용하여 중첩 수준을 결정할 수 있음).

트리거의 단점

복잡성. 데이터베이스의 데이터에 대해 일부 작업을 수행하면 데이터베이스의 설계, 구현 및 관리가 복잡해집니다.
. 몰래 하기 기능성사용자로부터. 일부 기능이 숨겨져 있으면 애플리케이션을 현대화하기가 어렵습니다.
. 성능에 미치는 영향. 트리거 수가 적을수록 데이터 처리 시간이 늘어납니다.

트리거 편집 및 삭제

트리거를 제거하려면 DROP TRIGGER 문을 사용하세요.
. 트리거를 변경하려면 ALTER TRIGGER... 문을 사용하세요.
. 트리거 비활성화
예를 들어 일괄 로드 중에 트리거를 비활성화해야 하는 경우도 있습니다. 다수의 DBMS가 해당 기능을 제공합니다. Oracle 및 SQL Server의 키워드는 DISABLE|ENABLE이고 InterBase의 ALTER TRIGGER 문의 INACTIVE|ACTIVE입니다.

산업용 서버의 특징

1) 인터베이스/파이어버드

트리거 생성 을 위한 {활성|비활성} {이전|이후} {삽입|삭제|업데이트} [위치 ]
처럼 [변수 선언 [()]]
시작하다

예:

고객을 위한 트리거 BF_Del_Cust 생성
위치 1을 삭제하기 전에 활성화됨
시작하다
Orders.CNum=Customer.CNum인 주문에서 삭제;
끝;

2) SQL 서버

트리거 생성 [암호화 포함] {이후|대신} {삽입|업데이트|삭제}
처럼

B1을 사용하십시오.
가다
삽입, 업데이트 후 고객에 대한 트리거 InUpCust1 생성
AS RAISEERROR('고객 테이블이 변경되었습니다.');

추가 유형의 트리거

Oracle과 SQL Server는 업데이트되지 않은 뷰에 대한 트리거를 생성(교체)하는 기능을 제공합니다. 이를 위해 INSTEAD OF 키워드가 제공됩니다.

다음과 같이 삽입하는 대신 트리거를 생성하세요.

뷰를 사용하여 데이터를 업데이트하고 작업을 수행하고 업데이트되지 않은 뷰를 처리하려는 클라이언트 시도를 모니터링할 수 있습니다.
. SQL Server DBMS는 실제로 모든 작업을 중지하고 메시지를 발행하는 롤백 트리거를 제공합니다.

롤백 트리거

"데이터베이스" 분야에 대한 강의 노트

주제: 프로시저 및 트리거

(MS SQL Server를 예로 사용)

컴파일러: L. V. Shchegoleva

PetrSU, 응용수학 및 사이버네틱스학과

소개................................................. ....... .................................................. ............. ......

데이터베이스 구조 설명.................................................. ........................

절차의 개념.................................................................. ....................................

프로시저 작업을 위한 명령....................................................................... ...................... .............

트리거의 개념.................................................. ....... ..................................................

트리거 작업을 위한 명령.................................................................. ................................... ...................

트리거 구현의 예.......................................................... ..... ...............

예시 1.......................................................... ... ...................................................

예시 2.......................................................... ... ...................................................

예시 3.......................................................... ... ...................................................

예시 4.......................................................... ... ...................................................

실시예 5.......................................................... ... ...................................................

PetrSU, 응용수학 및 사이버네틱스학과

소개

안에 이 매뉴얼은 프로시저 및 트리거 생성을 위한 명령의 예를 제공합니다.

와 함께 그들의 작업에 대한 설명.

모든 명령은 MS SQL Server 구문으로 작성됩니다.

구조가 설명된 데이터베이스에 대한 예가 제공됩니다.

섹션 1.

PetrSU, 응용수학 및 사이버네틱스학과

1 데이터베이스 구조 설명

tblFaculty 테이블에는 대학의 교수진에 대한 정보가 포함되어 있습니다.

이름

설명

기인하다

교수진 ID

교수명

학장의 성명

학장실 전화번호

학장실 전화번호

교직원 수

tblStudent 테이블에는 한 학년도의 대학생에 대한 정보가 포함되어 있습니다.

속성 이름

설명

학생 아이디

학생의 이름

장학금

tblGroup 테이블에는 한 학년도의 대학생 그룹에 대한 정보가 포함되어 있습니다.

속성 이름

설명

그룹 ID

두목

그룹 번호

학부

tblSubject 테이블에는 해당 교수진의 학생들이 한 학년 동안 공부한 학문 분야에 대한 정보가 포함되어 있습니다.

속성 이름

설명

아이템 ID

상품명

강의시간

연습시간

학부

"데이터베이스" 분야에 대한 강의 노트(프로시저 및 트리거)

PetrSU, 응용수학 및 사이버네틱스학과

tblRoom 테이블에는 대학 강의실에 대한 정보가 포함되어 있습니다.

tblSchedule 테이블에는 학생 그룹의 일정에 대한 정보가 포함되어 있습니다.

속성 이름

설명

식별자

청중

요일

선생님의 이름

PetrSU, 응용수학 및 사이버네틱스학과

2 절차의 개념

프로시저는 DBMS 내부 언어로 작성된 프로그램으로 데이터베이스에 독립된 객체로 저장된다. 이러한 프로시저를 일반적으로 저장, 첨부 프로시저라고 합니다. 프로시저는 응용프로그램에 의해 호출될 수 있습니다. 프로시저는 데이터베이스 서버에서 실행됩니다. 프로시저는 매개변수와 오류 메시지를 포함한 반환 값을 포함할 수 있습니다.

절차 사용의 이점:

중앙 집중식 데이터 액세스 제어;

응용 프로그램은 프로시저를 호출하여 프로그램 작성 시간을 단축할 수 있으며, 프로시저가 수정되면 이를 호출하는 모든 프로그램은 새로운 코드, 코드 최적화를 받게 됩니다.

시스템의 네트워크 트래픽을 줄입니다.데이터를 교환하는 대신 프로시저 이름과 해당 매개변수만 전달하여 프로시저를 서버에서 실행하는 "클라이언트-서버"

사용자에게 많은 기능을 숨김 특정 장치더 큰 데이터 독립성을 보장하는 데이터베이스;

데이터 보안이 강화되면 사용자는 전화할 권리가 있을 수 있습니다.

프로시저이지만 이 프로시저에 의해 호출되는 데이터를 조작하지는 않습니다. 단점: 절차 구현에 대한 표준이 부족합니다.

PetrSU, 응용수학 및 사이버네틱스학과

3 MS SQL Server의 프로시저 작업을 위한 명령

프로시저 만들기

절차 만들기<имя процедуры>

[@<имя параметра> <тип данных> , ...]

시작하다

<операторы>

MS SQL Server의 모든 변수 이름은 기호로 시작해야 합니다.

프로시저 호출

실행하다<имя процедуры> [{@<имя переменной> | <значение параметра>}, ...]

프로시저 제거

낙하 절차<имя процедуры>

이 프로시저는 식별자가 @id 프로시저의 입력 매개 변수인 학과에 등록된 학생 수를 계산하고 이 값을 @total_sum 매개 변수에 반환합니다.

프로시저 prStudentsOfFaculty @id int, @total_sum int 출력 AS 생성

@total_sum = 0으로 설정

@total_sum 설정 = (Select count(*) From tblStudent, tblGroup Where (tblStudent.GroupId = tblGroup.GroupId) 및 (tblGroup.FacultyId = @id)) End

PetrSU, 응용수학 및 사이버네틱스학과

4 트리거의 개념

트리거(규칙)는 테이블에 연결되어 테이블에 업데이트 작업(테이블 레코드 추가, 삭제, 변경)이 수행될 때 데이터베이스 관리 시스템에 의해 자동으로 호출됩니다.

MS SQL Server에서 트리거 구현 기능

MS SQL 서버에서:

트리거는 작업이 수행된 후 또는 작업이 수행되는 대신 호출될 수 있습니다.

작업이 수행되어야 하는 모든 테이블 레코드에 대해 트리거가 한 번 호출됩니다.

따라서 수정되는 레코드는 트리거가 호출될 때 자동으로 생성되는 두 개의 테이블에 저장됩니다.

o 삽입된 테이블 – 변경되거나 추가된 테이블 레코드를 포함합니다.

o 삭제된 테이블 – 변경이 이루어지거나 테이블 레코드가 삭제되기 전의 레코드를 포함합니다.

삽입 작업에 대해 정의된 트리거 본문에서는 테이블만 사용할 수 있습니다.

삭제 작업에 대해 정의된 트리거 본문에서는 테이블만 사용할 수 있습니다.

업데이트 작업에 대해 정의된 트리거 본문에서 두 테이블을 모두 사용할 수 있습니다.

삽입 및 삭제;

동일한 이벤트에 대해 트리거를 원하는 만큼 생성할 수 있으며 무작위 순서(생성된 순서대로)로 호출됩니다.

PetrSU, 응용수학 및 사이버네틱스학과

5 트리거 작업을 위한 명령

창조

트리거 생성<имя триггера>에<имя таблицы>

(를 위해 | 이후 | 대신에)

[삽입] [,] [업데이트] [,] [삭제] AS

선언하다 @<имя переменной> <тип данных>, ...

시작하다<операторы>

제거

드롭 트리거<имя триггера>

PetrSU, 응용수학 및 사이버네틱스학과

6 트리거 구현의 예

주제 영역 제한:학생의 장학금은 이전 장학금의 5% 이상 인상될 수 없습니다.

트리거 생성 tgrStudentGrantUpdate

업데이트 후 ON tblStudent

DECLARE @Grant_old float, @Grant_new float, @Id int;

@Grant_old 선택 = 삭제된 항목에서 부여

삽입됨에서 @Grant_new = Grant, @Id = StudentId를 선택합니다.

IF(@Grant_new - @Grant_old > 0.05 * @Grant_old)

업데이트 tblStudent SET 부여 = 1.05 * @Grant_old

여기서 StudentId = @Id

tgrStudentGrantUpdate 트리거가 tblStudent 테이블에 대해 생성되었습니다. 데이터 변경 작업이 완료된 후 트리거가 실행됩니다.

안에 트리거는 세 가지 로컬 변수를 정의합니다. 기존 학생 장학금을 저장하는 @Grant_old(실제 유형), 새 학생 장학금을 저장하는 @Grant_new(실제 유형), 학생 식별자를 저장하는 @Id(정수 유형)입니다.

트리거가 호출되면 DBMS는 두 개의 테이블을 생성합니다. 수정 전 수정된 레코드가 포함된 삭제된 테이블과 수정된 후 수정된 레코드가 포함된 삽입된 테이블입니다.

안에 트리거 본문에서는 먼저 변경이 이루어지기 전에 삭제된 테이블, 즉 이전 장학금에서 학생의 장학금 값을 검색한 다음 변경 후 삽입된 테이블에서 학생의 장학금 값을 검색합니다. 즉, 새로운 장학금이 변경됩니다. 삽입된 테이블에서 새 장학금을 검색하는 동시에 학생 식별자도 검색됩니다. 학생 ID는 삭제된 테이블에서 쉽게 검색할 수 있습니다.

다음으로 Trigger Body에서는 장학금 변동 금액에 대한 조건을 확인합니다. 장학금이 5% 이상 변경된 경우 트리거는 데이터를 조정하여 학생의 이전 장학금 가치에 비해 장학금을 5%만 늘립니다. 이 작업은 해당 학생에 대한 tblStudent 테이블에서 업데이트 작업을 호출하여 수행됩니다.

트리거의 정의, 사용 범위, 데이터 무결성을 보장하는 트리거의 위치 및 역할이 제공됩니다. 트리거 유형이 설명되어 있습니다. 트리거를 생성, 변경, 삭제하는 연산자가 고려됩니다. 트리거 프로그래밍은 무결성 제약 조건을 구현하고 통계 데이터를 수집하기 위한 트리거 생성의 예를 통해 설명됩니다.

SQL 언어 표준의 트리거 정의

트리거는 저장 프로시저의 한 유형입니다. 테이블에서 DML(데이터 조작 언어) 연산자가 실행될 때 실행됩니다. 트리거는 데이터 무결성을 확인하고 트랜잭션을 롤백하는 데 사용됩니다.

트리거는 관계형 데이터베이스 내에서 특정 이벤트가 발생하면 실행되는 컴파일된 SQL 프로시저입니다. 트리거 사용은 대부분 데이터베이스 사용자에게 매우 편리합니다. 하지만 이를 사용하면 I/O 작업에 대한 추가 리소스 비용이 발생하는 경우가 많습니다. 저장 프로시저나 응용 프로그램을 사용하여 동일한 결과(오버헤드가 훨씬 적음)를 얻을 수 있는 경우 트리거를 사용하는 것은 실용적이지 않습니다.

트리거는 데이터베이스의 데이터 무결성을 유지하는 데 사용되는 특수 SQL 서버 도구입니다. 무결성 제약 조건, 규칙 및 기본값이 항상 원하는 수준의 기능을 달성하는 것은 아닙니다. 신뢰성과 현실성을 보장하기 위해 복잡한 데이터 검증 알고리즘을 구현해야 하는 경우가 많습니다. 또한 필요에 따라 관련 데이터를 수정할 수 있도록 테이블 값의 변경 사항을 모니터링해야 하는 경우도 있습니다. 트리거는 규칙, 표준 값 등에 따라 모든 작업이 완료된 후 적용되는 일종의 필터라고 생각할 수 있습니다.

트리거는 트리거가 연결된 테이블의 데이터를 변경하려고 시도할 때 서버에서 자동으로 시작되는 특수한 유형의 저장 프로시저입니다. 각 트리거는 특정 테이블과 연결됩니다. 모든 데이터 수정은 하나의 트랜잭션으로 간주됩니다. 오류나 데이터 무결성 위반이 감지되면 트랜잭션이 롤백됩니다. 따라서 변경은 금지됩니다. 트리거에 의해 이미 변경된 내용도 취소됩니다.

데이터베이스 소유자만 트리거를 생성할 수 있습니다. 이러한 제한을 통해 테이블 ​​구조, 다른 개체를 테이블에 연결하는 방법 등이 실수로 변경되는 것을 방지할 수 있습니다.

방아쇠는 매우 유용하면서도 동시에 위험한 도구입니다. 따라서 해당 작업의 논리가 올바르지 않으면 전체 데이터베이스가 쉽게 파괴될 수 있으므로 트리거를 매우 주의 깊게 디버깅해야 합니다.

일반 루틴과 달리 트리거는 발생할 때마다 암시적으로 실행됩니다. 트리거 이벤트, 게다가 인수가 없습니다. 이를 작동시키는 것을 방아쇠 발사라고도 합니다. 트리거를 사용하면 다음 목표가 달성됩니다.

  • 입력된 데이터의 정확성을 검증하고, 불가능하지는 않더라도 테이블에 설정된 무결성 제약 조건을 사용하여 유지하기 어려운 복잡한 데이터 무결성 제약 조건을 적용합니다.
  • 특정 방식으로 구현된 테이블을 업데이트할 때 특정 작업을 수행하도록 상기시키는 경고를 발행합니다.
  • 변경된 사항과 이를 수행한 사람에 대한 정보를 기록하여 감사 정보 축적
  • 복제 지원.

CREATE TRIGGER 명령의 기본 형식은 다음과 같습니다.

<Определение_триггера>::= 이전에 TRIGGER Trigger_name 생성 | 후에<триггерное_событие>에<имя_таблицы> <тело_триггера>

트리거 이벤트테이블의 행 삽입, 삭제, 업데이트로 구성됩니다. 후자의 경우 트리거 이벤트특정 테이블 열 이름을 지정할 수 있습니다. 트리거 시간은 다음을 사용하여 결정됩니다. 키워드 BEFORE(트리거와 연관된 이벤트가 실행되기 전에 트리거가 실행됨) 또는 AFTER(실행된 후)입니다.

트리거에 의해 수행되는 작업은 지정된 이벤트에 포함된 각 행(FOR EACH ROW)에 대해 지정되거나 각 이벤트에 대해 한 번만(FOR EACH STATEMENT) 지정됩니다.

지정 <список_старых_или_новых_псевдонимов> 오래되거나 오래된 것과 같은 구성 요소를 나타냅니다. 새 줄(OLD/NEW) 오래되었거나 새 테이블(기존 테이블/새 테이블). 삽입 이벤트에는 이전 값이 적용되지 않고, 삭제 이벤트에는 새 값이 적용되지 않음이 분명합니다.

올바르게 사용하면 트리거는 매우 강력한 메커니즘이 될 수 있습니다. 주요 장점은 표준 기능이 데이터베이스 내에 저장되고 업데이트될 때마다 일관되게 활성화된다는 것입니다. 이는 애플리케이션을 크게 단순화할 수 있습니다. 그러나 트리거의 본질적인 단점은 언급할 가치가 있습니다.

  • 복잡성: 일부 기능이 데이터베이스로 이동되면 설계, 구현 및 관리 작업이 더욱 복잡해집니다.
  • 숨겨진 기능: 일부 기능을 데이터베이스로 이동하고 이를 하나 이상의 트리거로 저장하면 일부 기능이 사용자에게 숨겨지는 경우가 있습니다. 이는 어느 정도 작업을 단순화하지만 불행하게도 의도하지 않은, 잠재적으로 원치 않는 해로운 부작용을 일으킬 수 있습니다. 이 경우 사용자는 데이터베이스에서 발생하는 모든 프로세스를 제어할 수 없기 때문입니다.
  • 성능 영향: 데이터베이스 상태를 변경하기 위해 각 명령을 실행하기 전에 DBMS는 트리거 조건을 확인하여 이 명령에 대해 트리거가 실행되어야 하는지 여부를 결정해야 합니다. 이러한 계산을 수행하면 DBMS의 전반적인 성능에 영향을 미치며, 부하가 최고조에 달할 때 특히 그 감소가 눈에 띄게 나타날 수 있습니다. 분명히 트리거 수가 증가하면 해당 작업과 관련된 간접비도 증가합니다.

잘못 작성된 트리거는 교착 상태와 같은 심각한 문제로 이어질 수 있습니다. 트리거는 오랜 기간 동안 많은 리소스를 차단할 수 있으므로 액세스 충돌을 최소화하는 데 특별한 주의를 기울여야 합니다.

MS SQL Server 환경에서 트리거 구현

MS SQL Server DBMS 구현에서는 다음 트리거 생성 또는 수정 연산자를 사용합니다.

<Определение_триггера>::= (CREATE | ALTER) TRIGGER Trigger_name ON (테이블_이름 | 뷰_이름) ( ( ( FOR | AFTER | INSTEAD OF ) ( [ DELETE] [,] [ INSERT] [,] [ 업데이트] ) [ WITH APPEND ] [ NOT FOR REPLICATION ] AS sql_statement[...n] ) | ( (FOR | AFTER | INSTEAD OF ) ( [,] ) [ WITH APPEND] [ NOT FOR REPLICATION] AS ( IF UPDATE(열 이름) [ (AND | OR) UPDATE( 열 이름)] [...n] | IF (COLUMNS_UPDATES() (process_bit_operator) 변경_비트_마스크) (비교_비트_연산자) 비트_마스크 [...n]) sql_operator [...n] ) )

트리거는 현재 데이터베이스에서만 생성할 수 있지만 원격 서버에 있는 데이터베이스를 포함하여 트리거 내의 다른 데이터베이스에 액세스할 수 있습니다.

CREATE | 변경 트리거.

트리거 이름은 데이터베이스 내에서 고유해야 합니다. 또한 소유자 이름을 지정할 수 있습니다.

WITH ENCRYPTION 인수를 지정하면 서버는 관리자를 포함한 누구도 액세스하거나 읽을 수 없도록 트리거 코드를 암호화합니다. 암호화는 프로그래머의 지적 재산이거나 영업 비밀인 독점 데이터 처리 알고리즘을 숨기는 데 자주 사용됩니다.

트리거 유형

SQL Server에는 트리거 동작을 결정하는 두 가지 옵션이 있습니다.

  • 후에. 트리거는 이를 호출한 명령이 성공적으로 완료된 후에 실행됩니다. 어떤 이유로든 명령을 성공적으로 완료할 수 없으면 트리거가 실행되지 않습니다. 사용자 요청 실행 및 트리거 실행의 결과로 발생하는 데이터 변경은 하나의 트랜잭션 본문에서 수행됩니다. 트리거가 롤백되면 사용자 변경 사항도 거부됩니다. 각 작업(INSERT, UPDATE, DELETE)에 대해 여러 AFTER 트리거를 정의할 수 있습니다. 테이블에 AFTER 트리거가 여러 개 있는 경우 sp_settriggerorder 시스템 저장 프로시저를 사용하여 먼저 실행될 트리거와 마지막으로 실행될 트리거를 지정할 수 있습니다. 기본적으로 SQL Server에서는 모든 트리거가 AFTER 트리거입니다.
  • 대신에 . 명령을 실행하는 대신 트리거가 호출됩니다. AFTER 트리거와 달리 INSTEAD OF 트리거는 테이블과 뷰 모두에 대해 정의할 수 있습니다. 각 INSERT, UPDATE, DELETE 작업에 대해 하나의 INSTEAD OF 트리거만 정의할 수 있습니다.

트리거는 응답하는 명령 유형에 따라 구별됩니다.

트리거에는 세 가지 유형이 있습니다.

  • INSERT TRIGGER – INSERT 명령을 사용하여 데이터를 삽입하려고 시도할 때 트리거됩니다.
  • UPDATE TRIGGER – UPDATE 명령을 사용하여 데이터를 변경하려고 시도할 때 트리거됩니다.
  • DELETE TRIGGER – DELETE 명령을 사용하여 데이터를 삭제하려고 시도할 때 트리거됩니다.

건축 [ 삭제] [,] [ 삽입] [,] [ 업데이트]그리고 에 대한 | 이후 | 대신에 ) ([,]트리거가 응답할 명령을 결정합니다. 생성 시 최소한 하나의 명령을 지정해야 합니다. 허용된 트리거 생성, 두 개 또는 세 가지 명령 모두에 응답합니다.

WITH APPEND를 사용하면 각 유형의 여러 트리거를 만들 수 있습니다.

~에 트리거 생성 NOT FOR REPLICATION 인수를 사용하면 복제 메커니즘에 의해 테이블이 수정되는 동안 실행이 금지됩니다.

AS sql_operator[...n] 구성은 트리거가 시작될 때 실행될 SQL 문 및 명령 집합을 정의합니다.

다음과 같은 여러 작업은 트리거 내에서 허용되지 않습니다.

  • 데이터베이스 생성, 수정 및 삭제
  • 데이터베이스 또는 트랜잭션 로그 백업을 복원합니다.

해당 명령은 트리거가 실행된 트랜잭션이 롤백되면 롤백할 수 없으므로 실행이 허용되지 않습니다. 이 금지는 생성된 트리거의 기능에 어떤 식으로든 영향을 미칠 가능성이 없습니다. 예를 들어, 테이블 행을 변경한 후 트랜잭션 로그 백업을 복원해야 하는 상황을 찾기는 어렵습니다.

트리거 프로그래밍

레코드를 추가, 수정, 삭제하는 명령을 실행할 때 서버는 두 개의 특수 테이블을 생성합니다. 삽입됨그리고 삭제됨. 여기에는 트랜잭션이 완료될 때 삽입되거나 삭제될 행 목록이 포함됩니다. 삽입 및 삭제된 테이블의 구조는 트리거가 정의된 테이블의 구조와 동일합니다. 각 트리거는 삽입 및 삭제된 테이블의 자체 세트를 생성하므로 다른 트리거는 해당 테이블에 액세스할 수 없습니다. 트리거를 실행하게 만든 작업 유형에 따라 삽입된 테이블과 삭제된 테이블의 내용이 다를 수 있습니다.

  • INSERT 명령 – 삽입된 테이블에는 사용자가 테이블에 삽입하려는 모든 행이 포함됩니다. 삭제된 테이블에는 단일 행이 없습니다. 트리거가 완료되면 삽입된 테이블의 모든 행이 소스 테이블로 이동됩니다.
  • DELETE 명령 – 삭제된 테이블에는 사용자가 삭제하려는 모든 행이 포함됩니다. 트리거는 각 행을 확인하고 삭제가 허용되는지 여부를 결정할 수 있습니다. 삽입된 테이블에는 행이 없습니다.
  • UPDATE 명령 - 실행되면 삭제된 테이블에는 트리거가 성공적으로 완료되면 삭제될 이전 행 값이 포함됩니다. 삽입된 테이블에는 새로운 행 값이 포함됩니다. 이러한 행은 트리거가 성공적으로 실행된 후 소스 테이블에 추가됩니다.

트리거가 성공적으로 완료될 때 수정될 행 수에 대한 정보를 얻으려면 @@ROWCOUNT; 함수를 사용할 수 있습니다. 마지막 명령으로 처리된 행 수를 반환합니다. 특정 줄을 변경하려고 할 때가 아니라 변경 명령이 실행되는 순간 트리거가 실행된다는 점을 강조해야 합니다. 이러한 명령 중 하나는 많은 행에 영향을 미치므로 트리거는 이러한 행을 모두 처리해야 합니다.

트리거가 삽입, 수정 또는 삭제되는 100개의 행 중 하나만 특정 조건을 충족하지 않는다는 것을 감지하면 행이 삽입, 수정 또는 삭제되지 않습니다. 이 동작은 트랜잭션 요구 사항으로 인해 발생합니다. 즉, 모든 수정을 수행해야 하거나 전혀 수정하지 않아야 합니다.

트리거는 암시적으로 정의된 트랜잭션으로 실행되므로 트랜잭션 제어 명령을 트리거 내에서 사용할 수 있습니다. 특히 무결성 제약 조건 위반이 감지되면 ROLLBACK TRANSACTION 명령을 사용하여 트리거를 중단하고 사용자가 시도한 모든 변경 사항을 취소해야 합니다.

COLUMNS_UPDATED() 함수를 사용하면 트리거 실행을 유발한 INSERT 또는 UPDATE 명령으로 수정된 열 목록을 얻을 수 있습니다. 이진수를 반환하며, 각 비트는 최하위 비트부터 시작하여 테이블의 한 열에 해당합니다(테이블이 생성될 때의 열 순서대로). 비트가 "1"로 설정되면 해당 열이 수정된 것입니다. 또한 UPDATE 함수(column_name)에 의해 컬럼이 변경되었음을 확인합니다.

을 위한 트리거 제거명령이 사용됩니다

DROP TRIGGER(trigger_name) [,...n]

다음은 트리거 사용의 예입니다.

예제 14.1.트리거를 사용하여 가치에 대한 제한 구현. 거래 테이블에 추가된 항목에서 판매된 제품 수량은 창고 테이블의 잔액 이상이어야 합니다.

Deal 테이블에 레코드를 삽입하는 명령은 예를 들어 다음과 같습니다.

거래 가치에 삽입(3,1,-299,"2002/01/08")

생성된 트리거는 다음과 같은 방식으로 실행에 반응해야 합니다. 창고 테이블에서 제품 잔액이 입력된 코드가 있는 제품의 판매 수량보다 적은 경우 명령을 취소해야 합니다(예: 제품 코드 = 3). ). 삽입된 기록에 제품의 수량은 제품이 공급된 경우에는 "+" 기호로 표시되고, 판매된 경우에는 "-" 기호로 표시됩니다. 제시된 트리거는 추가된 레코드를 하나만 처리하도록 구성됩니다.

CREATE TRIGGER Trigger_ins ON 트랜잭션 FOR INSERT AS IF @@ROWCOUNT=1 BEGIN IF NOT EXISTS(SELECT * FROM 삽입된 WHERE -inserted.Quantity<=ALL(SELECT Склад.Остаток FROM Склад,Сделка WHERE Склад.КодТовара= Сделка.КодТовара)) BEGIN ROLLBACK TRAN PRINT "Отмена поставки: товара на складе нет" END END 예제 14.1. 트리거를 사용하여 값에 대한 제한을 구현합니다.

예제 14.2.트리거를 사용하여 통계 데이터를 수집합니다.

Deal 테이블에 레코드를 삽입하는 작업을 처리하는 트리거를 만듭니다(예: 다음 명령).

거래 가치에 삽입(3,1,200,"2002/01/08")

코드 3이 있는 제품은 코드 1이 있는 고객으로부터 200개 단위로 공급됩니다.

아이템을 판매하거나 수령할 때 그에 맞춰 재고 수량을 조정해야 합니다. 제품의 재고가 아직 없는 경우 창고 테이블에 해당 항목을 추가해야 합니다. 트리거는 추가된 행 하나만 처리합니다.

ALTER TRIGGER Trigger_ins ON Transaction FOR INSERT AS DECLARE @x INT, @y INT IF @@ROWCOUNT=1 --상품 배송에 대한 레코드가 거래 테이블에 추가됩니다. BEGIN --판매된 상품 수량은 다음과 같아야 합니다. -- 존재하지 않는 경우 창고 테이블의 잔액보다 적습니다(SELECT * FROM 삽입된 WHERE -inserted.Quantity< =ALL(SELECT Склад.Остаток FROM Склад,Сделка WHERE Склад.КодТовара= Сделка.КодТовара)) BEGIN ROLLBACK TRAN PRINT "откат товара нет " END --если записи о поставленном товаре еще нет, --добавляется соответствующая запись --в таблицу Склад IF NOT EXISTS (SELECT * FROM Склад С, inserted i WHERE С.КодТовара=i.КодТовара) INSERT INTO Склад (КодТовара,Остаток) ELSE --если запись о товаре уже была в таблице --Склад, то определяется код и количество --товара издобавленной в таблицу Сделка записи BEGIN SELECT @y=i.КодТовара, @x=i.Количество FROM Сделка С, inserted i WHERE С.КодТовара=i.КодТовара --и производится изменения количества товара в --таблице Склад UPDATE Склад SET Остаток=остаток+@x WHERE КодТовара=@y END END 예제 14.2. 트리거를 사용하여 통계 데이터를 수집합니다.

예제 14.3. Deal 테이블에서 레코드 삭제 작업을 처리하는 트리거를 만듭니다(예: 다음 명령).

기록 삭제 시 코드가 지정된 상품의 경우, 재고 잔고 조정이 필요합니다. 트리거는 삭제할 레코드를 하나만 처리합니다.

CREATE TRIGGER Trigger_del ON Transaction FOR DELETE AS IF @@ROWCOUNT=1 -- 하나의 레코드가 삭제됩니다. BEGIN DECLARE @y INT,@x INT --제품의 코드 및 수량은 창고 테이블에서 삭제된 --레코드에서 결정됩니다. SELECT @y=제품 코드, @ x=수량 FROM 삭제됨 --창고 테이블에서 --항목 수량이 조정됩니다. UPDATE Warehouse SET Remaining=남음-@x WHERE 제품 코드=@y END 예제 14.3. 테이블에서 레코드 삭제 작업을 처리하기 위한 트리거

예제 14.4.예를 들어 다음 명령을 사용하여 Deal 테이블의 레코드 변경 작업을 처리하는 트리거를 만듭니다.

코드가 3인 상품과의 모든 거래에서 상품 수량을 10단위만큼 줄입니다.

지정된 명령으로 인해 Deal 테이블의 여러 레코드가 동시에 변경될 수 있습니다. 따라서 두 개 이상의 레코드를 처리하는 트리거를 만드는 방법을 보여 드리겠습니다. 변경된 각 항목에 대해 기존(변경 전) 제품 코드는 제품의 기존(변경 전) 수량 값만큼 창고의 제품 잔액을 줄이고 새(변경 후) 제품 코드는 감소해야 합니다. 변경) 제품 코드를 사용하면 새(변경 후) 값만큼 창고 잔액이 늘어납니다. 변경된 모든 레코드를 처리하기 위해 모든 이전 값(삭제된 테이블의)과 모든 새 값(삽입된 테이블의)을 저장하는 커서를 도입합니다.

CREATE TRIGGER Trigger_upd ON Transaction FOR UPDATE AS DECLARE @x INT, @x_old INT, @y INT, @y_old INT -- 새 값이 있는 커서 DECLARE CUR1 CURSOR FOR SELECT 제품 코드, 수량 FROM 삽입 -- 이전 값이 있는 커서 ​​DECLARE CUR2 CURSOR FOR SELECT Product Code, Quantity FROM 삭제된 OPEN CUR1 OPEN CUR2 -- 두 커서를 통해 병렬로 이동 FETCH NEXT FROM CUR1 INTO @x, @y FETCH NEXT FROM CUR2 INTO @x_old, @y_old WHILE @@FETCH_STATUS=0 BEGIN -- 이전 제품 코드의 경우 감소합니다 --창고의 수량 UPDATE Warehouse SET Remaining=Remaining-@y_old WHERE Product Code=@x_old --새 제품 코드의 경우, 해당 제품이 아직 재고가 없는 경우, 새 레코드가 입력됩니다. IF NOT EXISTS (SELECT * FROM Warehouse WHERE Product Code=@x) INSERT INTO Warehouse(Product Code, Remaining) VALUES (@x,@y) ELSE --그렇지 않으면 새 제품 코드의 경우 증가합니다. -- 재고 수량 UPDATE Warehouse SET Remaining=Remaining+@y WHERE 제품 코드=@x FETCH NEXT FROM CUR1 INTO @x, @y FETCH NEXT FROM CUR2 INTO @x_old, @y_old END CLOSE CUR1 CLOSE CUR2 DEALLOCATE CUR1 DEALLOCATE CUR2 예제 14.4. 테이블의 레코드를 변경하는 작업을 처리하기 위한 트리거

고려된 트리거에서는 거래 기록이 창고 잔고와 변경될 때 상품 수량을 비교하지 않습니다.

예제 14.5.이 단점을 수정해보자. 오류 메시지를 생성하려면 트리거 본문에 MS SQL Server RAISERROR 명령을 사용합니다. 해당 인수는 메시지 텍스트, 심각도 수준 및 오류 상태입니다.

ALTER TRIGGER Trigger_upd ON 트랜잭션 FOR UPDATE AS DECLARE @x INT, @x_old INT, @y INT, @y_old INT ,@o INT DECLARE CUR1 CURSOR FOR SELECT 항목 코드, 삽입된 수량 DECLARE CUR2 CURSOR FOR SELECT 항목 코드, 수량 FROM 삭제됨 OPEN CUR1 OPEN CUR2 FETCH NEXT FROM CUR1 INTO @x, @y FETCH NEXT FROM CUR2 INTO @x_old, @y_old WHILE @@FETCH_STATUS=0 BEGIN SELECT @o=remaining FROM Warehouse WHERE 제품 코드=@x IF @o<-@y BEGIN RAISERROR("откат",16,10) CLOSE CUR1 CLOSE CUR2 DEALLOCATE CUR1 DEALLOCATE CUR22 ROLLBACK TRAN RETURN END UPDATE Склад SET Остаток=Остаток-@y_old WHERE КодТовара=@x_old IF NOT EXISTS (SELECT * FROM Склад WHERE КодТовара=@x) INSERT INTO Склад(КодТовара,Остаток) VALUES (@x,@y) ELSE UPDATE Склад SET Остаток=Остаток+@y WHERE КодТовара=@x FETCH NEXT FROM CUR1 INTO @x, @y FETCH NEXT FROM CUR2 INTO @x_old, @y_old END CLOSE CUR1 CLOSE CUR2 DEALLOCATE CUR1 DEALLOCATE CUR2 예제 14.5. 테이블의 레코드 변경 작업을 처리하기 위해 수정된 버전의 트리거

예제 14.6.이 예에서는 변경 사항 중 하나 이상을 구현할 수 없으면 모든 변경 사항이 취소됩니다. 일부 레코드의 변경 내용만 취소하고 나머지는 변경할 수 있는 트리거를 만들어 보겠습니다.

이 경우 레코드가 변경된 후 트리거가 실행되지 않고 변경 명령 ​​대신 트리거가 실행됩니다.

ALTER TRIGGER Trigger_upd ON 업데이트 대신 트랜잭션 ON DECLARE @k INT, @k_old INT DECLARE @x INT, @x_old INT, @y INT DECLARE @y_old INT ,@o INT DECLARE CUR1 CURSOR FOR SELECT 트랜잭션 코드, 제품 코드, 수량 FROM DECLARE CUR2 CURSOR FOR SELECT 거래 코드, 제품 코드, 수량 삭제됨 OPEN CUR1 OPEN CUR2 FETCH NEXT FROM CUR1 INTO @k,@x, @y FETCH NEXT FROM CUR2 INTO @k_old,@x_old, @y_old WHILE @@FETCH_STATUS= 0 BEGIN SELECT @ o=남은 FROM 창고 WHERE 제품 코드=@x IF @o>=-@y BEGIN RAISERROR("change",16,10) UPDATE 거래 SET 수량=@y, 제품 코드=@x WHERE 거래 코드 =@k UPDATE 남은 창고 세트 =Remaining-@y_old WHERE 품목 코드=@x_old IF NOT EXISTS (SELECT * FROM 창고 WHERE 품목 코드=@x) INSERT INTO 창고(품목 코드, 남은) VALUES (@x,@y) ELSE UPDATE Warehouse SET Remaining=나머지+@y WHERE 품목 코드=@x END ELSE RAISERROR("기록이 변경되지 않음",16,10) FETCH NEXT FROM CUR1 INTO @k,@x, @y FETCH NEXT FROM CUR2 INTO @k_old, @x_old, @y_old END CLOSE CUR1 CLOSE CUR2 DEALLOCATE CUR1 DEALLOCATE CUR2 예제 14.6. 일부 레코드의 변경 사항만 취소하고 나머지는 변경할 수 있는 트리거입니다.