Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Cách lưu trữ bản ghi lịch sử trong bảng lịch sử trong SQL Server

Về cơ bản, bạn đang tìm cách theo dõi / kiểm tra các thay đổi đối với bảng trong khi vẫn giữ cho bảng chính có kích thước nhỏ.

Có một số cách để giải quyết vấn đề này. Những nhược điểm và ưu điểm của mỗi cách sẽ được thảo luận dưới đây.

1 - Kiểm tra bảng với trình kích hoạt.

Nếu bạn đang muốn kiểm tra bảng (chèn, cập nhật, xóa), hãy xem cách kiểm tra lại các giao dịch không mong muốn của tôi - Bản trình chiếu thứ bảy của SQL w / code - http://craftydba.com/?page_id=880. Trình kích hoạt điền vào bảng kiểm tra có thể giữ thông tin từ nhiều bảng, nếu bạn chọn, vì dữ liệu được lưu dưới dạng XML. Do đó, bạn có thể hủy xóa một hành động nếu cần bằng cách phân tích cú pháp XML. Nó theo dõi ai và điều gì đã tạo ra thay đổi.

Theo tùy chọn, bạn có thể có bảng kiểm tra trên nhóm tệp của riêng nó.

Description:
    Table Triggers For (Insert, Update, Delete)
    Active table has current records.
    Audit (history) table for non-active records.

Pros:
    Active table has smaller # of records.
    Index in active table is small.
    Change is quickly reported in audit table.
    Tells you what change was made (ins, del, upd)

Cons:
    Have to join two tables to do historical reporting.
    Does not track schema changes.

2 - Ghi lại niên đại hiệu quả

Nếu bạn không bao giờ xóa dữ liệu khỏi bảng kiểm tra, tại sao không đánh dấu hàng là đã xóa mà giữ nó mãi mãi? Nhiều hệ thống như mọi người sử dụng tính năng hẹn hò hiệu quả để hiển thị nếu một bản ghi không còn hoạt động. Trong thế giới BI, đây được gọi là bảng loại 2 chiều (kích thước thay đổi từ từ). Xem bài báo của viện kho dữ liệu. http://www.bidw.org/datawarehousing/scd-type-2/ Mỗi bản ghi đều có ngày bắt đầu và ngày kết thúc.

Tất cả các bản ghi đang hoạt động đều có ngày kết thúc là null.

Description:
    Table Triggers For (Insert, Update, Delete)
    Main table has both active and historical records.

Pros:
    Historical reporting is easy.
    Change is quickly shown in main table.

Cons:
    Main table has a large # of records.
    Index of main table is large.
    Both active & history records in same filegroup.
    Does not tell you what change was made (ins, del, upd)
    Does not track schema changes.

3 - Thay đổi tính năng thu thập dữ liệu (Tính năng dành cho doanh nghiệp).

Micorsoft SQL Server 2008 đã giới thiệu tính năng thu thập dữ liệu thay đổi. Mặc dù điều này theo dõi sự thay đổi dữ liệu (CDC) bằng cách sử dụng trình đọc LOG sau khi thực tế, nó thiếu những thứ như ai và điều gì đã tạo ra thay đổi. Chi tiết MSDN - http://technet.microsoft.com/en-us/library/bb522489(v=sql.105).aspx

Giải pháp này phụ thuộc vào các công việc CDC đang chạy. Bất kỳ sự cố nào với tác nhân sql sẽ gây ra sự chậm trễ trong việc hiển thị dữ liệu.

Xem các bảng thu thập dữ liệu thay đổi. Http://technet.microsoft.com/en-us/library/bb500353 (v =sql.105) .aspx

Description:
    Enable change data capture

Pros:
    Do not need to add triggers or tables to capture data.
    Tells you what change was made (ins, del, upd) the _$operation field in 
    <user_defined_table_CT>
    Tracks schema changes.    

