Проблема запуска 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, который фиксирует действия на уровне таблицы. Это невозможно - посмотрите список возможных событий здесь:

События DDL (MSDN)

Похоже, что вместо этого вам стоит заняться аудитом, если вы хотите глобально фиксировать все вставки, обновления и удаления. Есть много статей и учебных пособий, которые могут помочь вам в этом.

Если вы не можете использовать аудит из-за ограничений редакции, вы можете создать триггер для каждой таблицы. Вы можете автоматизировать создание этих триггеров, например,

  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;
Другие вопросы по тегам