캡처 - SQL Server 테이블에 대한 변경 사항을 확인 하시겠습니까?




sql 변경 내용 추적 (6)

CHECKSUM 명령을 살펴보십시오.

SELECT CHECKSUM_AGG(BINARY_CHECKSUM(*)) FROM sample_table WITH (NOLOCK);

테이블 내용이 변경되지 않는 한 실행될 때마다 동일한 번호가 반환됩니다. 자세한 내용은 내 게시물을 참조하십시오.

CHECKSUM

다음은 테이블을 변경했을 때 캐시 종속성을 다시 작성하는 방법입니다.
ASP.NET 1.1 데이터베이스 캐시 종속성 (트리거 없음)

어떤 방식 으로든 트리거를 사용하거나 데이터베이스 구조를 수정하지 않고 SQL Server 데이터베이스에서 테이블 변경 사항을 모니터링하려면 어떻게합니까? 내가 선호하는 프로그래밍 환경은 .NET 과 C #이다.

SQL Server 2000 SP4 이상을 지원하고 싶습니다. 내 응용 프로그램은 다른 회사 제품에 대한 볼트 식 데이터 시각화입니다. 고객 기반은 수천에 달합니다. 따라서 모든 설치시 타사 공급 업체의 테이블을 수정해야한다는 요구 사항을 넣지 않아도됩니다.

"테이블 변경" 은 테이블 구조의 변경 사항이 아니라 테이블 데이터의 변경을 의미합니다.

궁극적으로 변경 사항을 주기적으로 확인하지 않고 변경 사항을 응용 프로그램에서 트리거하려고합니다.

내 요구 사항 (트리거 또는 스키마 수정, SQL Server 2000 및 2005)이 제공하는 최선의 조치는 T-SQL 에서 BINARY_CHECKSUM 함수를 사용하는 것입니다. 구현하려는 방법은 다음과 같습니다.

X 초마다 다음 쿼리를 실행합니다.

SELECT CHECKSUM_AGG(BINARY_CHECKSUM(*))
FROM sample_table
WITH (NOLOCK);

저장된 값과 비교하십시오. 값이 변경된 경우 쿼리를 사용하여 행 단위로 테이블을 탐색합니다.

SELECT row_id, BINARY_CHECKSUM(*)
FROM sample_table
WITH (NOLOCK);

그리고 반환 된 체크섬과 저장된 값을 비교합니다.


마지막 커밋 날짜를 확인하십시오. 모든 데이터베이스에는 각 커밋이 수행 된 기록이 있습니다. 나는 ACID 준수 표준을 믿습니다.


얼마나 자주 변경 사항을 확인하고 데이터베이스의 테이블이 얼마나 큰지 (행 크기면에서) 필요합니까? John이 제안한 CHECKSUM_AGG(BINARY_CHECKSUM(*)) 메소드를 사용하면 지정된 테이블의 모든 행을 검색합니다. NOLOCK 힌트는 도움이되지만 큰 데이터베이스에서는 여전히 모든 행을 치고 있습니다. 또한 모든 행에 대한 체크섬을 저장해야 변경 사항이 있음을 알릴 수 있습니다.

다른 각도에서 이걸 생각해 봤어? 트리거를 추가하기 위해 스키마를 수정하지 않으려는 경우 (이는 데이터베이스가 아님), 데이터베이스를 만드는 응용 프로그램 공급 업체와의 협력을 고려 했습니까?

그들은 데이터가 변경되었음을 액세서리 애플리케이션에 알려주는 메커니즘을 제공하는 API를 구현할 수 있습니다. 어떤 테이블과 어떤 행이 수정되었는지 알려주는 알림 테이블에 쓰는 것만 큼 간단 할 수 있습니다. 이는 트리거 또는 응용 프로그램 코드를 통해 구현 될 수 있습니다. 귀하의 측면에서, 티는 중요하지 않으며, 귀하의 유일한 관심사는 정기적으로 통지 테이블을 스캐닝하는 것입니다. 데이터베이스 성능이 변경되면 모든 행을 검색하는 것보다 훨씬 적습니다.

어려운 부분은 애플리케이션 벤더가이 기능을 구현하도록 설득하는 것입니다. 트리거를 통해 SQL을 통해 전적으로 처리 할 수 ​​있으므로 트리거를 작성하고 테스트 한 다음 응용 프로그램 공급 업체에 코드를 가져 와서 대량 작업을 수행 할 수 있습니다. 벤더가 트리거를 지원하도록함으로써 트리거를 추가하면 부주의하게 공급 업체가 제공 한 트리거를 대체하는 상황을 방지합니다.


여기에 야생 추측 : 타사의 테이블을 수정하고 싶지 않다면보기를 만든 다음 해당보기에 트리거를 넣을 수 있습니까?


주어진 간격으로 실행되는 DTS 작업 (또는 Windows 서비스에 의해 시작된 작업)이 있어야합니다. 이 테이블은 실행될 때마다 시스템 INFORMATION_SCHEMA 테이블을 사용하여 주어진 테이블에 대한 정보를 가져 와서이 데이터를 데이터 저장소에 기록합니다. 테이블의 구조와 관련하여 리턴 된 데이터를 이전에 리턴 된 데이터와 비교하십시오. 그것이 다른 경우 구조가 변경되었음을 알게됩니다.

테이블 ABC의 모든 열에 관한 정보를 반환하는 쿼리 예 (여기에서 * select **를 사용하는 대신 원하는 INFORMATION_SCHEMA 테이블의 열만 나열하는 것이 이상적입니다.) :

select * from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = 'ABC'

"테이블 변경 사항"을 정의하는 방법에 따라 다른 열과 INFORMATION_SCHEMA보기를 모니터합니다.


불행히도 CHECKSUM은 변경 사항을 감지하기 위해 항상 올바르게 작동하지 않습니다 . 원시 체크섬이며 CRC 계산은 없습니다. 따라서 모든 변경 사항을 감지하는 데 사용할 수 없습니다. 대칭 변경으로 인해 동일한 CHECKSUM이 발생합니다!

E. g. CHECKSUM_AGG(BINARY_CHECKSUM(*)) 가있는 솔루션은 내용이 다른 모든 3 개의 테이블에 항상 0을 전달합니다!


SELECT CHECKSUM_AGG(BINARY_CHECKSUM(*)) FROM 
(
  SELECT 1 as numA, 1 as numB
  UNION ALL
  SELECT 1 as numA, 1 as numB
)  q
-- delivers 0!

SELECT CHECKSUM_AGG(BINARY_CHECKSUM(*)) FROM ( SELECT 1 as numA, 2 as numB UNION ALL SELECT 1 as numA, 2 as numB ) q -- delivers 0!

SELECT CHECKSUM_AGG(BINARY_CHECKSUM(*)) FROM ( SELECT 0 as numA, 0 as numB UNION ALL SELECT 0 as numA, 0 as numB ) q -- delivers 0!





rdbms