이미 존재하는 개체 확인해서 지우기
작성일 06-12-13 21:05
페이지 정보
작성자서방님 조회 175회 댓글 0건본문
테이블을 만들거나 저장프로시저 또는 뷰 등을 만들때 기존에 존재하는것이 있으면 기존의 것을 지우도 다시 만들어야 하는 경우가 있습니다. 대부분 만드는 과정에서 기존에 존재한다는 에러가 발생하면 DROP 문을 이용해서 기존의 개체를 제거하고 다시 CREATE 문을 수행하는 방법을 이용합니다.
물론 이러한 방법이 잘못된 것은 아니지만 CREATE 문 앞에 이미 존재하는지의 유무를 확인하고 존재하면 먼제 제거하는 루틴을 포함시켜 놓는게 좋습니다. 대부분 알고 계시리라 생각하지만 혹시 모르시는 분들을 위해 그 방법을 설명드리도록 하겠습니다.
1. sysobjects 시스템 테이블 이용
Pubs 데이터베이스에는 다음과 같이 byroyalty 라는 저장프로시저가 이미 만들어져 있습니다.
|
CREATE PROCEDURE byroyalty @percentage int AS SELECT au_id FROM titleauthor WHERE titleauthor.royaltyper = @percentage GO |
만일 Pubs 데이터베이스에서 위 CREATE 문을 다시 수행하게 되면 다음과 같은 에러가 발생합니다.
|
서버: 메시지 2714, 수준 16, 상태 5, 프로시저 byroyalty, 줄 4 데이터베이스에 'byroyalty'(이)라는 개체가 이미 있습니다. |
예측된 바와 같이 이미 존재하기 때문에 CREATE 문이 수행되지 못하는 것입니다. 이러한 경우 DROP을 한 후 다시 CREATE 해주면 되므로 스크립트를 다음과 같이 수정할 수 있습니다.
DROP PROCEDURE byroyalty GO CREATE PROCEDURE byroyalty |
하지만 위 스크립트는 처움에 무작정 byroyalty 저장프로시저를 지우게 되어 있으므로 만일 byroyalty 저장프로시저가 존재하지 않는다면 에러가 발생하게 되어 깔끔하지 못한 결과를 얻게 됩니다.
sysobjects 저장 프로시저를 이용하면 이러한 문제를 해결 할 수 있습니다.
IF EXISTS (SELECT * FROM sysobjects WHERE name = 'byroyalty' AND xtype = 'p') DROP PROCEDURE byroyalty GO CREATE PROCEDURE byroyalty |
IF 문 부분을 보시게 되면 sysobjects 시스템 테이블에서 저장프로시저 중에(xtype = 'p') byroyalty라는 이름의 개체(name = 'byroyalty')가 있으면 DROP 문을 수행하고 있습니다. 이렇게 스크립트를 작성해 두면 매번 개체가 있는지 없는지 확인해서 직접 DROP 문을 수행할 필요가 없게 됩니다.
2. object_id() 함수이용
object_id() 함수는 () 안의 개체의 ID를 넘겨주는 역할을 합니다. 만일 () 안에 지정한 개체가 실제로 존재하지 않는다면 NULL 값이 리턴됩니다. 이러한 사실을 이용하면 만들려고 하는 개체의 존재 유무를 쉽게 확인 할 수 있습니다.
|
IF object_id('byroyalty') IS NOT NULL DROP PROCEDURE byroyalty GO CREATE PROCEDURE byroyalty |
object_id() 함수의 결과가 NULL 이 아니라(IS NOT NULL)는 것은 이미 존재 한다는 의미이므로 DROP 문을 수행하게 하면 됩니다.
3. 정리
꼭 필요하지는 않지만 알면 유익한 개체의 존재유무 확인 방법을 살펴 보았습니다. 이러한 방법을 이용하면 좀더 깔끔한 스크립트 작성이 가능하리라 생각됩니다. 특히 자주 반복되어 사용되는 스크립트의 경우 유용하게 사용할 수 있습니다.
댓글목록
등록된 댓글이 없습니다.