스키마 변경 후 손상된 저장 프로 시저를 어떻게 감지합니까?


11

데이터베이스에서 중앙 테이블을 수정했으며 sp_depends는 문자 그대로 수백 개의 결과를 반환하며, 저장된 프로 시저 중 일부가 변경 후 더 이상 컴파일되지 않을 수도 있습니다.

하나의 단일 저장 프로 시저를 확인하는 것은 쉽지만 (방금 변경 스크립트를 다시 실행하고 작업이 성공적인지 확인하십시오) 100 + 절차에서 수행하는 것은 약간 성가신 일입니다.

나는 스크립트와 같은 스크립트를 사용하여 데이터베이스의 모든 객체를 다시 컴파일 할 수 있다는 것을 알고 있지만 실제 작업은 다음에 저장 프로 시저가 실행될 때 즉시 수행되지 않고 수행되므로 내 경우에는 적절하지 않은 것으로 보입니다.

또한 모든 저장 프로 시저를 모두 삭제하고 소스 제어 시스템으로 데이터베이스를 재구성 할 수 있다고 생각했지만 실행 가능하지만 그 옵션은 그리 우아하지 않습니다. 더 좋은 방법이 있습니까?

SQLServer 2008 R2를 사용하고 있으며 데이터베이스 스크립트는 VS 2008 데이터베이스 프로젝트에 저장되어 있습니다.


명확히하기 위해, 나는 코드를 테스트하기 위해이 접근법에 전적으로 의존해야한다고 주장하지 않습니다. C #에서와 마찬가지로 코딩 할 때 다른 종속 파일에서 구문 오류를 즉시 감지 한 다음 다른 전략을 사용하여 단위 테스트와 같은 테스트를 수행합니다 (일반적으로 몇 배 더 느림) SQL 종속성을 감지하는 것이 합리적이라고 생각합니다 전체 기능 테스트를 실행하는 대신 몇 초 만에 오류가 발생하며 일반적으로 완료하는 데 몇 시간이 걸릴 수 있습니다.

답변:


7

장치, 기능, 통합 및 성능 테스트를 수행하는 것은 어떻습니까? 테스트가 없다면 데이터베이스 스키마를 코드 로 고려 하여 버전 관리 및 테스트를 포함 하여 데이터베이스 스키마를 처리해야합니다. Alex Kuznetsov는이 주제 관련된 전체 서적을 보유하고 있습니다 : SQL Server를 사용한 방어 데이터베이스 프로그래밍 .


테스트가 항상 코드의 100 %를 커버하는 것은 아니며, 테스트가 실행되는 데 보통 몇 시간이 걸립니다. C #에서는 코드의 정확성에 관계없이 코드가 몇 초 안에 컴파일되는지 여부를 감지 할 수 있습니다. 이것은 코드를 올바르게 테스트하지 않고 코드를 c # 또는 PLSQL에 관계없이 프로덕션으로 푸시해야한다는 의미는 아니지만 깨진 종속성 을 신속하게 감지 하는 방법이 불합리한 것처럼 보이지 않습니까?
Brann

2
불행히도 현재 스토어드 프로 시저에서 Vs-a-vis 종속성 감지에 대한 최신 상태의 SQL Server는 '심층적으로 손상되었습니다' . SQL Server 2008에서 SQL 종속성 이해 또는 sysdepends 유지를 참조하십시오 . 이 문제를 해결하기 위해 써드 파티 툴
Remus Rusanu

2
따라서 단위 / 기능 테스트는 주요 변경 사항을 감지 할 수있는 신뢰할 수있는 유일한 방법입니다.
Remus Rusanu

1
빠른 검사를 위해 Visual Studio 데이터베이스 프로젝트는 변경 사항을 확인하는 데 꽤 괜찮은 일을합니다.
Remus Rusanu

4

해결 방법이지만 데이터베이스에 대한 CREATE PROCEDURE 스크립트를 생성하고 (데이터베이스를 마우스 오른쪽 단추로 클릭-> 작업-> 스크립트 생성) CREATE PROCEDURE를 찾아 ALTER PROCEDURE로 바꾼 다음 구문 분석하십시오.

나는 당신이 더 나은 답변을 얻을 수 있기를 바랍니다. 나도 관심이 있습니다! :)


