안녕하세요.
저희 ERP가 좀 옛날꺼라 권한을 가진 일부 사람 중 한명이 회계년도를 바꿔서 저장 처리해버리면
회사 전체 ERP 사용자들이 그 바뀐 연도로 ERP를 접속하게 됩니다.
그럼 사람들은 회계년도가 바뀐지도 모르고 그냥 쓰다가 나중에 난리가 나죠...
불행히도 회계년도를 바꿀 때 누가 언제 변경을 했는지에 대한 기록은 남겨지지 않습니다.
그래서 서로가 서로를 의심하는 상황이 되죠...
안되겠어서 이번에 제가 트리거를 해당 테이블에 걸어두고자 합니다.
테이블 명은 basic 입니다.
이 테이블에는 1개의 레코드만 들어가 있습니다. 회사 정보와 회계년도 값이 있습니다.
우선 basic_trg 라는 테이블에 아래와 같은 컬럼을 구성할 생각입니다. (업데이트 수행자 정보 저장용)
1. up_host : 업데이트 한 사람의 HOSTNAME 값
2. up_ip : 업데이트 한 사람의 IP주소
3. up_date : 업데이트를 했던 날짜및시간
4. up_type : 변경된 레코드 키값, 업데이트 한 컬럼명 및 값
일단 트리거 만들려고 쿼리문 만들어봤는데...
아래 내용 중에서 각각의 정보를 어떻게 구해서 구문을 작성해 주어야 할지 모르겠습니다.
CREATE TRIGGER [AB_TRG] ON [dbo].[BASIC]
FOR UPDATE
AS
declare @ip_host nvarchar(50), @up_ip nvarchar(30), @up_type nvarchar(50)
declare @dp_code nvarchar(10), @ab_year nvarchar(4)
select @dp_code = DP_CODE from inserted
select @ab_year = AB_YEAR from inserted
Set @ip_host = host_name()
Set @up_ip = ???
set @dp_type = @dp_code+'/'+@ab_year
if update(AB_YEAR) Begin
Set @dp_type = @dp_type + '/AB_YEAR'
Update BASIC_TRG set up_host = @ip_host, up_ip = @up_ip, up_date = getdate(), up_type = @up_type where DP_SCODE = @dp_code
End
IP는 어떻게 구할 수 있을까요? 위와 같이 하면 문제가 없을 것 같은데... 한번 봐주시면 감사하겠습니다.~
감사합니다.
Comment 4
-
Terry
2015.12.18 15:34
-
Terry
2015.12.18 15:43
글 보고 덧글작성하고 나니 본문 내용이 바껴있네요 ..oTL...
IP 는 하기 쿼리로..
select client_net_address from sys.dm_exec_connections where session_id = @@spid;
-
Larry
2015.12.18 15:47
빠른 조언 감사드립니다^^
제가 만든 쿼리는 수정할게 많더라구요 ㅎㅎ
알려주신 쿼리문을 참고해서 좀더 보강해 만들면 되겠네요
정말 감사합니다~
그런데 알려주신 IP주소 확인 쿼리는 SQL 2000 에서는 안먹히네요 ^^;
-
Terry
2015.12.18 16:09
SQL2000은 테스트가 불가능하네요..^^;;
검색해보니 이런 정보가..
http://egloos.zum.com/lemonfish/v/5375842
상세 정보는 해당 블로그에서 확인하시면 될듯합니다.
하기 쿼리 참고하셔서 하시면 됩니다.
호스트,ip,등록일자 는
수정하시면 될거구요..
어떤행위인지 ( I,D,U ) 를 알 수 있는 구분자값
그리고 등록시간도 있으면 더 좋을 듯 하네요..
(일자에 시간정보까지 같이 넣는다면 이건 없어도 될듯 )
참고만 하세요..
그러고보니 저렇게 Join 안해도 되는데 -_-;
Deleted 나 Inserted 테이블에서만 데이터 핸들링하셔도 무방할겁니다..
(-_-;;;
보다 상세한건 다른 고수분들이 도와주실거라 생각하며
바턴을 넘깁니다..
---쿼리시작---
USE [DB명]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
Create TRIGGER [dbo].[basic_trg] on [dbo].[basic]
FOR INSERT, UPDATE, DELETE NOT FOR REPLICATION
AS
BEGIN
DECLARE @CNT_INS INT
, @CNT_DEL INT
Declare @ls_ymd Char(8)
SELECT @ls_ymd = Max(convert(char, GetDate(), 112))
FROM syscolumns
SELECT @CNT_DEL = COUNT(*) FROM DELETED
SELECT @CNT_INS = COUNT(*) FROM INSERTED
IF @CNT_DEL > 0 AND @CNT_INS > 0 BEGIN --UPDATE된 것임
--Update 전 데이터 ( 삭제되기전 데이터 )
Insert
Into basic_trg
Select up_host
,up_ip
,@ls_ymd As up_date
,b.회계년도
,'D'
from basic a
Inner Join
deleted b
On a.회사정보 = b.회사정보
--Update 후 데이터 ( 삭제후 Insert된 데이터 )
Insert
Into basic_trg
Select up_host
,up_ip
,@ls_ymd As up_date
,b.회계년도
,'U'
from basic a
Inner Join
inserted b
On a.회사정보 = b.회사정보
END
ELSE IF @CNT_DEL = 0 AND @CNT_INS > 0 BEGIN --INSERT 된 것임
--신규 Insert된 데이터
Insert
Into basic_trg
Select up_host
,up_ip
,@ls_ymd As up_date
,b.회계년도
,'I'
from basic a
Inner Join
inserted b
On a.회사정보 = b.회사정보
END
ELSE IF @CNT_DEL > 0 AND @CNT_INS = 0 BEGIN --DELETE 된 것임
--삭제한 데이터
Insert
Into basic_trg
Select up_host
,up_ip
,@ls_ymd As up_date
,b.회계년도
,'D'
from basic a
Inner Join
deleted b
On a.회사정보 = b.회사정보
END
end
---쿼리끝---