在SQL Server中为表创建LOG

Sal*_*ian 1 t-sql logging sql-server-2008

我有一张桌子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
) 
Run Code Online (Sandbox Code Playgroud)

我编写了这段代码,但它不适用于删除和更新.

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)
Run Code Online (Sandbox Code Playgroud)

SQL Server给了我这个错误

更新或删除的行值不会使行唯一,也不会更改多行(2行)

gbn*_*gbn 8

您已编码单行更新和删除.想想套!

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
Run Code Online (Sandbox Code Playgroud)