나는 여전히 더 깨끗한 솔루션을 원하기 때문에 귀하의 답변을 수락 된 것으로 표시하지는 않습니다 (필자는 스크립트 가능 솔루션).하지만 당신은 분명히 내 +1을 얻습니다! 감사.
Brann

3
이 방법은 존재하지 않는 테이블을 참조하고 있는지 알려주지 않습니다 .
Nick Chammas

이 방법은 생성 된 스크립트가 약 30k 라인보다 큰 경우에도 작동하지 않습니다. 나는 이것을 알고 싫어 ..
Eonasdan

3

SSDT (Sql Server Data Tools)를 사용할 수 있습니다. Microsoft Visual Studio를 사용하면 Sql Server 프로젝트를 만들 수 있습니다. 그런 다음 데이터베이스를 프로젝트로 가져온 다음 프로젝트를 빌드하십시오. 저장 프로시 저나 개체가 손상되면 컴파일 오류가 발생합니다.


SSDT 프로젝트에서 새 데이터베이스 생성 스크립트를 쉽게 생성하고 테스트 환경에서 실행할 수 있다는 점을 추가하겠습니다. 스키마 변경으로 인해 procs / triggers / etc 등이 손상되지 않았 음을 철저히 확인할 것입니다.
AaronLS

3

T-SQL 저장 프로 시저를 확인하는 신뢰할 수있는 방법을 찾고 있는이 SO 질문을 볼 수 있습니다 . 누구 있어요? 몇 가지 대답과 본질적으로 같은 것을 요구하고 있습니다.

Alaa Awad가 게시 한 스크립트를 기반으로하려면 참조 및 참조 객체의 스키마와 데이터베이스가 표시되어야합니다. 별칭 (을 사용할 때 가끔 표시됨 sys.sql_expression_dependencies), UDTT 매개 변수 또는 기타 동적 기능을 통해 많은 임시 테이블 을 사용하는 경우 함수를 사용 sys.dm_sql_referenced_entities하거나 sys.dm_sql_referencing_entities대신 / 또한 사용해야 할 수도 있습니다.

SELECT
    DB_NAME() + '.' + OBJECT_SCHEMA_NAME(sed.referencing_id) + '.' + OBJECT_NAME(sed.referencing_id) AS [referencingObject],
    isnull(sed.referenced_server_name + '.', '') + isnull(sed.referenced_database_name + '.', DB_NAME() + '.') + isnull(sed.referenced_schema_name + '.', OBJECT_SCHEMA_NAME(sed.referencing_id) + '.') + sed.referenced_entity_name AS [missingReference]
FROM 
    sys.sql_expression_dependencies sed
WHERE 
    sed.is_ambiguous = 0
    AND OBJECT_ID(isnull(sed.referenced_database_name + '.', DB_NAME() + '.') + isnull(sed.referenced_schema_name + '.', OBJECT_SCHEMA_NAME(sed.referencing_id) + '.') + sed.referenced_entity_name) IS NULL
ORDER BY
    [referencingObject], [missingReference]

1
/ * 기존 사용자 유형이 아님 / AND sed.referenced_entity_name NOT IN (SELECT [이름] FROM sys.types) / 별명이 아님 * / AND sed.referenced_schema_name은 NULL이 아님
JasonBluefire

1

SQL Server 2008에 추가 된 sys.sql_expression_dependencies를 사용하십시오.

CREATE PROCEDURE [dbo].[spMaintenance_Find_Broken_Dependencies]

AS
SELECT
    OBJECT_NAME(referencing_id) AS [referencingObject],
    referenced_entity_name AS [missingReference]
FROM 
    sys.sql_expression_dependencies
WHERE 
    is_ambiguous = 0
    AND OBJECT_ID(referenced_entity_name) IS NULL
ORDER BY 
    OBJECT_NAME(referencing_id), referenced_entity_name

GO

이것은 유용 할 수 있지만 스키마도 고려해야 할만큼 간단하지는 않습니다. 또한 sys.sql_expession_dependencies가 실제 종속 테이블 대신 사용 된 별칭을 표시하는 문제가 발생합니다. 이는 분명히 object_id () 테스트에 실패합니다. 마지막으로 저장 프로 시저에 매개 변수로 전달 된 사용자 정의 테이블을 표시합니다. 이는 실제로 유용하지 않습니다.
Tabloo Quijico
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.