저는 Unix와 bash 스크립팅을 처음 접했기 때문에 이것이 어리석은 질문이라면 알려주세요.
저는 Unix 플랫폼에서 호스팅되는 DB2를 사용하는 회사에서 일하기 시작했는데, 그 회사의 데이터베이스(IBM Design studio로 생성됨)에는 원치 않는 스키마가 많이 있었습니다. 나는 이러한 패턴을 정리하고 싶고 bash 스크립트가 이를 수행하는 가장 좋은 방법이라고 가정합니다.
내가 원하는 것은 데이터베이스에 쿼리하여 스키마 이름을 가져와 일종의 컬렉션에 저장한 다음 컬렉션을 반복하면서 각 이름에 대해 drop 명령을 수행하는 것입니다.
DB2 명령에는 문제가 없지만(제 생각에는) 스크립트에서 결과를 얻는 방법이 확실하지 않습니다.
그러면 문제의 스키마 이름이 검색됩니다.
db2 "SELECT schemaname FROM syscat.schemata WHERE schemaname like 'IWSCHEMA%'"
그러면 $SCHEMA_TO_DROP 변수에 이름이 할당된 스키마가 삭제됩니다.
db2 "CALL SYSPROC.ADMIN_DROP_SCHEMA('$SCHEMA_TO_DROP', NULL, 'ST', 'ErrorTable')"
지금 해야 할 일은 두 가지를 함께 연결하는 것뿐인데 어디서부터 시작해야 할지 모르시나요?
답변1
선택 출력을 변수에 할당한 다음 for 루프를 사용하여 각 Schema_name을 반복할 수 있습니다.
/usr/bin/ksh
# Assign the output of the SELECT command to a local shell variable
SCHEMA_DROP_LIST=$(db2 "SELECT schemaname FROM syscat.schemata WHERE schemaname like 'IWSCHEMA%'")
# Loop over each schema_name
for SCHEMA_TO_DROP in $SCHEMA_DROP_LIST
do
# Drop the schema, 1 at a time
db2 "CALL SYSPROC.ADMIN_DROP_SCHEMA('$SCHEMA_TO_DROP', NULL, 'ST', 'ErrorTable')"
done
또한 db2 drop 명령 바로 다음에 $? 변수를 사용하여 반환 코드를 캡처한 다음 해당 반환 코드(에코 오류 코드, 종료 등)에 따라 조치를 취할 수도 있습니다.
답변2
# POSIX shell: command substitution, bash.info 3.5.4
# Sets SCHEMA_TO_DROP to the output of balh blah..
SCHEMA_TO_DROP="$(db2 "SELECT schemaname FROM syscat.schemata WHERE schemaname like 'IWSCHEMA%'")"
db2 "CALL SYSPROC.ADMIN_DROP_SCHEMA('$SCHEMA_TO_DROP', NULL, 'ST', 'ErrorTable')"
고쳐 쓰다:
언급된 visudo처럼 SCHEMA_TO_DROP
캡처된 내용은 실제로 목록입니다. 루프를 사용하여 for var in balh list
목록을 반복할 수 있습니다.
사용이 $?
불필요할 수 있습니다. 개인적으로 나는 다음 ||
과 같은 논리 연산을 선호합니다 &&
.
IFS='\n' # make sure that for don't split anything other then newlines
for foo in $SCHEMA_TO_DROP; do
db2 something something || oh_crap_it_failed
done
답변3
사용해 보셨나요?하위 쿼리? 다음과 같이 보일 수 있습니다:
db2 "CALL SYSPROC.ADMIN_DROP_SCHEMA((SELECT schemaname FROM syscat.schemata WHERE schemaname like 'IWSCHEMA%'), NULL, 'ST', 'ErrorTable')"
하지만 첫 번째 매개변수에서 여러 값을 처리해야 합니다.