DB Link로 update 사용 관련하여 질문 드립니다. 0 6 16,179

by 나니덕후 [Oracle 기초] dblink [2013.11.21 10:34:24]


안녕하세요. 오라클 초보입니다.
DB link로 update 시도 시 에러가 나는 경우가 있어 질문 드립니다.


오라클(11g)로 두개의 DB( AA, BB)를 생성하였습니다.
그리고 AA(local)에서 DB Link를 설정하여 BB(원격)에 있는 테이블의 값을 UPDATE하려고 하는데
아래와 같은 에러가 뜨고 있습니다. (INSERT도 불가)

DB link 설정이 잘못된 건가, 생각했지만 SELECT는 제대로 되고 있습니다.


-----------------------------------------------------------------------------------------------------------------------------------------
SQL > UPDATE "BB_TABLE"@aatobblink SET "BB_ID" = '1234' WHERE "BB_NAME" = 'test';
UPDATE "BB_TABLE"@aatobblink SET "BB_ID" = '1234' WHERE "BB_NAME" = 'test'

1행에 오류:
ORA-00604: 순환 SQL 레벨 1에 오류가 발생했습니다.
ORA-02067: 트랜잭션 또는 저장점 롤백이 요구됩니다.
ORA-00942: 테이블 또는 뷰가 존재하지 않습니다.
ORA-02063: line가 선행됨 (aatobblink로 부터)
-----------------------------------------------------------------------------------------------------------------------------------------


비슷한 문제가 있나 검색을 해 보니 패키지의 악의적인 사용을 막기위해 보안상 안된다는 말도 있지만 (링크),
대부분의 사람들은 문제 없이 UPDATE, INSERT가 되는 것 같습니다. 


DB Link로 원격 DB에 UPDATE가 가능한가요?
SELECT만 되는거면 계정의 권한 문제인가요?
 
도무지 원인을 모르겠습니다ㅠㅜ 도와주세요~~
by 부쉬맨 [2013.11.21 10:46:48]
이게 
예전에 제가 겪은 상황인데
부득이하게 dml 트랜잭션 작업처리중
생기는 문제로

예전에는 몰랐는데
snopshot 에러던가 
하는 문제였던거같네요.

저는 그때 몰라서 다음날?? 말그대로 트랜잭션이 lock 을 잡고있는 세션이 저절로 죽으면서
대상 문제는 해결되었는데 

update는 가능합니다.

하지만 지금 대상 테이블에 대상서버나 다른곳에서 dml 트랜잭션 처리중으로
동시성문제로 안되는 문제일수있습니다.

제가 예전에 추측했던게(권한이라든지 여러가지문제로 해결하지는못했지만)
대상서버의 테이블이 트랜잭션이 일어나고있는상태에서
다른곳에서 dblink로 들어오는 트랜잭션에서 생기는 문제가 아닐까라는 추측은 해본적이있습니다.

by 나니덕후 [2013.11.21 15:21:31]
답변 감사드립니다!!

snapshot 에러에 대해서는 지금 찾아봤는데 어렵네요@,@ 
좀 더 봐야 할 것 같습니다.


그리고 동시성 문제는... 일단 저 두 DB는 테스트 용으로 제가 사용하고 있는거라 
다른 트랜잭션 때문에 막힐 일은 없을 것 같습니다만ㅠ 요 부분도 확인해야겠네요. 감사합니다!

by feelie [2013.11.21 13:41:13]

DBLINK을 통한 해당 테이블에 대한 권한을 확인해 보세요..
BB_TABLE 테이블에 대하여 계정이 Update 권한이 있는지요...

user_tab_privs


by 나니덕후 [2013.11.21 15:09:45]
답변 감사 드립니다ㅠㅜ

원격 DB인 BB는, DBA 권한이 있는 사용자 계정(rain)으로 테이블을 생성하였으며 
로컬 DB인 AA에서는 DB link 생성 시 이 rain 계정으로 UPDATE를 하려고 하고 있습니다.

원격 DB인 rain으로 connect 후 user_tab_privs 로는 아무런 레코드가 확인이 되지 않습니다.
그래서 SYS 계정으로 cloud라는 계정을 생성해서 rain계정의 BB_TABLE에 대해 insert, update, select 등의 권한을 내려주고 user_tab_privs 확인 시 해당 BB_TABLE에 대한 권한이 리스트 업 되고 있습니다.


하지만 다시 로컬 DB인 AA에서 DB Link를 생성하여(접속 계정은 cloud) select, update, insert 시 select만 되고 나머지 동작은 수행되지 않습니다.

ㅠㅜ table을 sys 계정으로 생성해야 할까요?

by 나니덕후 [2013.11.21 16:30:03]
혹시나 같은 문제로 고생하시는 분이 있을까해서 적어봅니다...
부쉬맨 님의 말처럼 트랜잭션 문제인 것 같구요, (전혀 생각못하던 문제라 뒤통수 꽈광!!)

ORA-02067: 트랜잭션 또는 저장점 롤백이 요구됩니다. << 요 친절한 에러처럼 트랜잭션 롤백을 해주면 됩니다.

저는 DB를 shutdown 후 다시 start 해주고, Oracle Developer 툴로 롤백 버튼을 폭풍 클릭해주었습니다.
그러니까 되네요?? 하하하하... 일주일동한 고생한 문제인데 해결책은 퍽이나 싱겁네요.

여튼, 답변주신 부쉬맨님, feelie님 정말 감사 드리구요, 무한 사랑 드립니다.
♥♡♥♡♥♡

by 부쉬맨 [2013.11.21 16:49:16]
다행이시네요^^
오늘하루는 행복하시겠어요
축복받으세요^^
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입