복붙노트

[SQL] 는 SQL Server 테이블에 대한 변경 사항을 확인?

SQL

는 SQL Server 테이블에 대한 변경 사항을 확인?

어떻게 트리거를 사용하거나 어떤 방법으로 데이터베이스의 구조를 수정하지 않고 테이블에 대한 변경을위한 SQL Server 데이터베이스를 모니터링 할 수 있습니다? 나의 선호하는 프로그래밍 환경은 .NET 및 C #입니다.

나는 어떤 SQL 서버 2000 SP4 이상을 지원할 수 있도록하고 싶습니다. 내 응용 프로그램은 볼트에 데이터 시각화 다른 회사의 제품입니다. 나는 우리가 모든 설치시 타사 공급 업체의 테이블을 수정하는 것이 요구 사항에 넣어야하지 않도록 우리의 고객 기반, 수천이다.

으로 테이블 데이터에 대한 I 평균 변화 "테이블로 변경"테이블 구조를 변경하지.

궁극적으로, 내가 대신 간격으로 변화를 확인 할 필요없이, 내 응용 프로그램에서 이벤트를 트리거 변경을하고 싶습니다.

최선의 조치 내 요구 사항을 주어 (어떤 트리거 또는 스키마 변경, 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);

그리고 저장된 값에 대해 반환 된 체크 6을 비교.

