2013-12-09 129 views
0

我在设置ALL SERVER触发器时遇到问题。 我正在使用Adventureworks2012数据库来尝试获取审计触发器的工作。 我想理想情况下触发器写入数据库,如果有人在数据库级别进行更新,插入或删除操作,我会将其称为audit2012。SQL Server 2012 ALL SERVER触发器问题

我做了一个简单的触发器,写入表中,当我更新等。我的问题是,当我尝试将其更改为所有服务器。这是SQL。如果我改变了目标,所有的服务器我得到的错误:

Msg 1098, Level 15, State 1, Procedure EmpTrig, Line 4
The specified event type(s) is/are not valid on the specified target object.

代码:

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 

您的帮助表示赞赏。

回答

4

您正试图创建捕获表级操作的ALL SERVER触发器。这是不可能的 - 看到这里有可能的事件列表:

DDL Events (MSDN)

这听起来像你应该寻找到auditing相反,如果你想在全球范围内捕获所有插入,更新和删除。有大量的文章和教程可以帮助你做到这一点。

如果由于版本限制无法使用审核,那么您可以在每个表上创建一个触发器。您可以自动创建这些触发器,例如

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; 
+0

我正在使用sql server 2012 express,并且被限制使用它。是否有可能没有审计。我已经研究过审计,但不可能对express进行审计,而且我也试图使用profiler,但非付费的对我来说并不是很有用。我还有什么可以捕获DDL事件吗? –

+1

我会在你想要审计的每张表上创建一个触发器。无法在服务器级别捕获DML事件(插入,更新和删除不是DDL事件)。 –