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
운영게시판
최근게시물
Sybase Q&A 1129 게시물 읽기
No. 1129
트리거 변환 질문입니다.
작성자
김시원
작성일
2005-04-01 16:50
조회수
5,445

오라클이나 ms-sql에서 트리거가 작동되는 시점을 설정하는 after나 before같은 설정은
sybase에서 어떻게 하나요?

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

sybase는 before나 after이 없습니다.

 

inserted나 deleted의 data를 처리 해야 합니다.

 

 

 

지연님이 2005-04-06 20:06에 작성한 댓글입니다. Edit

앞에 분이 말씀하신데로 sybase 에는 before 나 after 설정이 없습니다. trigger 관련 내용이 필요하신가 해서 올려 드립니다.

 

Trigger

 

Syntax

4 트리거는 테이블에 직접 바인드 객체이다

4 테이블에 데이터 변경(insert,update,delete) 시도할 자동적으로 실행된다

 

create trigger [owner.]trigger_name

on [owner.]table_name

for {insert, update, delete}

as SQL_statements

Or, using the if update clause:

create trigger [owner.]trigger_name

on [owner.]table_name

for {insert, update}

as

    [if update (column_name)

        [{and | or} update (column_name)]...]

        SQL_statements

    [if update (column_name)

        [{and | or} update (column_name)]...

        SQL_statements]...

 

Trigger 언제 실행되는가?

4 trigger 기동시킨 sql문장과 1 transaction이다

 

순서를 정한다면, 기동시킨 sql문장이 실행되고, 실행결과로 inserted 또는 deleted라는 특별한 view 생성되고나서 수행된다고 봐도 좋다

 

잠시동안 Trigger 중지할 있는가?

4 ASE 12.0 이후에서는 alter table 명령문에서 trigger enable/disable시킬 있다

 

1> alter table titles disable trigger deltitle

2> go

Disabling trigger 'deltitle'.

1> alter table titles enable trigger deltitle

2> go

Enabling trigger 'deltitle'

 


 

column 변화만을 대상으로 하는 trigger 가능한가?

4 if update(column) 사용하면 가능하다

여기서 변화라는 것은 값의 변화를 의미하는 것이 아니라 해당 column update수행여부를 말하는 것입니다. 만약 해당 column 값의 변화를 check하고 싶다면 deleted,inserted table 해당 column 비교해서 이용해야 합니다

 

1>create trigger TEST_TAB_trg on TEST_TAB for insert,update,delete

2>as

3>   if update(COL1)

4>      begin

5>      select "Updated !!"

6>      end

7>return

8>go

1> insert into TEST_TAB values (1)

2> go

 

 ----------

 Updated !!

 

(1 row affected)

(1 row affected)

1> update TEST_TAB set COL1 = 1

2> go

 

 ----------

 Updated !!

 

(1 row affected)

(1 row affected)

 

delete에서는 기동 되지 않는다

1> delete TEST_TAB

2> go

(1 row affected)

 

foreign key constraint 걸린 경우, trigger통한 cascade delete?

4 error 생긴다.  constraint trigger 바꿔 구현해야 한다

 

parent_tab primary key child_tab에서 foreign key constraint 선언한 경우에

parent tab cascade delete 수행하면 error 발생한다

 

이럴 경우는 parent_tab delete trigger cascade trigger 만들고, child_tab insert/update trigger 만들어 foreign key constraint 대신해야 한다

 

parent_tab primary key p_col1, p_col2 이다

child_tab c_col1,c_col2 parent_tab p_col1, p_col2 대응한다

create table parent_tab (p_col1 int,p_col2 int)

create table  chlid_tab (c_col1 int,c_col2 int,c_col3 int)

 

child_tab insert / update trigger에서 parent_tab 없는 내용이면 i/u못하게 한다

create trigger child_tab_iu on child_tab for insert,update as

   declare @i_count int,@d_count int

 

   if not exists ( select 1 from parent_tab p,inserted i

                    where p.p_col1 = i.c_col1

                      and p.p_col2 = i.c_col2  )

      begin                                         

                        print  "not in parent table"

                      rollback tran

      end

return

 

parent_tab delete trigger에는 cascade delete기능을 넣는다

create trigger parent_tab_d on parent_tab for delete as

 

delete child_tab

from child_tab, deleted d

where  c_col1 = d.p_col1

and    c_col2 = d.p_col2

 

return

 

child_tab insert 항상 parent_tab 있어야 한다

1> select * from child_tab

2> go

 c_col1      c_col2      c_col3

 ----------- ----------- -----------

           1           1           1

           2           2           2

 

(2 rows affected)

 

1> select * from parent_tab

2> go

 p_col1      p_col2

 ----------- -----------

           1           1

           1           1

           3           3

           4           4

 

(4 rows affected)

 

parent_tab 7 없다. insert 안된다

1> insert into child_tab values (7,7,7)

2> go

not in parent table                

 

parent_tab 있는 delete하면 child_tab 내용을 삭제하는 cascade delete 점검한다

1> delete parent_tab where p_col1 = 1

2> go

(1 rows affected)

 

1> select * from parent_tab

2> go

 p_col1      p_col2

 ----------- -----------

           2         2

           3           3

           4           4

 

1> select * from child_tab

2> go

 c_col1      c_col2      c_col3

 ----------- ----------- -----------

           2           2           2

 

(1 row affected)

 

 

Trigger(statement level) row level 바꾸려면?

4 cursor 이용한다

1> create trigger del_TEST_TAB

2> on TEST_TAB for delete       

3> as

4>

5> declare @a int,@b int,@c int

6>

7> declare XX cursor for

8> select * from deleted

9>

10> open XX

11>

12> fetch XX into @a,@b,@c

13>

14> while @@sqlstatus = 0

15>   begin

16>     insert D_TEST_TAB values (@a,@b,@c)

17>   fetch XX into @a,@b,@c

18> end

19>

20> close XX

21> deallocate cursor XX

22>

23> return

24> go

 

coolrock님이 2005-04-07 00:26에 작성한 댓글입니다.
이 댓글은 2005-04-07 00:26에 마지막으로 수정되었습니다. Edit
[Top]
No.
제목
작성자
작성일
조회
1132이 로그는 무슨 에러인지요 [2]
이상혁
2005-04-08
4917
1131숫자를 문자로 바꿀시... [2]
zzz
2005-04-08
4814
1130asiq 를 unix에 설치시 [1]
배움이
2005-04-07
3670
1129트리거 변환 질문입니다. [2]
김시원
2005-04-01
5445
1128이 메세지는 무엇인가요? 접속시 나는데요..^^ [1]
정영식
2005-03-29
3907
1127PowerBuilder 7.0이프로그램이 머하는건지 어떻게 쓰는건지 간단한 설명좀 [1]
김덕봉
2005-03-29
3235
1126Sybase완전 초짜입니다..^^ 인스톨후 뭘 해야 하는건지... [2]
정영식
2005-03-29
4238
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.017초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다