database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
Oracle
Informix
Sybase
ㆍMS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
MS-SQL Q&A 3925 게시물 읽기
No. 3925
데이타 변경시 자동으로 알수 있는 방법이 있나요???
작성자
쌩둥이
작성일
2007-12-19 22:45ⓒ
2007-12-20 11:35ⓜ
조회수
3,993

MS-SQL을 사용하고 있지만 데이타베이스에 대해서는  많은 지식이 없습니다.


여러개의 테이블이 있는데 그중 어느 테이블에서 변경(Insert , Update)이 일어나게 되면 파워빌더에서 그에 해당하는 Process를 실행하고 싶습니다.

(현재 해당 테이블들은 우리쪽 DB에 속해 있지만 데이타는 다른쪽에서 입력, 수정, 삭제를 합니다. 또한,우리쪽 프로그램에서는 읽어 올수만 있는 상황입니다. )


트리거를 이용하면 가능할것 같다는 막연한 이야기는 들었지만 제가 트리거에 대해 별루 아는바가 없어서요...


그동안 파워빌더에서 timer를 이용해서 특정 테이블에 대한 것은 해 보았는데 다수의 테이블 이다보니 timer를 쓰게 된다면 프로그램에 부하가 많이 걸릴것 같은데 ...



1, 각, 테이블에 데이타 변경이 발생 -> 2. 트리거 이용 임시테이블에 데이타 변경을 알림 -> 3. 파워빌더에서 임시테이블을 모니터링하다 자료 가져옴


2번을 알고 싶습니다.(임시 테이블에 저장되는 내용은 변경된 테이블명과 , 레코드 키값)


고수님들의 가르침을 기다립니다. 

이 글에 대한 댓글이 총 1건 있습니다.

레코드 자체의 키값을 만들려면 조금 힘들듯한데요. 
예를 들어 업데이트 된 칼럼의 값을 알고 싶다. 또는 delete된 값을 알고 싶다고 했을 때
칼럼의 수와 칼럼의 데이터 타입이 일정치 않으므로 분명 메타성으로 만들어야 하는데 
그렇게 되면 다시 분석을 하셔야 하는 구문을 짜야 할 듯합니다. 
그런 연유로 어느 테이블에 in/up/delete가 언제 일어났다의 식으로 저장되게
작성해봤습니다. 


--SOURCING
IF OBJECT_ID('TESTTB1') IS NOT NULL
 DROP TABLE TESTTB1


--TARGETTING
IF OBJECT_ID('TESTTB2') IS NOT NULL
 DROP TABLE TESTTB2
 
 

CREATE TABLE TESTTB1
(IDX INT IDENTITY(1,1) --단순증가
, A INT)  --VALUE
GO


CREATE TABLE TESTTB2
(IDX INT IDENTITY(1,1)  --단순증가
, TB VARCHAR(100)       --어떤테이블
, MOD_ACTION TINYINT --INSERT(1)/UPDATE(2)/DELETE(3)
, CHG_DT DATETIME DEFAULT GETDATE() --언제?
)
GO


--trigger
CREATE TRIGGER TRG_TESTTB1
ON TESTTB1 FOR INSERT, UPDATE, DELETE
AS
BEGIN
SET NOCOUNT ON
 DECLARE @TB VARCHAR(100)
 DECLARE @TRG_NAME VARCHAR(100)
 DECLARE @MOD_ACTION TINYINT
 --MODIFY
 SET @TRG_NAME = 'TRG_TESTTB1'
 --
 
 SELECT TOP 1 @TB = OBJECT_NAME(PARENT_OBJ) FROM SYSOBJECTS WHERE NAME = @TRG_NAME
 IF ((EXISTS(SELECT TOP 1 * FROM INSERTED)) AND (NOT EXISTS(SELECT TOP 1 * FROM DELETED))) BEGIN
  SET @MOD_ACTION = 1
 END ELSE IF ((EXISTS(SELECT TOP 1 * FROM INSERTED)) AND (EXISTS(SELECT TOP 1 * FROM DELETED))) BEGIN
  SET @MOD_ACTION = 2
 END ELSE IF ((NOT EXISTS(SELECT TOP 1 * FROM INSERTED)) AND (EXISTS(SELECT TOP 1 * FROM DELETED))) BEGIN
  SET @MOD_ACTION = 3
 END
 
 INSERT INTO TESTTB2 (TB, MOD_ACTION, CHG_DT)
  SELECT @TB, @MOD_ACTION, GETDATE()
 
SET NOCOUNT OFF
END

 

--insert, udpate, delete이후 testtb2를 보십시오.

.님이 2007-12-20 09:54에 작성한 댓글입니다.
이 댓글은 2007-12-20 12:48에 마지막으로 수정되었습니다. Edit
[Top]
No.
제목
작성자
작성일
조회
3928msslq 자료 내보내기 관련 질문입니다. [3]
초보;
2007-12-20
3675
3927네트워크를 이용하여 다른 서버에 백업을 받을려고 합니다. [1]
서버관리
2007-12-20
3031
3926본문에 해당하는 키워드 찾는 방법 있을까요? [1]
한민우
2007-12-20
3337
3925데이타 변경시 자동으로 알수 있는 방법이 있나요??? [1]
쌩둥이
2007-12-19
3993
3924중복제거를 하고 싶습니다. 고수님들 도와주세요 [1]
초봉
2007-12-19
3936
3923간단한질문드립니다. [1]
황성호
2007-12-19
3477
3922vb.net 관련 질문입니다 [2]
임명순
2007-12-17
3093
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.017초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다