기존 시퀀스가 아닌 시퀀스를 삭제하여 기존 사용자를 생성할 수 있습니다.
시퀀스, 사용자 및 기타 객체를 생성/드롭하는 많은 sql 스크립트를 가지고 있습니다.liquibebase를 통해 이 스크립트들을 실행하고 있지만 기존 시퀀스를 삭제하거나 기존 사용자를 생성하려고 하면 Oracle이 불평하기 때문에 실패합니다.
오류가 발생하는 것을 방지하기 위한 오라클 방법이 있습니까?
어떤 종류의.
없는 경우 사용자/시퀀스 만들기
사용자/시퀀스가 있는 경우 삭제
제가 알기로는 다음과 같은 옵션이 있습니다.
- plsql 스크립트 작성
- 리퀴브 베이스 콘텍스트를 사용합니다.
- 리퀴브 베이스 전제조건을 사용하지만, 이것은 너무 많은 일을 의미합니다.
어떤 생각이나 아이디어라도 매우 감사히 받겠습니다.
Liquibase에는 failOnError 특성이 있습니다. 실패 가능성이 있는 호출이 포함된 changeSets에서 false로 설정할 수 있습니다.
<changeSet failOnError="false">
<createSequence sequenceName="new_sequence"/>
</changeSet>
이를 통해 간단한 create user, create sequence, drop user, drop sequence changeSets를 사용할 수 있으며 사용자/시퀀스가 존재/존재하지 않기 때문에 문에서 오류가 발생하면 run으로 표시되고 업데이트가 계속됩니다.
이 접근 방식의 단점은 이 접근 방식이 실행된 것으로 표시하고 다른 이유(잘못된 권한, 연결 실패, 잘못된 SQL 등)로 오류가 발생할 경우에도 계속 유지된다는 것입니다.보다 정확한 접근 방식은 다음과 같은 전제 조건을 사용하는 것입니다.
<changeSet>
<preconditions onFail="MARK_RAN"><not><sequenceExists/></not></preconditions>
<createSequence name="new_sequence"/>
</changeSet>
현재 userExists 전제조건은 없지만 사용자 지정 전제조건을 만들거나 전제조건으로 되돌릴 수 있습니다.문서는 http://www.liquibase.org/documentation/preconditions.html 참조
이와 유사한 함수 do_ddl을 작성하고 잡고 싶은 모든 예외를 잡습니다.
DECLARE
allready_null EXCEPTION;
PRAGMA EXCEPTION_INIT(allready_null, -1451);
BEGIN
execute immediate 'ALTER TABLE TAB MODIFY(COL NULL)';
EXCEPTION
WHEN allready_null THEN
null; -- handle the error
END;
/
그냥 PL/SQL 익명 블록을 사용하고 싶습니다.
begin
for x in (select sequence_name
from user_sequences
where sequence_name in ('SEQ1','SEQ2' ... 'SEQn'))
loop
execute immediate 'drop sequence '||x.sequence_name;
end loop;
end;
/
액상 베이스 전제 조건이 기존 시퀀스를 확인하지 않았습니다.그래서 몇 번의 시도 끝에 간단하게 시도해 보았습니다.<changeSet id="test-id"><sql> DROP SEQUENCE IF EXISTS "TABLENAME_ID_seq"; </sql></changeSet>
제 경험으로는 Liquibase 3.5.1 동작을 기반으로 failOnError="false"를 사용할 때 작업이 실패하면 changeSet이 'RAN'으로 기록되지 않습니다.제가 보기에는 이것은 버그로 보이고 네이선의 대답은 정확하지 않은 것 같습니다.
이 접근 방식의 단점은 이 접근 방식이 실행된 것으로 표시하고 다른 이유(잘못된 권한, 연결 실패, 잘못된 SQL 등)로 오류가 발생할 경우에도 계속 유지된다는 것입니다.보다 정확한 접근 방식은 다음과 같은 전제 조건을 사용하는 것입니다.
예: 실행된 것으로 표시되지 않습니다!
언급URL : https://stackoverflow.com/questions/1625567/prevent-error-when-dropping-not-existing-sequences-creating-existing-users
'programing' 카테고리의 다른 글
업데이트 실행 중 SQL 업데이트가 하위 쿼리에 영향을 줍니까? (0) | 2023.10.29 |
---|---|
파이썬 형식(f-string) 문자열에서 !r은 무엇을 의미합니까? (0) | 2023.10.29 |
다른 페이지의 앵커 태그에 대한 앵커 링크가 작동하지 않음 (0) | 2023.10.29 |
표에서 두 번째로 큰 항목 또는 세 번째로 큰 항목을 가져오는 방법 (0) | 2023.10.29 |
자바스크립트에서 배열 길이를 제한할 수 있습니까? (0) | 2023.10.29 |