2012-03-26 4 views
0

У меня есть таблица Sample и другого SampleLogСоздание LOG для таблиц в SQL Server

С этими структурами я хочу написать коды для входа. Вы можете видеть мои коды после структур таблиц

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 дает мне эту ошибку

Значения строк updateed или удален, либо не делать строку уникальный или они изменяют несколько строк (2 строки)

+0

Пожалуйста, просмотрите приемочные и голосования ставки: уважать тех, кто поможет вам, отвечая на ваши вопросы ... – gbn

+4

Просто в сторону - почему все эти даты разборе, чтобы поместить его в столбец даты и времени в любом случае? Это бессмысленно. Кроме того, люди с большей вероятностью помогут вам принять некоторые ответы. – Bridge

ответ

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

@Syahpoush: это правильно. Обновление WIll – gbn

Смежные вопросы