함수 / 저장 프로 시저 작성에서 스키마 점검 사용 안함


17

SQL Server 2008 R2 데이터베이스의 변경 사항을 실행하는 프로세스를 자동화하려고합니다. 내가 배치 한 프로세스는 저장 프로 시저와 함수를 삭제하고 다시 만들며 스크립트를 실행하여 테이블 / 열 / 데이터를 변경합니다. 불행히도, 스크립트 중 하나는 기능 중 하나를 먼저 배치해야합니다. 그러나 테이블 / 열 / 데이터 변경 스크립트에서 먼저 추가되는 열에 의존하기 때문에 저장된 모든 proc / function 변경 사항을 먼저 실행할 수 없습니다.

SQL Server가 함수 / SP 정의에 사용 된 열의 유효성을 검사하지 않고 저장 프로 시저 및 함수를 실행할 수 있는지 궁금합니다. 나는 시도했지만 이것을 가능하게하는 조건이나 명령을 찾을 수 없었습니다.


스크립트에서 객체 생성을 재정렬해야 할 수도 있습니다.
토마스 스트링거

@shark 변경 스크립트는 현재 존재하지 않는 함수에 의존해야하지만 수동 개입이 필요합니다. 나는 더 자동적 인 것을 원했다.
Brian Mains

답변:


20

아직 존재하지 않는 개체 (예 : 테이블 및 함수) 를 참조하는 저장 프로 시저를 만들 수 있습니다 . 아직 존재하지 않는 개체에는 아직 존재하지 않는 열을 참조하는 저장 프로 시저를 만들 수 없습니다. 이것은 지연된 이름 확인의 양날의 검입니다. SQL Server는 경우에 따라 의심의 이점을 제공하지만 전부는 아닙니다. SET STRICT_CHECKS ON;이것이 작동하는 장소와 그것이 깨지는 장소에 대한 아이디어를 얻으려면 Erland의 아이디어를 참조하십시오 .

http://www.sommarskog.se/strict_checks.html

(그리고 그가 당신이 추구하는 것과 반대되는 방식을 원한다면 어떻게 존재하는지에 관계없이 컴파일 할 수 있기를 원하며 모든 단일 열이나 테이블을 확인하기를 원합니다.)

다음과 같은 설정이 없습니다 SET DEFERRED_NAME_RESOLUTION OFF;:

http://connect.microsoft.com/sql/127152

그리고 같은 설정이 없습니다 IGNORE ALL_RESOLUTION;.


다음과 같은 몇 가지 방법으로이 문제를 해결할 수 있습니다.

(a) 영향을받는 저장 프로 시저에서 동적 SQL을 사용하십시오.

(b) CREATE PROCEDURE아무것도 포함하지 않는 스텁을 작성한 다음 나머지 스크립트를 실행 한 다음 ALTER PROCEDURE실제 본문이있는 스크립트를 실행하십시오 (본질적으로 절차를 두 단계로 전개).

(c) 작업 순서에 대해 배포 도구를보다 똑똑하게 만듭니다. 테이블 변경에 함수가 필요한 경우 해당 변경 내용을 마지막에 스크립팅하십시오. RedGate의 SQL Compare와 같은 스키마 비교 도구는 적절한 종속성 순서로 스크립트를 생성하는 데 매우 좋습니다. 어떤 도구를 사용하고 있는지 언급하지 않지만이 작업을 수행하지 않으면 ...

(d) Martin Smith는 여기에 흥미로운 해결 방법이 있지만 나는 그것을 가지고 놀지 않았습니다.


와, 마틴 스미스 해킹은 훌륭하게 영리합니다. 지금 사용하면 더러워졌지만 20 대 초반에는 그랬습니다.
John Zabroski

1

해당 객체를 먼저 삭제하거나 이름을 바꾸는 저장 프로 시저를 만든 다음 원래 저장 프로 시저를 동적 SQL로 실행할 수 있습니다. 이런 식으로 동적 SQL을 사용하기 위해 실제 저장 프로 시저를 다시 작성할 필요가 없습니다.

아래 코드는 아직 존재하지 않는 열을 참조하는 저장 프로 시저를 실행합니다 (Expense_Super_Compare)

IF OBJECT_ID('Expense_Super_Compare_Results', 'U') IS NOT NULL
BEGIN
     EXEC('DROP TABLE Expense_Super_Compare_Results');
END

exec('exec dbo.Expense_Super_Compare');
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.