본문 바로가기

Database/MS-SQL

DB 트리거 백업트리고 사용법 INSERT INTO SELECT 설명

반응형






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 deleted 를 삭제하거나 수정하면 임시테이블로간다 backup_userTbl에 간다
-- 
UPDATE userTbl SET addr = '미이국' WHERE userID = 'JJJ';
DELETE userTbl WHERE height >= 180;

SELECT * FROM backup_userTbl;
SELECT * FROM userTbl;

TRUNCATE TABLE userTbl;

SELECT * FROM backup_userTbl;



















-- INSERT INTO SELECT 구문

CREATE TABLE PRODUCT_COPY
(
[PROD_CODE] [char](4) NOT NULL,
[PROD_NAME] [varchar](60) NOT NULL DEFAULT ('')
)

-- 똑같은 파일을 다른 테이블에 옮기고 싶을때 많이쓴다
INSERT INTO PRODUCT_COPY
SELECT * FROM product -- 프로젝트의 자료를 가져와서  INSERT INTO product_copy에 집에넣어라


SELECT * FROM product_copy

DELETE FROM product_copy

INSERT INTO product_copy -- 응용 
SELECT prod_code, prod_name  FROM product -- 이런씩으로 가져와서 가져오면 편하다
WHERE prod_code = '0003'









백업 트리거



/* -------------------------------
       <실습2> p626 ~ p628
---------------------------------*/

USE master ;
RESTORE DATABASE sqlDB FROM DISK ='c:\sqldb.bak' WITH REPLACE ;

USE sqlDB;
DROP TABLE buyTbl; -- 구매테이블은 필요없으므로 삭제.
CREATE TABLE backup_userTbl
( userID  nchar(8) , 
  name    nvarchar(10) , 
  birthYear   int , 
  addr  nchar(4) , 
  mobile1 nchar(3), 
  mobile2   nchar(8), 
  height    smallint ,
  modType  NCHAR(2), -- 변경된 타입. '수정' 또는 '삭제'
  modDate  datetime, -- 변경된 날짜
  modUser  nvarchar(256) -- 변경한 사용자
)
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 deleted 를 삭제하거나 수정하면 임시테이블로간다 backup_userTbl에 간다
-- 
UPDATE userTbl SET addr = '미이국' WHERE userID = 'JJJ';
DELETE userTbl WHERE height >= 180;

SELECT * FROM backup_userTbl;
SELECT * FROM userTbl;
TRUNCATE TABLE userTbl;




INSERT INTO SELECT 사용법 여기

INSERT INTO backup_userTbl
SELECT userID, name, birthYear, addr, mobible1, mobile2,
height, @modType, GETDATE(), USER_NAME() FROM deleted --( inserted)
-- FROM deleted => 원본데이터가 삭제나 수정되면임시로 저장되는곳