Cons:
    Only available in enterprise version.
    Since it reads the log after the fact, time delay in data showing up.
    The CDC tables do not track who or what made the change.
    Disabling CDC removes the tables (not nice)!
    Need to decode and use the _$update_mask to figure out what columns changed.

4 - Tính năng theo dõi thay đổi (Tất cả các phiên bản).

Micorsoft SQL Server 2008 đã giới thiệu tính năng theo dõi thay đổi. Không giống như CDC, nó đi kèm với tất cả các phiên bản; Tuy nhiên, nó đi kèm với một loạt các hàm TSQL mà bạn phải gọi để tìm ra điều gì đã xảy ra.

Nó được thiết kế với mục đích đồng bộ hóa một nguồn dữ liệu với máy chủ SQL thông qua một ứng dụng. Có toàn bộ khung đồng bộ hóa hoạt động trên TechNet.

http://msdn.microsoft.com/en-us/library/bb933874.aspxhttp://msdn.microsoft.com/en-us/library/bb933994.aspxhttp://technet.microsoft.com/en-us/ thư viện / bb934145 (v =sql.105) .aspx

Không giống như CDC, bạn chỉ định thời gian thay đổi kéo dài trong cơ sở dữ liệu trước khi bị xóa. Ngoài ra, các thao tác chèn và xóa không ghi lại dữ liệu. Các bản cập nhật chỉ ghi lại trường nào đã thay đổi.

Vì bạn đang đồng bộ hóa nguồn máy chủ SQL với một mục tiêu khác, điều này hoạt động tốt. Nó không tốt cho việc kiểm tra trừ khi bạn viết một công việc định kỳ để tìm ra các thay đổi.

Bạn sẽ vẫn phải lưu trữ thông tin đó ở đâu đó.

Description:
    Enable change tracking

Cons:
    Not a good auditing solution

Ba giải pháp đầu tiên sẽ phù hợp với công việc kiểm toán của bạn. Tôi thích giải pháp đầu tiên vì tôi sử dụng nó rộng rãi trong môi trường của mình.

Trân trọng

John

Đoạn mã từ bản trình bày (Cơ sở dữ liệu ô tô)

-- 
-- 7 - Auditing data changes (table for DML trigger)
-- 


-- Delete existing table
IF OBJECT_ID('[AUDIT].[LOG_TABLE_CHANGES]') IS NOT NULL 
  DROP TABLE [AUDIT].[LOG_TABLE_CHANGES]
GO


-- Add the table
CREATE TABLE [AUDIT].[LOG_TABLE_CHANGES]
(
  [CHG_ID] [numeric](18, 0) IDENTITY(1,1) NOT NULL,
  [CHG_DATE] [datetime] NOT NULL,
  [CHG_TYPE] [varchar](20) NOT NULL,
  [CHG_BY] [nvarchar](256) NOT NULL,
  [APP_NAME] [nvarchar](128) NOT NULL,
  [HOST_NAME] [nvarchar](128) NOT NULL,
  [SCHEMA_NAME] [sysname] NOT NULL,
  [OBJECT_NAME] [sysname] NOT NULL,
  [XML_RECSET] [xml] NULL,
 CONSTRAINT [PK_LTC_CHG_ID] PRIMARY KEY CLUSTERED ([CHG_ID] ASC)
) ON [PRIMARY]
GO

-- Add defaults for key information
ALTER TABLE [AUDIT].[LOG_TABLE_CHANGES] ADD CONSTRAINT [DF_LTC_CHG_DATE] DEFAULT (getdate()) FOR [CHG_DATE];
ALTER TABLE [AUDIT].[LOG_TABLE_CHANGES] ADD CONSTRAINT [DF_LTC_CHG_TYPE] DEFAULT ('') FOR [CHG_TYPE];
ALTER TABLE [AUDIT].[LOG_TABLE_CHANGES] ADD CONSTRAINT [DF_LTC_CHG_BY] DEFAULT (coalesce(suser_sname(),'?')) FOR [CHG_BY];
ALTER TABLE [AUDIT].[LOG_TABLE_CHANGES] ADD CONSTRAINT [DF_LTC_APP_NAME] DEFAULT (coalesce(app_name(),'?')) FOR [APP_NAME];
ALTER TABLE [AUDIT].[LOG_TABLE_CHANGES] ADD CONSTRAINT [DF_LTC_HOST_NAME] DEFAULT (coalesce(host_name(),'?')) FOR [HOST_NAME];
GO



