2010-04-29 4 views
9

우리는 DateTime을 반환하는 스칼라 함수를 가지고 있습니다. 리턴 값을 얻기 위해 몇 가지 빠른 테이블 선택을 수행합니다. 이 함수는 데이터베이스 전체에서 이미 사용 중입니다. 기본 제약 조건, 저장된 procs 등에서 함수의 구현을 변경하고 싶습니다. (테이블 히트를 제거하고보다 효율적으로 만들 수 있습니다.)하지만 분명히 그렇게 할 수는 없습니다. 데이터베이스의 다른 오브젝트에 의해 참조됩니다. 실제로 데이터베이스를 참조하는 모든 개체를 업데이트하거나 삭제하고 함수를 업데이트 한 다음 해당 개체를 업데이트하거나 다시 만들어 함수에 대한 참조를 복원해야합니까?
함수는 소수의 뷰, 트리거, 두 개의 함수 및 많은 수의 기본 제약 조건과 저장된 procs로 참조됩니다.SqlServer2008 - 많은 곳에서 참조되는 동안 스칼라 함수를 변경할 수 있습니까?

감사의 말씀을드립니다.

나도 변경 시도하거나 기능을 드롭 할 때 내가지고있어 오류는 다음과 같습니다

수 없습니다 [ALTER | DROP 기능]이 객체에 의해 참조되고 있기 때문에 'dbo.GetClientCurrentTime' 'DF_tbl_PatientOrder_Note_RecordCreated' .

+0

파생 열에서 사용하는 경우 열을 일시적으로 삭제해야합니다. 저장된 procs에서의 사용은 수정 될 필요가 없다. 기본 제약 조건 사용에 대해 확신하지 못합니다. –

+0

* 데이터베이스의 다른 개체에서 참조하는 동안 분명히 그 작업을 수행 할 수 없습니다 * - 어떤 오류가 발생합니까? – egrunin

답변

0

다릅니다. 함수를 참조하는 객체가 WITH SCHEMABINDING 옵션을 가지고 있다면 그 함수를 사용하는 것이 명백히 금지됩니다. 그렇지 않으면 유일한 제한 사항은 일반 DDL 액세스 잠금 제한입니다. 즉, 함수를 사용하는 실행 계획은 스키마 안정성 잠금을 함수에 배치하므로 스키마 수정 잠금이 필요하므로 ALTER FUNCTION 문을 차단합니다. 그러나 계획이 실행을 완료하면이 문제가 해결됩니다.

+0

질문 본문에 오류가 추가되었습니다. 문서에서 SCHEMABINDING을 찾았으며 개체에 대해 사용 중이거나 개체에서 사용하지 않도록 설정하는 방법을 찾을 수 없습니다. 문제가 SCHEMABINDING과 관련되어 있음을 나타내는 오류 메시지가 표시됩니까? 당신은 그것을 끄는 방법을 알고 있습니까? 당신의 도움에 대한 감사합니다. –

+0

'DF_tbl_PatientOrder_Note_RecordCreated' 란 무엇입니까? 다른 함수, 파생 열, 검사 제약? –

+0

DF_tbl_PatientOrder_Note_RecordCreated가 기본 제약 조건입니다. 함수는 소수의 뷰, 트리거, 두 개의 함수 및 많은 수의 기본 제약 조건과 저장된 procs로만 참조됩니다. –

-1

입력 매개 변수와 출력 유형이 변경되지 않은 경우 아무런 문제없이 내부 수정을 수행 할 수 있어야합니다.

+0

그건 분명히 내가 생각한 것입니다. 실제로, 나는 또한 변화를 깨뜨릴 수 있어야합니다. 결과는 내가 깨뜨린 것입니다. 그러나 단순히 기능을 변경할 수 없기 때문에 기간? 그것은 상당히 우스운 제한처럼 보입니다. 그래서 나는 그것을 뛰어 넘기 위해 약간의 농구대를 놓치고 있어야한다고 생각합니다. –

+0

사실, 잘못되었습니다. 함수에 'WITH SCHEMABINDING'이 있고 어떤 객체가이를 참조하면 어떤 변경도 실행할 수 없습니다 ... –

관련 문제