해결법

  1. ==============================

    1.체크섬 명령을 살펴 보자 :

    체크섬 명령을 살펴 보자 :

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

    즉, 같은 번호를이 긴 테이블의 내용이 변경되지 않은만큼 실행 될 때마다를 반환합니다. 자세한 내용은이 내 게시물을 참조 :

    CHECKSUM

    여기에 테이블이 변경 때 캐시 종속성을 다시 그것을 사용하는 방법은 다음과 같습니다 (트리거없이) ASP.NET 1.1 데이터베이스 캐시 종속성

  2. ==============================

    2.불행하게도 CHECKSUM은 항상 변화를 감지하는 제대로 작동하지 않습니다.

    불행하게도 CHECKSUM은 항상 변화를 감지하는 제대로 작동하지 않습니다.

    그것은 단지 프리미티브 체크섬없이 순환 중복 검사 (CRC)의 계산이다.

    따라서 당신은 전자 모든 변화를 감지하는 데 사용할 수 없습니다. 지. 대칭 변화는 같은 CHECKSUM 결과!

    E.의 g. CHECKSUM_AGG (BINARY_CHECKSUM (*))와 해결책은 항상 다른 콘텐츠와 3 개 테이블에 0을 제공합니다 :

    SELECT CHECKSUM_AGG (BINARY_CHECKSUM (*)) FROM ( 마비로 NUMA와 같은 1, 1을 선택 UNION ALL 마비로 NUMA와 같은 1, 1을 선택 ) Q - 0을 제공합니다!

    SELECT CHECKSUM_AGG (BINARY_CHECKSUM (*)) FROM ( 감각으로 NUMA 같은 1, 2를 선택 UNION ALL 감각으로 NUMA 같은 1, 2를 선택 ) Q - 0을 제공합니다!

    SELECT CHECKSUM_AGG (BINARY_CHECKSUM (*)) FROM ( 마비로 NUMA와 같은 0, 0을 선택 UNION ALL 마비로 NUMA와 같은 0, 0을 선택 ) Q - 0을 제공합니다!

  3. ==============================

    3.왜 트리거를 사용하지 않으려는? 제대로 그들을 사용하는 경우 그들은 좋은 일이다. 당신은 그들이 좋은에서 나쁜에 갈 때입니다 참조 무결성을 적용하는 방법으로 그것들을 사용하는 경우. 당신이 모니터링을 사용하는 경우, 그들은 정말 금기로 간주되지 않습니다.

    왜 트리거를 사용하지 않으려는? 제대로 그들을 사용하는 경우 그들은 좋은 일이다. 당신은 그들이 좋은에서 나쁜에 갈 때입니다 참조 무결성을 적용하는 방법으로 그것들을 사용하는 경우. 당신이 모니터링을 사용하는 경우, 그들은 정말 금기로 간주되지 않습니다.

  4. ==============================

    4.얼마나 자주 당신은 변화를 확인할 필요가 얼마나 큰 (행 크기의 측면에서)은 데이터베이스의 테이블입니다합니까? 당신이 CHECKSUM_AGG 존에 의해 제안 (BINARY_CHECKSUM (*)) 방법을 사용하는 경우는 지정된 테이블의 모든 행을 검색합니다. NOLOCK 힌트는 도움이되지만 큰 데이터베이스에, 당신은 여전히 ​​모든 행을 타격 있습니다. 당신은 또한 당신이 하나가 변경 말할 수 있도록 모든 행에 대해 체크섬을 저장해야합니다.

    얼마나 자주 당신은 변화를 확인할 필요가 얼마나 큰 (행 크기의 측면에서)은 데이터베이스의 테이블입니다합니까? 당신이 CHECKSUM_AGG 존에 의해 제안 (BINARY_CHECKSUM (*)) 방법을 사용하는 경우는 지정된 테이블의 모든 행을 검색합니다. NOLOCK 힌트는 도움이되지만 큰 데이터베이스에, 당신은 여전히 ​​모든 행을 타격 있습니다. 당신은 또한 당신이 하나가 변경 말할 수 있도록 모든 행에 대해 체크섬을 저장해야합니다.

    당신은 다른 각도에서이에 갈 생각 해 봤나? 트리거를 추가 할 수있는 스키마를 수정하지 않으려면 데이터베이스를 만들 않는 응용 프로그램 공급 업체와 협력 간주 한 (의미하게, 그것은 당신의 데이터베이스 아니다)?

    그들은 데이터가 변경 액세서리 애플 리케이션을 통지하는 메커니즘을 제공하는 API를 구현할 수 있습니다. 그것은 어떤 테이블과 행 목록이 수정 된 것을 통지 테이블에 쓰기로 간단하게 될 수 있습니다. 즉 트리거 또는 응용 프로그램 코드를 통해 구현 될 수있다. 귀하의 측면에서, TI는 당신의 유일한 관심사는 주기적으로 알림 테이블을 스캔하는 것, 중요하지 않을 것입니다. 데이터베이스의 성능 저하는 변화에 대한 모든 행을 스캔보다 훨씬 적은 것이다.

    어려운 부분은이 기능을 구현하는 응용 프로그램 공급 업체에 설득 될 것이다. 이 트리거를 통해 전체 SQL을 통해 핸들 할 수 있기 때문에, 당신은 응용 프로그램 공급 업체에 코드를 데려 후 작성 및 트리거를 테스트에 의해 그들을 위해 대부분의 작업을 할 수 있습니다. 공급 업체의 지원을 트리거를 가짐으로써, 당신의 추가 트리거가 실수로 공급 업체에서 제공하는 트리거를 대체하는 상황을 방지 할 수 있습니다.

  5. ==============================

    5.불행히도, 난 SQL2000에서이 작업을 수행 할 수있는 깨끗한 방법이 있다고 생각하지 않습니다. 당신은 SQL 서버 2005 (이상)에 대한 요구 사항을 좁힐 경우에, 당신은 사업에 있습니다. 당신의 System.Data.SQLClient에 SQLDependency 클래스를 사용할 수 있습니다. SQL 서버에서 참조하는 쿼리 알림 (ADO.NET).

    불행히도, 난 SQL2000에서이 작업을 수행 할 수있는 깨끗한 방법이 있다고 생각하지 않습니다. 당신은 SQL 서버 2005 (이상)에 대한 요구 사항을 좁힐 경우에, 당신은 사업에 있습니다. 당신의 System.Data.SQLClient에 SQLDependency 클래스를 사용할 수 있습니다. SQL 서버에서 참조하는 쿼리 알림 (ADO.NET).

  6. ==============================

    6.등 DTS 작업 (또는 Windows 서비스에 의해 시작되는 작업) 지정된 간격으로 실행하는 것이 있습니다. 이 실행될 때마다, 그것은 시스템 INFORMATION_SCHEMA 테이블을 사용하여 주어진 테이블에 대한 정보를 얻을 수 및 데이터 저장소에 데이터를 기록한다. 데이터가 이전의 시간을 반환로 데이터가 테이블의 구조에 대한 반환 비교. 이 다른 경우에, 당신은 구조가 변경된 것을 알고있다.

    등 DTS 작업 (또는 Windows 서비스에 의해 시작되는 작업) 지정된 간격으로 실행하는 것이 있습니다. 이 실행될 때마다, 그것은 시스템 INFORMATION_SCHEMA 테이블을 사용하여 주어진 테이블에 대한 정보를 얻을 수 및 데이터 저장소에 데이터를 기록한다. 데이터가 이전의 시간을 반환로 데이터가 테이블의 구조에 대한 반환 비교. 이 다른 경우에, 당신은 구조가 변경된 것을 알고있다.

    테이블 ABC의 모든 컬럼에 대한 반환 정보에 대한 예 쿼리 (이상적으로 사용하는 대신, 당신이 원하는 것을 INFORMATION_SCHEMA 테이블에서 불과 열을 목록 * 내가 여기처럼 ** 선택) :

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

    당신은 당신이 "테이블 변경"을 정의하는 방법을 정확하게에 따라 다른 열 및 INFORMATION_SCHEMA 뷰를 모니터링하는 것입니다.

  7. ==============================

    7.여기 추측 : 당신이 제 3 자 테이블을 수정하지 않으려면, 당신이보기를 만든 다음 해당 뷰에 트리거를 할 수 있나요?

    여기 추측 : 당신이 제 3 자 테이블을 수정하지 않으려면, 당신이보기를 만든 다음 해당 뷰에 트리거를 할 수 있나요?

  8. ==============================

    8.마지막 날짜를 커밋 확인합니다. 모든 데이터베이스는 각각 만들어 커밋 때의 역사를 가지고 있습니다. 나는 ACID 준수의 자사의 표준을 믿습니다.

    마지막 날짜를 커밋 확인합니다. 모든 데이터베이스는 각각 만들어 커밋 때의 역사를 가지고 있습니다. 나는 ACID 준수의 자사의 표준을 믿습니다.

  9. from https://stackoverflow.com/questions/36/check-for-changes-to-an-sql-server-table by cc-by-sa and MIT license