--
--  8 - Make DML trigger to capture changes
--


-- Delete existing trigger
IF OBJECT_ID('[ACTIVE].[TRG_FLUID_DATA]') IS NOT NULL 
  DROP TRIGGER [ACTIVE].[TRG_FLUID_DATA]
GO

-- Add trigger to log all changes
CREATE TRIGGER [ACTIVE].[TRG_FLUID_DATA] ON [ACTIVE].[CARS_BY_COUNTRY]
  FOR INSERT, UPDATE, DELETE AS
BEGIN

  -- Detect inserts
  IF EXISTS (select * from inserted) AND NOT EXISTS (select * from deleted)
  BEGIN
    INSERT [AUDIT].[LOG_TABLE_CHANGES] ([CHG_TYPE], [SCHEMA_NAME], [OBJECT_NAME], [XML_RECSET])
    SELECT 'INSERT', '[ACTIVE]', '[CARS_BY_COUNTRY]', (SELECT * FROM inserted as Record for xml auto, elements , root('RecordSet'), type)
    RETURN;
  END

  -- Detect deletes
  IF EXISTS (select * from deleted) AND NOT EXISTS (select * from inserted)
  BEGIN
    INSERT [AUDIT].[LOG_TABLE_CHANGES] ([CHG_TYPE], [SCHEMA_NAME], [OBJECT_NAME], [XML_RECSET])
    SELECT 'DELETE', '[ACTIVE]', '[CARS_BY_COUNTRY]', (SELECT * FROM deleted as Record for xml auto, elements , root('RecordSet'), type)
    RETURN;
  END

  -- Update inserts
  IF EXISTS (select * from inserted) AND EXISTS (select * from deleted)
  BEGIN
    INSERT [AUDIT].[LOG_TABLE_CHANGES] ([CHG_TYPE], [SCHEMA_NAME], [OBJECT_NAME], [XML_RECSET])
    SELECT 'UPDATE', '[ACTIVE]', '[CARS_BY_COUNTRY]', (SELECT * FROM deleted as Record for xml auto, elements , root('RecordSet'), type)
    RETURN;
  END

END;
GO



--
--  9 - Test DML trigger by updating, deleting and inserting data
--

-- Execute an update
UPDATE [ACTIVE].[CARS_BY_COUNTRY]
SET COUNTRY_NAME = 'Czech Republic'
WHERE COUNTRY_ID = 8
GO

-- Remove all data
DELETE FROM [ACTIVE].[CARS_BY_COUNTRY];
GO

-- Execute the load
EXECUTE [ACTIVE].[USP_LOAD_CARS_BY_COUNTRY];
GO 

-- Show the audit trail
SELECT * FROM [AUDIT].[LOG_TABLE_CHANGES]
GO

-- Disable the trigger
ALTER TABLE [ACTIVE].[CARS_BY_COUNTRY] DISABLE TRIGGER [TRG_FLUID_DATA];

** Giao diện và cảm nhận của bảng kiểm toán **



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Chuyển đổi Mili giây UTC thành DATETIME trong máy chủ SQL

  2. Tại sao sử dụng Chọn 100 Phần trăm Hàng đầu?

  3. SQL Server datetime LIKE chọn?

  4. Không thể tạo phiên bản của nhà cung cấp OLE DB Microsoft.Jet.OLEDB.4.0 cho máy chủ được liên kết rỗng

  5. Thay đổi mức độ ưu tiên của tài khoản trong cấu hình thư cơ sở dữ liệu (SSMS)