我有一个表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给我这个错误
更新或删除的行值不会使行唯一,也不会改变多行(2行)
答案 0 :(得分:7)
您已编码单行更新和删除。思考集!
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