함수를 호출 할 때 왜 스키마 접두사 (dbo)가 필수입니까?


9

사용자가 기본 스키마 (dbo)로 매핑되고 스키마 접두사없이 [dbo]에서 모든 테이블을 선택할 수 있습니다.

기본 스키마 아래에있는 경우 접두사없이 저장 프로 시저를 실행할 수 있습니다.

그렇다면 왜 스키마 앞에 함수를 접두사가 필요합니까?

감사!

답변:


11

그렇다면 왜 dbo 아래에 생성 된 접두어 (스키마)없이 함수를 호출 할 수 있습니까?

에서 UDF의 도서 온라인 문서

스칼라 표현식이 사용되는 경우 스칼라 값 함수를 호출 할 수 있습니다. 여기에는 계산 열 및 CHECK 제약 조건 정의가 포함됩니다. EXECUTE 문을 사용하여 스칼라 값 함수를 실행할 수도 있습니다. 스칼라 값 함수는 최소한 함수의 두 부분으로 된 이름을 사용하여 호출해야합니다 .

따라서 이것은 기본적으로 SQL Server 개발 팀이 설정 한 제한 사항이며 상당히 올바른 것으로 간주합니다. 어떻게 든 허용되지만 (대화를 위해서만) 여전히 스키마 접두사를 사용합니다.

스키마 이름을 추가하지 않고 작동하더라도 항상 스키마 이름 사용을 지원합니다. 이것은 모범 사례이며 모든 "좋은"개발자는 아무리 많은 중복이 있어도이를 사용합니다.

내가 보는 또 다른 이유는 데이터베이스 엔진과 같은 시스템 기능 getdate ()과 사용자 정의 기능 을 구별 할 무언가가 필요하기 때문 입니다. 스키마 이름없이 함수를 호출 할 수있는 경우 데이터베이스 엔진이 Getdate라는 사용자 작성 함수 또는 시스템 GETDATE () 함수를 어떻게 구별 할 수 있습니까?


그렇다면 왜 SP와 다른가? 말했듯이 이름 충돌을 피할 수 있습니다. 방금 사용자 데이터베이스에서 SP "Create get sp (help as select getdate ()" "프로 시저를 만들었고 스키마 (dbo)를 사용하거나 사용하지 않고 실행할 때 SQL Server는 시스템 SP를 참조합니다. 내가 만든 SP를 실행하지 않는 이유는 무엇입니까?
— Rajesh Ranjan

1
@rajeshRajan sp_procname (프로세스에 SP를 접두어로 붙음)이 있으므로 SQL Server에서 컴파일 된 계획의 마스터 데이터베이스를 먼저 찾게되며이 proc가 master 데이터베이스에 존재하므로 proc를 찾지 못하면 실행되지 않습니다. 마스터에서 당신을 실행했을 것입니다. 성능 문제가 있기 때문에 접두어 sp_를 사용하여 proc을 작성해서는 안됩니다.
— Shanky

Shanky가 SQL Server 개발 팀이 설정 한 것을 언급했을 때 "왜"질문에 직접 대답했다고 생각합니다. 왜 그렇게했는지, 왜 함수의 동작이 절차와 일치하지 않는지 물을 수는 있지만 대답은 그다지 중요하지 않습니다.
— Michael J Swart

1
BTW, "sp_"로 시작하는 프로 시저의 성능 영향을 측정 할 수 없습니다. 몇 년 동안 문제가되지 않았습니다. sp 접두사는 여전히 좋은 생각은 아니지만 성능이 그 이유는 아닙니다.
— Michael J Swart

10

다른 답변은 이것이 제한이지만 그 이유는 아니라고 설명합니다.

요구 사항이 항상 사실은 아닙니다. 스칼라 UDF를 사용할 수 있으며 EXEC여전히 암시 적 해상도를 사용합니다 ( 예 )

나는 이것이 이름 충돌을 피하는 것이라고 상상한다.

스키마없이 함수를 참조 할 수 있으면 crypt_gen_random2000 또는 2005 년에 호출 된 고유 한 함수를 만든 사람 이 2008 년에 내장 함수의 이름이되면서 이후 버전으로 업그레이드하는 데 문제가 발생합니다.

exec내장 함수를 호출 할 수 없으므로 사용법에 대한 모호함이 없습니다 .


그렇다면 왜 SP와 다른가? 말했듯이 이름 충돌을 피할 수 있습니다. 방금 사용자 데이터베이스에서 SP "Create get sp (help as select getdate ()" "프로 시저를 만들었고 스키마 (dbo)를 사용하거나 사용하지 않고 실행할 때 SQL Server는 시스템 SP를 참조합니다. 내가 만든 SP를 실행하지 않는 이유는 무엇입니까?
— Rajesh Ranjan

3
@Rajesh. sp_로 시작하는 객체는 항상 마스터 / 리소스 데이터베이스를 확인하기 위해 특수한 경우입니다. 그리고이 접두사는 피해야한다고 문서화되어 있습니다. 내장 함수에 대한 이러한 규칙은 없습니다.
— Martin Smith
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.