Sql server 2008 为SQL Server中的表创建日志

Sql server 2008 为SQL Server中的表创建日志,sql-server-2008,tsql,logging,Sql Server 2008,Tsql,Logging,我有一个表Sample和另一个SampleLog 有了这些结构,我想将代码写入日志。您可以在表的结构之后看到我的代码 CREATE TABLE [dbo].[Sample]( [ID] [int] NULL, [Name] [varchar](10) NULL ) CREATE TABLE [dbo].[SampleLog]( [ID] [int] NULL, [Name] [varchar](10) NULL, [Date] [datetime] NULL,

我有一个表
Sample
和另一个
SampleLog

有了这些结构,我想将代码写入日志。您可以在表的结构之后看到我的代码

CREATE TABLE [dbo].[Sample](
   [ID] [int] NULL,
   [Name] [varchar](10) NULL
)

CREATE TABLE [dbo].[SampleLog](
   [ID] [int] NULL,
   [Name] [varchar](10) NULL,
   [Date] [datetime] NULL,
   [UserName] [varchar](100) NULL,
   [Type] [char](1) NULL
) 
我已经写了这段代码,但它不适用于删除和更新

CREATE TRIGGER SampleTrigger ON Sample 
AFTER INSERT, UPDATE, DELETE
AS
   DECLARE 
      @ID int ,
      @Name varchar(10),
      @Date datetime,
      @UserName VARCHAR(128) ,
      @Type CHAR(1) ,
      @sql nvarchar(500)

  SELECT         
      @UserName = SYSTEM_USER ,
      @Date = CONVERT(VARCHAR(8), GETDATE(), 112) 
              + ' ' + CONVERT(VARCHAR(12), GETDATE(), 114)

  IF EXISTS (SELECT * FROM inserted)
  BEGIN
     IF EXISTS (SELECT * FROM deleted)
     BEGIN
        SELECT @Type = 'U'
        select @ID = ID from deleted
        select @Name = Name from deleted
   END
   ELSE
   BEGIN
      SELECT @Type = 'I'
      select @ID = ID from inserted
      select @Name = Name from inserted
   END
 END
 ELSE
BEGIN
   SELECT @Type = 'D'
   select @ID = ID from deleted
   select @Name = Name from deleted
END

insert into SampleLog(ID, Name, Date, UserName, Type) 
values(@ID, @Name, @Date, @UserName, @Type)
SQL Server给了我这个错误

Updated或deleted的行值不会使行唯一,或者会改变多行(2行)


您已经为单行更新和删除编写了代码。思维定势

CREATE TRIGGER SampleTrigger ON Sample after INSERT, UPDATE, DELETE
AS
SET NOCOUNT ON;

insert into SampleLog
    (ID,Name,Date,UserName,Type)
SELECT
    D.ID, D.NAME, GETDATE(), SYSTEM_USER,
    CASE WHEN I.ID IS NULL THEN 'D' ELSE 'U' END
FROM
    DELETED D
    LEFT JOIN
    INSERTED I ON D.ID = I.ID
UNION ALL
SELECT
    I.ID, I.NAME, GETDATE(), SYSTEM_USER, 'I'
FROM
    INSERTED I
    LEFT JOIN
    DELETED D ON D.ID = I.ID
WHERE
    D.ID IS NULL
GO

请回顾一下你的接受率和投票率:尊重那些通过回答你的问题来帮助你的人……只是一个旁白——为什么所有的日期解析都要把它放在datetime列中呢?这是毫无意义的。另外,如果你接受一些答案,人们会更愿意帮助你。谢谢。完美的