Проблема запуска SQL Server 2012 ALL SERVER
У меня проблема с настройкой триггера ALL SERVER. Я использую базу данных Adventureworks2012, чтобы попытаться заставить работать триггер аудита. В идеале я хотел бы, чтобы триггер записывал в базу данных, которую я сделаю, под названием aud2012, если кто-нибудь сделает обновление, вставку или удаление на уровне БД.
Я сделал простой триггер, который пишет в таблицу, когда я обновляю и т. Д. Моя проблема, когда я пытаюсь изменить его на ВСЕ сервер. Вот SQL. Если я изменяю цель на ALL SERVER, я получаю ошибку:
Сообщение 1098, уровень 15, состояние 1, процедура EmpTrig, строка 4
Указанный тип (типы) событий является / недопустим для указанного целевого объекта.
Код:
USE [AdventureWorks2012]
GO
/****** Object: Trigger [HumanResources].[EmpTrig]
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TRIGGER [HumanResources].[EmpTrig]
ON ALL SERVER
FOR UPDATE, DELETE, INSERT
AS
BEGIN
-- Insert statements for trigger here
update [HumanResources].[Employee] set JobTitle = 'UPDATE TRIGGER' where BusinessEntityID = 290
END
Ваша помощь ценится.
1 ответ
Вы пытаетесь создать триггер ALL SERVER, который фиксирует действия на уровне таблицы. Это невозможно - посмотрите список возможных событий здесь:
Похоже, что вместо этого вам стоит заняться аудитом, если вы хотите глобально фиксировать все вставки, обновления и удаления. Есть много статей и учебных пособий, которые могут помочь вам в этом.
Если вы не можете использовать аудит из-за ограничений редакции, вы можете создать триггер для каждой таблицы. Вы можете автоматизировать создание этих триггеров, например,
DECLARE @sql NVARCHAR(MAX) = N'';
SELECT @sql += N'
CREATE TRIGGER ' + QUOTENAME(s.name) + '.Audit_'
+ s.name + '_' + t.name
+ ' ON ' + QUOTENAME(s.name) + '.' + QUOTENAME(t.name)
+ ' FOR INSERT, UPDATE, DELETE
AS
BEGIN
INSERT dbo.AuditTable([table], [action], ... other auditing columns ...)
SELECT ''' + QUOTENAME(s.name) + '.' + QUOTENAME(t.name) + ''',
CASE WHEN EXISTS (SELECT 1 FROM inserted) THEN
CASE WHEN EXISTS (SELECT 1 FROM deleted) THEN ''update''
ELSE ''insert'' END
ELSE ''delete'' END, ... other auditing information ...;
END
GO'
FROM sys.tables AS t
INNER JOIN sys.schemas AS s
ON t.[schema_id] = s.[schema_id];
PRINT @sql;
-- EXEC sp_executesql @sql;