반응형
하주영 ( [주영] ) 님의 말 :
CREATE TRIGGER testTrg1 --트리거 이름
ON testTbl --트리거를 부착할 테이블
AFTER DELETE, UPDATE --삭제, 수정후에 작동하도록 지정
AS
PRINT('트리거가 작동했습니다'); -- 트리거 실행시 작동되는 코도들
INSERT INTO testTbl VALUES(4, '당탕이')
UPDATE testTbl SET txt = '우지운' WHERE id = 2
DELETE testTbl WHERE id = 4
SELECT * FROM testTbl
USE sqlDB
CREATE TRIGGER trg_BackupUserTbl --트리거 이름
ON userTbl -- 트리거를 부착할 테이블
AFTER UPDATE, DELETE -- 삭제, 수정 후에 작동하도록 지정
AS
DECLARE @modType nchar(2) -- 변경 타입
IF (COLUMNS_UPDATED() > 0) --업데이트 되었다면
BEGIN
SET @modType = '수정'
END
ELSE --삭제되었다면
BEGIN
SET @modType ='삭제'
END
--delete 테이블의 내용(변경전의 내용)을 백업테이블에 삽입
INSERT INTO backup_userTbl
SELECT userID, name, birthYear, addr, mobile1, mobile2, height,
@modType, GETDATE(), USER_NAME() FROM deleted
SELECT * FROM userTbl
SELECT * FROM userTbl
SELECT * FROM backup_userTbl;
-- 테스트 테이블 및 데이터 입력 (SEQ 가 KEY 인 테이블)
CREATE TABLE TEST (SEQ INT PRIMARY KEY , A BIGINT , B BIGINT)
INSERT INTO TEST VALUES (1,1,1)
INSERT INTO TEST VALUES (2,3,3)
-- 트리거 생성 ----------------
CREATE TRIGGER TR_TEST
ON
AFTER UPDATE
AS
BEGIN
DECLARE @SEQ INT
DECLARE @A1 INT, @A2 INT
IF UPDATE (A) -- A 컬럼이 변경되었을 때만 작동
BEGIN
SELECT @A1=A FROM DELETED
SELECT @A2=A FROM INSERTED
IF @A2>@A1 -- 업데이트된 A 컬럼이 업데이트되기전보다 커지게 되면 실행
BEGIN
SELECT @SEQ=SEQ FROM INSERTED
UPDATE TEST SET B=10000000 WHERE SEQ=@SEQ
END
END
--------------------------------
-- SEQ 가 1인 로우를 업데이트
UPDATE TEST SET A=2 WHERE SEQ=1
SELECT * FROM TEST WHERE SEQ=1
--==> B 컬럼 이 10000000 으로 변경된 것으 확인. ^^*
--1.트리거 이용
--
--CREATE TRIGGER Att_Date_Tab_Insert
--
--ON Att_Date_Tab
--AFTER INSERT
--
--AS
-- --여기부터 실행할 내용을 써주면 됩니다.
--
-- Insert into Att_Total_tab (Att_Date, Stu_Num, Stu_K)
--
-- Select (select Att_Date from inserted)
--
-- ,Stu_Num
--
-- ,Null
--
-- From Stu_info_tab
--
--GO
--
--
--
--2.프로시져 이용
--
--CREATE PROC Att_Date_Tab_Insert
--
--@v_Att_Date varchar(10)
--
--AS
--
--Insert into Att_Total_tab (Att_Date, Stu_Num, Stu_K)
--
--Select @v_Att_Date
--
-- ,Stu_Num
--
-- ,Null
--
--From Stu_info_tab
--
--
--
---실행시
--
--EXEC Att_Date_Tab_Insert '2006-12-15'
--
--
--
--기본적으로 트리거는 하나의 테이블 변경상황에 의하여 트리거링 되기때문에.
--
--두개의 테이블에 의한 트리거링은 조건으로 생성할 수 없습니다.
--
--따라서 원하시는 트리거는 생성이 불가능합니다.
--
--하지만 몇가지 상황적 조건이 충족된다면 테이블2에 UPDATE 트리거를 생성하여 처리가 가능합니다.
--
--1. 테이블 1, 2, 3 이 각 row는 특정 필드값으로 조인이 가능한 상태(테이블간 상호 관계가 존재하여야함)
--
--2. 테이블 1 insert, 테이블 2 a필드 update가 동시에 발생할경우 처리 순서상
--
-- 테이블 1 insert 우선 , 테이블 2 a필드 update 나중에 일어나야함.
--
--3. 테이블2 a 값은 테이블1의 로우값과 인과 관계가 존재함. - 다르게 말해서 a값으로 테이블1의 insert 여부를 알수 있음.
--
-- (예, a의 값은 테이블1의 특정 조건의 로우의 개수, a의 값은 테이블1의 특정 조건의 sum, count, avg 등의 값)
--
--4. 테이블3 b필드에 업데이트 되는 값은 테이블 1의 필드값이나 테이블 2의 필드값 혹은 정의된 상수값이어야 함
--
--5. 테이블1은 insert의 순서를 알수 있는 필드가 존재하여야 함.
--
--즉 테이블2의 a값으로 테이블1의 신규 등록 여부를 알수 있어야 하며 테이블3 b필드가 업데이트될
--
-- row 및 값을 사용자의 조작없이 알수 있는 상태 이면 가능합니다.
--
--
--예로 다음과 같은 상황이라면
--TABLE1 AA = TABLE2 BB = TABKE3 CC 필드로 연결됨
--TABLE2 a필드는 TABLE2의 BB필드값과 동일한 AA필드 값을 가지고 있는 TABLE1의 '개수' 필드의 합
--TABLE3 b필드는 TABLE1의 AA필드값과 동일한 CC필드 값을 가지고 있는 가장 최근에 입력된 c 필드값
--TABLE1 RDATE는 등록일시의 값을 가짐
--이라고 한다면
--
--
--CREATE OR REPLACE TRIGGER TABLE1_TRIGGER
-- BEFORE
-- UPDATE ON TABLE1
-- FOR EACH ROW
-- DECLARE TABLE_KEY VARCHAR2(100);
-- DECLARE TABLE1_C VARCHAR2(100);
-- DECLARE TABLE1_MAX VARCHAR2(100);
--BEGIN
--
-- TABLE_KEY := old.BB;
--
-- IF old.a <> new.a THEN /* a필드값 변경된다는
'Database > MS-SQL' 카테고리의 다른 글
Sql 2005 DB 스키마 제거 삭제 하기 ㅋㅋ 그림은 알아서 보기 // 사용자 에 대한 삭제이(가) 실패했습니다 (1) | 2009.05.29 |
---|---|
CREATE PROCEDURE !! DECLARE !! EXEC !! OUTPUT !! (0) | 2009.03.28 |
TRUNCATE TABLE(Transact-SQL) (0) | 2009.03.27 |
SQL @@Error 그리고 TRANSACTION BEGIN TRAN ROLBACK COMMIT IF ELSE문 사용 예 (0) | 2009.03.26 |
Brent’s SQL Database Blog - Archive for My Sample DB (0) | 2009.02.12 |
엑셀을 MSSQL에 바로 올리기 excel 을 바로 DB에 올리기 엑셀 데이터 베이스로 가져오기 SSMS (0) | 2009.02.10 |
db 데이터 베이스 백업 backup 복원 백업 복원 (0) | 2009.01.13 |
SELECT @@IDENTITY 최근에 들어간 PK값을 돌려주는 것 (0) | 2009.01.09 |