함수를 호출 할 때 왜 스키마 접두사 (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.