Первый пост, так что сразу к делу. Заранее благодарю за ответы и внимание.
У меня есть полные права на механизм базы данных, на котором работает рассматриваемая БД, включая sysadmin.
Насколько мне известно, я правильно включил это в соответствии с документацией, выполнив следующие действия:
Выполнение команды
EXEC sys.sp_cdc_enable_db
через приложение С#, которое я использую в качестве интерфейса для настройки, записи и сравнения изменений базы данных DML.Из того же приложения, выполнив команду
EXEC sys.sp_cdc_enable_table @source_schema = N'dbo', @source_name = N'ORD_ATTACHMENTS', @role_name = NULL
Я проверил, что рассматриваемая БД готова для CDC, используя SELECT [name], database_id, is_cdc_enabled FROM sys.databases
.
Готовность стола я также проверял с помощью SELECT [name], is_tracked_by_cdc FROM sys.tables
.
Запуск SELECT * FROM [msdb].[dbo].[cdc_jobs] WHERE [database_id] = DB_ID()
в контексте базы данных дает следующую информацию для задания захвата:
maxtrans: 7200 maxscans: 10 непрерывный: 1 pollinginterval: 5
удержание и порог равны 0.
После вставки записей в рассматриваемую таблицу через SSMS связанная таблица CDC, хотя и присутствует, не содержит никаких данных. Ошибок не обнаружено, и запись успешно добавлена в исходную таблицу.
Дополнительная информация:
- Сервер базы данных, используемый для использования волокон Windows (облегченный пул). Я отключил это, перенастроил и перезагрузил сервер.
- Раньше для базы данных была установлена совместимость с SQL Server 2005 (90), но я обновил ее до SQL Server 2008 (100). Снова перезагрузил сервер.
- Я также установил для свойства отслеживания изменений значение true для рассматриваемой базы данных, но с тех пор я узнал, что это не имеет значения.
Исходная таблица имеет следующие поля:
[AttachmentID] [bigint] IDENTITY(1,1) NOT NULL,
[ORDNUM] [nvarchar](10) NOT NULL,
[FileName] [nvarchar](260) NOT NULL,
[FileContent] [varbinary](max) NULL,
[CreatedOn] [datetime] NOT NULL CONSTRAINT [DF_ORD_ATTACHMENTS_CreatedOn] DEFAULT (getdate())
Для этой таблицы из CDC не исключаются поля.
Заранее благодарим вас за любую помощь.
С уважением, Крис.
Обновление 20.09.2016, 15:15. Запустил следующее:
sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
sp_configure 'Agent XPs', 1;
GO
RECONFIGURE
GO
Теперь перешли на тестовую БД, чтобы упростить дело. Повторно включил CDC в моей новой тестовой таблице (поля — это поле идентификатора bigint PK и поле NVARCHAR (50), допускающее значение NULL). До сих пор не работает. Кроме того, задание захвата не имеет записей истории в агенте SQL Server.
Обновление 20.09.2016, 20:09 Запустил sp_MScdc_capture_job в контексте БД. Это может быть, в зависимости от настроек задания, непрерывно выполняемой процедурой. Данные были найдены в таблице CDC при запуске. Попытаюсь выяснить, как автоматически задействовать это.
Обновление 28.09.2016, 17:19 Сценарий задания захвата выглядит следующим образом:
USE [msdb]
GO
/****** Object: Job [cdc.CDCTest_capture] Script Date: 2016-09-28 5:18:13 PM ******/
BEGIN TRANSACTION
DECLARE @ReturnCode INT
SELECT @ReturnCode = 0
/****** Object: JobCategory [REPL-LogReader] Script Date: 2016-09-28 5:18:13 PM ******/
IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'REPL-LogReader' AND category_class=1)
BEGIN
EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'REPL-LogReader'
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
END
DECLARE @jobId BINARY(16)
EXEC @ReturnCode = msdb.dbo.sp_add_job @job_name=N'cdc.CDCTest_capture',
@enabled=1,
@notify_level_eventlog=2,
@notify_level_email=0,
@notify_level_netsend=0,
@notify_level_page=0,
@delete_level=0,
@description=N'CDC Log Scan Job',
@category_name=N'REPL-LogReader',
@owner_login_name=N'sa', @job_id = @jobId OUTPUT
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
/****** Object: Step [Starting Change Data Capture Collection Agent] Script Date: 2016-09-28 5:18:14 PM ******/
EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Starting Change Data Capture Collection Agent',
@step_id=1,
@cmdexec_success_code=0,
@on_success_action=3,
@on_success_step_id=0,
@on_fail_action=3,
@on_fail_step_id=0,
@retry_attempts=10,
@retry_interval=1,
@os_run_priority=0, @subsystem=N'TSQL',
@command=N'RAISERROR(22801, 10, -1)',
@server=N'AECON-SQL',
@database_name=N'CDCTest',
@flags=4
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
/****** Object: Step [Change Data Capture Collection Agent] Script Date: 2016-09-28 5:18:14 PM ******/
EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Change Data Capture Collection Agent',
@step_id=2,
@cmdexec_success_code=0,
@on_success_action=1,
@on_success_step_id=0,
@on_fail_action=2,
@on_fail_step_id=0,
@retry_attempts=10,
@retry_interval=1,
@os_run_priority=0, @subsystem=N'TSQL',
@command=N'sys.sp_MScdc_capture_job',
@server=N'AECON-SQL',
@database_name=N'CDCTest',
@flags=4
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXEC @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id=@jobId, @name=N'CDC capture agent schedule.',
@enabled=1,
@freq_type=64,
@freq_interval=0,
@freq_subday_type=0,
@freq_subday_interval=0,
@freq_relative_interval=0,
@freq_recurrence_factor=0,
@active_start_date=20160920,
@active_end_date=99991231,
@active_start_time=0,
@active_end_time=235959,
@schedule_uid=N'd1fc7d85-c051-4b24-af84-5505308caaf0'
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N'(local)'
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
COMMIT TRANSACTION
GOTO EndSave
QuitWithRollback:
IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION
EndSave:
GO