Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Bagaimana cara menyimpan catatan sejarah dalam tabel sejarah di SQL Server

Pada dasarnya Anda ingin melacak/mengaudit perubahan pada tabel sambil menjaga agar tabel utama tetap berukuran kecil.

Ada beberapa cara untuk mengatasi masalah ini. Kontra dan pro dari masing-masing cara dibahas di bawah ini.

1 - Audit tabel dengan pemicu.

Jika Anda ingin mengaudit tabel (menyisipkan, memperbarui, menghapus), lihat cara saya memulihkan transaksi yang tidak diinginkan - dek slide SQL Saturday w/code - http://craftydba.com/?page_id=880. Pemicu yang mengisi tabel audit dapat menyimpan informasi dari beberapa tabel, jika Anda memilih, karena data disimpan sebagai XML. Oleh karena itu, Anda dapat membatalkan penghapusan tindakan jika perlu dengan mengurai XML. Ini melacak siapa dan apa yang membuat perubahan.

Secara opsional, Anda dapat memiliki tabel audit di grup filenya sendiri.

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 - Menanggalkan catatan secara efektif

Jika Anda tidak akan pernah menghapus data dari tabel audit, mengapa tidak menandai baris sebagai dihapus tetapi menyimpannya selamanya? Banyak sistem seperti orang-orang yang menggunakan kencan efektif untuk menunjukkan jika sebuah catatan tidak lagi aktif. Dalam dunia BI ini disebut tabel tipe 2 dimensi (berubah dimensi secara perlahan). Lihat artikel lembaga gudang data. http://www.bidw.org/datawarehousing/scd-type-2/ Setiap catatan memiliki tanggal mulai dan berakhir.

Semua catatan aktif memiliki tanggal akhir nol.

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 - Ubah Pengambilan Data (Fitur Perusahaan).

Microsoft SQL Server 2008 memperkenalkan fitur perubahan data capture. Sementara ini melacak perubahan data (CDC) menggunakan pembaca LOG setelah fakta, ia tidak memiliki hal-hal seperti siapa dan apa yang membuat perubahan. Detail MSDN - http://technet.microsoft.com/en-us/library/bb522489(v=sql.105).aspx

Solusi ini tergantung pada pekerjaan CDC yang berjalan. Masalah apa pun dengan agen sql akan menyebabkan keterlambatan dalam menampilkan data.

Lihat mengubah tabel pengambilan data.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 - Ubah Fitur Pelacakan (Semua Versi).

Microsoft SQL Server 2008 memperkenalkan fitur pelacakan perubahan. Tidak seperti CDC, ia hadir dengan semua versi; Namun, ia hadir dengan banyak fungsi TSQL yang harus Anda panggil untuk mencari tahu apa yang terjadi.

Itu dirancang untuk tujuan sinkronisasi satu sumber data dengan SQL server melalui aplikasi. Ada seluruh kerangka kerja sinkronisasi di TechNet.

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

Tidak seperti CDC, Anda menentukan berapa lama perubahan bertahan dalam database sebelum dibersihkan. Selain itu, penyisipan dan penghapusan tidak merekam data. Pembaruan hanya mencatat bidang apa yang berubah.

Karena Anda menyinkronkan sumber server SQL ke target lain, ini berfungsi dengan baik. Ini tidak baik untuk mengaudit kecuali Anda menulis tugas berkala untuk mengetahui perubahan.

Anda masih harus menyimpan informasi tersebut di suatu tempat.

Description:
    Enable change tracking

Cons:
    Not a good auditing solution

Tiga solusi pertama akan bekerja untuk audit Anda. Saya menyukai solusi pertama karena saya menggunakannya secara ekstensif di lingkungan saya.

Hormat kami

John

Cuplikan Kode Dari Presentasi (Database Autos)

-- 
-- 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];

** Tampilan &Nuansa tabel audit **



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL Server, ubah instance bernama ke instance default?

  2. Bitmap Mode Batch di SQL Server

  3. Bagaimana cara mendapatkan data 7 hari terakhir dari datetime saat ini hingga 7 hari terakhir di sql server

  4. Kinerja fungsi COUNT SQL

  5. Bagaimana cara saya membuat serial grafik besar objek .NET menjadi SQL Server BLOB tanpa membuat buffer besar?