Я установил агент Elasti c из Azure. Агент elasti c использует базу данных для обслуживания и работы своего logi c в Azure. Список таблицы, которую он создает, длинный. Но это таблицы, над которыми я работаю.
- jobs_internal.job_exectutions (содержит каждый запуск elasti c job)
- dbo.custom_status (таблица, созданная для отслеживания активности выполнения)
Таблица, в которую операции DML будут вставлены в схему dbo.custom_status
CREATE TABLE [dbo].[custom_status](
[Id] [int] IDENTITY(1,1) NOT NULL,
[job_id] [uniqueidentifier] NOT NULL,
[job_name] [nvarchar](128) NULL,
[job_execution_id] [uniqueidentifier] NOT NULL,
[start_time] [datetime] NULL,
[end_time] [datetime] NULL,
[lifecycle] [nvarchar](50) NULL,
[message] [nvarchar](max) NULL,
[exception] [nvarchar](max) NULL,
[column_state] [nvarchar](20) NOT NULL,
[entry_time] [datetime] NULL,
CONSTRAINT [PK_dbo.custom_status] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
ALTER TABLE [dbo].[custom_status] ADD DEFAULT (getdate()) FOR [entry_time]
GO
Когда я ввожу триггер для jobs_internal.job_executions при AFTER UPDATE, INSERT, DELETE
CREATE TRIGGER [jobs_internal].[TR_status_message]
ON [jobs_internal].[job_executions]
AFTER INSERT, UPDATE, DELETE
AS
BEGIN TRY
DECLARE @activity NVARCHAR(20);
IF EXISTS (SELECT * FROM INSERTED) AND EXISTS (SELECT * FROM DELETED)
BEGIN
SET @activity = 'UPDATE';
INSERT INTO [dbo].[custom_status]
([job_id]
,[job_name]
,[job_execution_id]
,[start_time]
,[end_time]
,[lifecycle]
,[message]
,[exception]
,[column_state])
SELECT
org_job_exe.[job_id]
,(SELECT name
FROM jobs_internal.jobs
WHERE job_id = org_job_exe.job_id)
,org_job_exe.[job_execution_id]
,org_job_exe.[start_time]
,org_job_exe.[end_time]
,org_job_exe.[lifecycle]
,(SELECT message
FROM jobs_internal.job_task_executions
WHERE job_execution_id = org_job_exe.job_execution_id)
,(SELECT exception
FROM jobs_internal.job_task_executions
WHERE job_execution_id = org_job_exe.job_execution_id)
,@activity
FROM INSERTED as org_job_exe;
PRINT 'UPDATE operation failed in custom message trigger';
END;
IF EXISTS (SELECT * FROM deleted) AND NOT EXISTS (SELECT * FROM inserted)
BEGIN
SET @activity = 'DELETE';
INSERT INTO [dbo].[custom_status]
([job_id]
,[job_name]
,[job_execution_id]
,[start_time]
,[end_time]
,[lifecycle]
,[message]
,[exception]
,[column_state])
SELECT
org_job_exe.[job_id]
,(SELECT name
FROM jobs_internal.jobs
WHERE job_id = org_job_exe.job_id)
,org_job_exe.[job_execution_id]
,org_job_exe.[start_time]
,org_job_exe.[end_time]
,org_job_exe.[lifecycle]
,(SELECT message
FROM jobs_internal.job_task_executions
WHERE job_execution_id = org_job_exe.job_execution_id)
,(SELECT exception
FROM jobs_internal.job_task_executions
WHERE job_execution_id = org_job_exe.job_execution_id)
,@activity
FROM DELETED as org_job_exe;
PRINT 'DELETE operation failed in custom message trigger';
END;
BEGIN
SET @activity = 'INSERT';
INSERT INTO [dbo].[custom_status]
([job_id]
,[job_name]
,[job_execution_id]
,[start_time]
,[end_time]
,[lifecycle]
,[message]
,[exception]
,[column_state])
SELECT
org_job_exe.[job_id],
'test'
--,(SELECT name
--FROM jobs_internal.jobs
--WHERE job_id = org_job_exe.job_id)
,org_job_exe.[job_execution_id]
,org_job_exe.[start_time]
,org_job_exe.[end_time]
,org_job_exe.[lifecycle]
,'test'
--,(SELECT message
--FROM jobs_internal.job_task_executions
--WHERE job_execution_id = org_job_exe.job_execution_id)
,'test'
,@activity
FROM INSERTED as org_job_exe;
PRINT 'INSERT operation failed in custom message trigger';
END;
END TRY
BEGIN CATCH
PRINT 'Custom message trigger failed';
THROW;
END CATCH;
Триггер срабатывает, но останавливает все другие операции CRUD / операции DML в базовой таблице останавливают, в результате чего задания elasti c не работают и накапливаются в очереди.
Уже есть триггер, созданный сервером ElasticJob для этой таблицы и не останавливающий операции DML для таблицы
Следовательно, я попробовал это в представлении
jobs.job_executions с DML INSTEAD OF
ALTER TRIGGER [jobs].[TR_job_alert]
ON [jobs].[job_executions]
INSTEAD OF UPDATE
AS
BEGIN
--just to test normal is being triggered
insert custom_status
values (NEWID(),
'testing',
NEWID(),
null,
null,
'test',
null,
null,
'test',
GETDATE());
--INSERT INTO [dbo].[custom_status]
-- ([job_id]
-- ,[job_name]
-- ,[job_execution_id]
-- ,[start_time]
-- ,[end_time]
-- ,[lifecycle]
-- ,[message]
-- ,[exception]
-- ,[column_state])
--SELECT
-- org_job_exe.[job_id]
-- ,org_job_exe.[job_name]
-- ,org_job_exe.[job_execution_id]
-- ,org_job_exe.[start_time]
-- ,org_job_exe.[end_time]
-- ,org_job_exe.[lifecycle]
-- ,org_job_exe.[last_message]
-- ,null
-- ,@activity
--FROM inserted as org_job_exe
--BEGIN
-- SET @activity = 'INSERT';
-- INSERT INTO [dbo].[custom_status]
-- ([job_id]
-- ,[job_name]
-- ,[job_execution_id]
-- ,[start_time]
-- ,[end_time]
-- ,[lifecycle]
-- ,[message]
-- ,[exception]
-- ,[column_state])
-- SELECT
-- org_job_exe.[job_id]
-- ,(SELECT name
-- FROM jobs_internal.jobs
-- WHERE job_id = org_job_exe.job_id)
-- ,org_job_exe.[job_execution_id]
-- ,org_job_exe.[start_time]
-- ,org_job_exe.[end_time]
-- ,org_job_exe.[lifecycle]
-- ,(SELECT message
-- FROM jobs_internal.job_task_executions
-- WHERE job_execution_id = org_job_exe.job_execution_id)
-- ,(SELECT exception
-- FROM jobs_internal.job_task_executions
-- WHERE job_execution_id = org_job_exe.job_execution_id)
-- ,@activity
-- FROM inserted as org_job_exe
--END;
END;
GO
Триггер в представлении никогда не срабатывает! Я знаю, что некоторые массовые операции DML не запускают триггеры.
Что-то не так с моим триггером?
- Быстрый триггер, если он сработает, заблокирует все остальные операции на столе
- Второй триггер никогда не срабатывает при просмотре.