FAQ
특정 테이블의 데이터 입력/삭제 시 trigger를 통해 udp로 특정 ip,port 로 메시지 보내기
분류 기타 등록일 2013-07-09 조회수 3117
Altibase의 trigger와 sendmsg() 함수를 사용하시면 됩니다.
테이블별로 insert 또는 delete event를 감지하는 trigger를 걸어 놓는데,
이 때 각 trigger의 action body에
설정된 IP와 port로 udp를 send하는 sendmsg()함수를 사용하게 하면 됩니다.

1. 테이블 생성
create table t1 (a integer, b char(10));

2. trigger 생성
CREATE or replace TRIGGER send_trg_ins
AFTER INSERT ON t1
REFERENCING NEW ROW new_row
FOR EACH ROW
AS
rtn integer;
BEGIN
rtn := sendmsg('127.0.0.1', 12345, 'insert into t1 : '||new_row.a||','||new_row.b, 1);
END;
/

CREATE or replace TRIGGER send_trg_del
AFTER DELETE ON t1
REFERENCING OLD ROW old_row
FOR EACH ROW
AS
rtn integer;
BEGIN
rtn := sendmsg('127.0.0.1', 12345, 'deleted from t1 : '||old_row.a||','||old_row.b, 1);
END;
/

3. udp.c 컴파일 및 실행(첨부참조)
$> cc -o udp udp.c
$> udp

4. 테이블에 insert 또는 delete
iSQL> insert into t1 values(100, 'test');
1 row inserted.

iSQL> delete from t1 where a=100;
1 row deleted.

5. udp 프로그램에서 메시지 수신
$> udp
got packet from 127.0.0.1
packet is 31 bytes long
packet contains "insert into t1 : 100,test "
got packet from 127.0.0.1
packet is 32 bytes long
packet contains "deleted from t1 : 100,test "

다만, sendmsg() 함수를 사용하시는데 유의하실 점이 있습니다.
즉, sendmsg()는 udp 방식이기 때문에 connectionless 방식으로 인한 신뢰성이 tcp에 비해 낮습니다.
이렇게 sendmsg()는 udp socket 자체의 신뢰성 정도만을 보장하기 때문에,
첫번째로 데이터 유실의 가능성이 있고,
두번째로 udp 서버 프로세스가 udp 데이터를 받을 때
그 순서를 정확히 보장하기 어렵습니다.
이러한 유의점은 sendmsg()함수의 한계라기보다는 udp socket 방식의 한계라고 보여집니다.
이점을 유의하셔야 할 것으로 보입니다.
참고로 sendmsg관련 사용법은 첨부드린 SQL 매뉴얼의 332p을 확인하시기 바랍니다.
목록