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

Cách bật tính năng ghi dữ liệu thay đổi (CDC) trên toàn bộ bảng HOẶC bật CDC trên bảng có danh sách cột trong SQL Server

Tình huống:

Đôi khi chúng tôi có yêu cầu Bật CDC trên Bảng bao gồm tất cả các cột HOẶC bật CDC trên bảng với tập hợp các cột. SP có thể thực hiện cả hai tác vụ tùy thuộc vào các tham số được cung cấp. Thủ tục được lưu trữ này sẽ được sử dụng khi CDC chưa được kích hoạt trên Table. Nếu Change Data Capture (CDC) đã được bật trên Table, thì Thủ tục đã lưu trữ sẽ không thực hiện bất kỳ hành động nào.

Giải pháp:

Thủ tục được lưu trữ bên dưới có thể được sử dụng để bật CDC trên tất cả các cột của bảng hoặc bất kỳ cột nào đã chọn.
 
 
 
USE [DatabaseName]
GO
/*-----------------------------------------------------------------------------------------------------
How to Execute: EXEC usp_EnableCdcOnTableWithOrWithoutColumnList @pSchemaName,@pTableName,@pColumnList

Enable CDC on Table with All columns
Example :usp_EnableCdcOnTableWithOrWithoutColumnList 'SchemaName','TableName',NULL

Enable CDC on Table with Given columns
Example :usp_EnableCdcOnTableWithOrWithoutColumnList 'SchemaName','TableName','Col1,Col2'
---------------------------------------------------------------------------------------------------------*/

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[Usp_enablecdcontablewithorwithoutcolumnlist] 
@pSchemaName VARCHAR(50),--> Provide the Schema Name where table exists
@pTableName  VARCHAR(100),--> TableName to ENABLE CDC ON.
@pColumnList VARCHAR(1000)--> ColumnList eg.'col1,col2'
AS
  BEGIN
      --DECLARE LOCAL VARIABLES

      DECLARE @vSQLStatment NVARCHAR(MAX)
      DECLARE @vSQLEnableCDC NVARCHAR(MAX)
      DECLARE @vXML XML;
      DECLARE @vCDCEnableInd INT
      DECLARE @vColumnCount INT

      -- IF CDC ALREADY ENABLED

      SET @vCDCEnableInd=(SELECT is_tracked_by_cdc
                          FROM   sys.tables
                          WHERE  name = @pTableName)

      -- CHECK IF CORRECT TABLE NAME IS PROVIDED

      IF NOT EXISTS (SELECT 1
                     FROM   INFORMATION_SCHEMA.COLUMNS
                     WHERE  TABLE_NAME = @pTableName)
        BEGIN
            PRINT ' The given table does not exists in Database::'
                  + @pTableName
        END
      -- ENABLE CDC WITH ALL THE COLUMNS IF NO COLUMNS PROVIDED

      ELSE
        BEGIN
            IF @pColumnList IS NULL
               AND @vCDCEnableInd = 1
              BEGIN
                  PRINT 'CDC is alrady enabled on ::' + @pTableName
                      
              END

            IF @pColumnList IS NULL
               AND @vCDCEnableInd = 0
              BEGIN
                  SELECT @vSQLStatment = 'EXEC sys.sp_cdc_enable_table
      @source_schema = ''' + @pSchemaName
                                         + ''',
      @source_name   = ''' + @pTableName
                                         + ''',
      @role_name     = null;'

                  EXEC sp_executesql
                    @vSQLStatment

                  PRINT ' CDC Enabled on ::' + @pTableName
                        + ' for all the columns'
              END

            -- IF COLUMN LIST IS PROVIDED FOR CDC

            IF ( LEN(@pColumnList) > 0 )
              BEGIN
                  SET @vXML=CAST('' + REPLACE(@pColumnList, ',', '')
                                 + '
' AS XML);
                  -- CHECK IF Incorrect COLUMN NAME IS PROVIDEDED

                  SELECT @vColumnCount = COUNT(*)
                  FROM   @vXML.nodes('/a') AS R(nref)
                  WHERE  NOT EXISTS (SELECT 1
                                     FROM   INFORMATION_SCHEMA.COLUMNS I
                                     WHERE  I.TABLE_NAME = @pTableName
                                     AND I.COLUMN_NAME = nref.value('.', 'nvarchar(50)'))

                  IF ( @vColumnCount <> 0 )
                   PRINT ' The List of Columns provided do not exit in Source Table.Check the ColumnList'
                  -- IF All columns Exists in Source Table, Enable CDC

                  IF ( @vColumnCount = 0
                       AND @vCDCEnableInd = 1 )
                    BEGIN
                        PRINT ' The CDC is already Enabled for this table.'
                    END

                  IF ( @vColumnCount = 0
                       AND @vCDCEnableInd = 0 )
                    BEGIN
                        --Enable CDC

                        SET @vSQLEnableCDC='EXEC sys.sp_cdc_enable_table
         @source_schema=''' + @pSchemaName
                                           + ''',@source_name=''' + @pTableName
                                           + ''', @role_name=NULL, @captured_column_list= '''
                                           + @pColumnList + ''''

                        EXEC (@vSQLEnableCDC)

                        PRINT ' CDC Enabled on ::' + @pTableName + ' for '
                              + @pColumnList + ' Columns.'
                    END
              END
        END
  END

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. 7645 Vị ngữ toàn văn bản rỗng hoặc trống

  2. Làm thế nào để thực thi một gói SSIS từ .NET?

  3. Tạo bảng (cấu trúc) từ bảng hiện có

  4. Hội thảo trên web:Theo dõi tiến trình truy vấn trong SQL Server

  5. Xác thực email TSQL (không có regex)