Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

SQL सर्वर में चेंज डेटा कैप्चर (सीडीसी) टेबल्स से हिस्ट्री या ऑडिट व्यू कैसे बनाएं - SQL सर्वर ट्यूटोरियल

परिदृश्य:

आप SQL सर्वर DBA या डेवलपर के रूप में काम कर रहे हैं, आपने SQL सर्वर डेटाबेस में से किसी एक पर डेटा कैप्चर बदलें सक्षम किया है, CDC को सक्षम करने के बाद आप AUDIT या HIST दृश्य बनाना चाहते हैं ताकि परिवर्तित रिकॉर्ड प्राप्त कर सकें।

समाधान:

नीचे दी गई स्क्रिप्ट प्रत्येक तालिका के लिए दृश्य बनाएगी जिस पर आपके डेटाबेस में सीडीसी सक्षम है। स्क्रिप्ट चलाने से पहले मैंने ऑडिट स्कीमा का उपयोग किया है, आपको ऑडिट स्कीमा बनाने की आवश्यकता है या यदि आप हिस्ट स्कीमा में दृश्य बनाना चाहते हैं तो बदलें नीचे दिए गए कोड में स्कीमा ऑडिट से हिस्ट तक।
प्रत्येक दृश्य हमें कॉलम के नीचे लौटाएगा
  • कमिट_टाइम,
  • Colum_Name,
  • Old_Value,
  • नया_मान,
  • द्वारा संशोधित




IF OBJECT_ID(N'tempdb..##CDC_TableList') IS NOT NULL
BEGIN
    DROP TABLE ##CDC_TableList
END

SELECT T.name AS TableName,
       C.name AS ColumnName,
       'CASE WHEN (sys.Fn_cdc_is_bit_set (sys.Fn_cdc_get_column_ordinal (''dbo_'
       + T.name + ''',''' + C.name+
       + '''),__$update_mask) = 1) THEN Cast('
       + C.Name
       + ' AS SQL_VARIANT) ELSE NULL END AS '
       + C.name  AS CaseStm INTO ##CDC_TableList
 FROM   sys.tables T
       INNER JOIN sys.columns c
               ON T.OBJECT_ID = c.OBJECT_ID
में शामिल हों
WHERE  is_tracked_by_cdc = 1
       AND c.is_identity = 0
       AND C.name NOT IN ( 'CreatedBy', 'CreatedDate', 'ModifiedBy', 'ModifiedDate' )
       AND T.TYPE='U'
       AND T.is_ms_shipped<>1
      
      -- Select * from sys.tables

DECLARE @TableName NVARCHAR(200)
. से * चुनें
DECLARE cdc_cursor CURSOR FOR 
SELECT DISTINCT TableName FROM ##CDC_TableList
OPEN cdc_cursor 
FETCH NEXT FROM cdc_cursor INTO @TableName

WHILE @@FETCH_STATUS = 0 
में अगला प्राप्त करें
BEGIN

DECLARE @ColumnList  NVARCHAR(MAX)
DECLARE @CaseStmList NVARCHAR(MAX)
DECLARE @SQL_Stm  NVARCHAR(MAX)
DECLARE @SQL_Stm_DropView  NVARCHAR(MAX)
PRINT @TableName

 SELECT @ColumnList = STUFF(o.COLUMNNAME, 1, 1, '')
 FROM ##CDC_TableList t CROSS APPLY  (SELECT ',' + ColumnName+CHAR(10) AS [text()]
            FROM  ##CDC_TableList c
            WHERE    c.TableName = t.TableName
            FOR XML PATH('')) o (COLUMNNAME)
 WHERE t.TableName=@TableName
 PRINT @ColumnList
 
 SELECT @CaseStmList = STUFF(o.COLUMNNAME, 1, 1, '')
 FROM ##CDC_TableList t CROSS APPLY  (SELECT ',' + CaseStm+CHAR(10) AS [text()]
            FROM  ##CDC_TableList c
            WHERE    c.TableName = t.TableName
            FOR XML PATH('')) o (COLUMNNAME)
 WHERE t.TableName=@TableName
 --PRINT @CaseStmList


--If using Other Schema than AUDIT THEN change to that.
SET @SQL_Stm=' CREATE VIEW AUDIT.vw_'+@TableName+' AS

SELECT sys.Fn_cdc_map_lsn_to_time(up_b.__$start_lsn) AS Commit_Time, up_b.Column_Name, up_b.Old_Value, up_a.New_Value,up_a.ModifiedBy
FROM
    ( SELECT __$start_lsn, column_name, old_value,ModifiedBy
   FROM (SELECT __$start_lsn,'+@CaseStmList+',ModifiedBy FROM cdc.fn_cdc_get_all_changes_dbo_'+@TableName+'( sys.fn_cdc_get_min_lsn(''dbo_'+@TableName+'''), sys.fn_cdc_map_time_to_lsn(''largest less than or equal'',GETDATE()), N''all update old'')
 WHERE __$operation = 3
  ) AS BeforeUpdate
  UNPIVOT (old_value FOR column_name IN ('+@ColumnList+') ) AS unp) AS up_b INNER JOIN
  (SELECT __$start_lsn, column_name, new_value,ModifiedBy
   FROM (SELECT __$start_lsn,'+@CaseStmList+',ModifiedBy FROM cdc.fn_cdc_get_all_changes_dbo_'+@TableName+'(sys.fn_cdc_get_min_lsn(''dbo_'+@TableName+'''), sys.fn_cdc_map_time_to_lsn(''largest less than or equal'',GETDATE()), N''all'')
    WHERE __$operation = 4
   ) AS AfterUpdate
   UNPIVOT (new_value FOR column_name IN ('+@ColumnList+') ) AS unp ) AS up_a
ON up_b.__$start_lsn = up_a.__$start_lsn AND up_b.column_name = up_a.column_name'
--Drop View if already exists
SET @SQL_Stm_DropView= 'IF EXISTS (SELECT TABLE_NAME FROM INFORMATION_SCHEMA.VIEWS
         WHERE TABLE_NAME = ''vw_'+@TableName+''')
   DROP VIEW AUDIT.vw_'+@TableName
   PRINT @SQL_Stm_DropView

EXEC (@SQL_Stm_DropView)
EXEC ( @SQL_Stm)
FETCH NEXT FROM cdc_cursor INTO @TableName
END 

CLOSE cdc_cursor 
DEALLOCATE cdc_cursor

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. संग्रहीत कार्यविधि क्या है और संग्रहीत कार्यविधि क्यों ?

  2. मैं गिनती (*) कॉलम में उपनाम का उपयोग क्यों नहीं कर सकता और इसे एक खंड में संदर्भित कर सकता हूं?

  3. SSRS 2014 रिपोर्ट परिनियोजित समस्या

  4. 🆕 SQL सर्वर 2022 फर्स्ट लुक - शीर्ष 5 नई सुविधाएँ (बोनस 5 सुविधाएँ)

  5. SQL सर्वर पूर्ण-पाठ खोज (FTS) को बेहतर बनाने के लिए स्टॉपवर्ड और स्टॉपलिस्ट का उपयोग कैसे करें