2010-02-02 3 views
1

"%"를 사용하여 여러 프로 시저를 쉽게 삭제할 수 있는지 궁금합니다. 처럼 :여러 프로 시저 삭제 (SQL2005)

DROP의 constantName의 %는

내가 관리 스튜디오에서 DROP을 사용, 그 다음과 같습니다

/****** Object: StoredProcedure [dbo].[x] Script Date: 02/02/2010 09:36:25 ******/ 
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[x]') AND type in (N'P', N'PC')) 
DROP PROCEDURE [dbo].[x] 

은 왜 내가이 특정 개체를 삭제하고 개체 ID를 확인하고 있습니다?

답변

1

OBJECT_ID은 스키마 범위 개체의 데이터베이스 개체 식별 번호를 반환합니다. 귀하의 코드에서 그것은 IF EXISTS 내부에서 검사하므로 데이터베이스에 저장된 proc만을 드롭합니다.

단지 DROP PROCEDURE proc_name 일 수 있지만 절차가 없으면 오류가 발생할 수 있습니다. 제거하기 전에 확인하는 것이 좋습니다.

테이블,보기, 저장된 Procs 등은 모두 OBJECT_ID를 키 식별자로 사용합니다.

LIKE을 사용하여 여러 저장 프로 시저를 삭제할 수 있다고 생각하지 않습니다. (비록 i가 100 % 확실하지는 않습니다.)

1

DROP에서 유사한 구문을 사용할 수 없으므로 간단한 하나의 강 아래에서 여러 절차를 생략 할 수 있습니다.

DROP PROCEDURE testest,testest1 

그리고 두 번째 질문입니다. 특정 역할에만 액세스 할 수있는 Storedprocedure를 만들 수있는 시나리오가 있습니다.

create proc dbo.testest 
as 
begin 
    select 1 
end 

쿼리는 역할 값과는 sys.objects

select * from sys.objects where name ='dbo.testest' 

는 null을 반환 지금

select * from sys.objects where name ='testest' 

이 역할없이

는 sys.objects 카탈로그 뷰 정보를 저장 작동 이름 (단지 이름 만). 그러나 OBJECT_ID를 사용하여 역할 특정 정보를 검색 할 수 있습니다.

select OBJECT_ID('dbo.testest') //works 
    select OBJECT_ID('testest') //works 

희망을 이해하십시오.

+0

나는 OP가 하나의 쿼리에서 하나 이상의 저장 프로 시저를 삭제하는 방법을 알고 싶어한다고 생각합니다. 질문을 읽으십시오. – invert

+1

@keyboardmonkey, "왜이 특정 객체를 삭제할 때 객체 ID를 확인합니까?" 그는 구체적으로 물었다 .... – RameshVel

+0

그리고 이것은 mutliplr procs를 삭제할 수있는 유일한 방법입니다. DROP PROCEDURE testest, testest1 이것은 트릭을 수행합니다. – RameshVel

1

SQL은이 제한으로 설계되었다고 생각합니다. drop procedure 명령에는 문자열 상수가 필요합니다. 변수를 인수로 전달할 수도 없으며 그렇게하면 '잘못된 구문'오류가 발생합니다.

또한 OBJECT_ID 함수는 사용자가 소유하거나 권한이있는 객체의 유효한 ID 만 반환합니다. 따라서 OBJECT_ID는 보안 유효성 검사를 수행하기 때문에 사용됩니다.

"WHERE name = 'object_name'"으로 삭제하는 것은 사용자가 해당 개체에 대한 권한을 가지고있는 경우에만 가능합니다.

관련 문제