使用触发器记录表

时间:2016-12-27 21:18:41

标签: sql sql-server

我需要创建插入dbo.Log表值的触发器: - in action_type:更新,删除或插入的记录数 - 在datetime_of_action ofcourse时间戳行动

现在我有了这个:

DROP TABLE dbo.Log

CREATE TABLE dbo.Log (
logid       INT         NOT NULL IDENTITY,
action_type NVARCHAR(50)    NOT NULL,
datetime_of_action  DATETIME        NOT NULL,
CONSTRAINT PK_Log PRIMARY KEY(logid));

CREATE TRIGGER trig2
ON Sales.Customers 
FOR UPDATE , DELETE, INSERT
AS
BEGIN
......................
END

SELECT * FROM dbo.Log

这是Sales.Customers表的脚本:

CREATE TABLE [Sales].[Customers](
    [custid] [int] IDENTITY(1,1) NOT NULL,
    [companyname] [nvarchar](40) NOT NULL,
    [contactname] [nvarchar](30) NOT NULL,
    [contacttitle] [nvarchar](30) NOT NULL,
    [address] [nvarchar](60) NOT NULL,
    [city] [nvarchar](15) NOT NULL,
    [region] [nvarchar](15) NULL,
    [postalcode] [nvarchar](10) NULL,
    [country] [nvarchar](15) NOT NULL,
    [phone] [nvarchar](24) NOT NULL,
    [fax] [nvarchar](24) NULL,
 CONSTRAINT [PK_Customers] PRIMARY KEY CLUSTERED 
(
    [custid] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

如果有人知道我怎么做你的意见。

2 个答案:

答案 0 :(得分:0)

使用此查询:

CREATE TRIGGER trig2
    ON Sales.Customers 
    AFTER UPDATE , DELETE, INSERT
    AS
    BEGIN

    IF EXISTS (select * From inserted)
      BEGIN
       IF EXISTS (select * From deleted)
         BEGIN
            INSERT INTO dbo.Log (action_typ, datetime_of_action )
            VALUES(CAST(SELECT COUNT(*) FROM deleted) as VARCHAR(50) + ' records have been updated',GETDATE())
         END
       ELSE 
         BEGIN
            INSERT INTO dbo.Log (action_typ, TOTAL, datetime_of_action )
            VALUES(CAST(SELECT COUNT(*) FROM inserted) as VARCHAR(50) + ' records have been iniserted',GETDATE())
         END
    ELSE
      BEGIN
        INSERT INTO dbo.Log (action_typ, TOTAL, datetime_of_action )
        VALUES(CAST(SELECT COUNT(*) FROM deleted) as VARCHAR(50) + ' records have been deleted',GETDATE())
    END
    END

答案 1 :(得分:0)

CREATE TRIGGER trig2
ON Sales.Customers 
FOR UPDATE , DELETE, INSERT
AS
BEGIN
    SET NOCOUNT ON; 

-- First determine the action 
DECLARE @Action NVARCHAR(50);
SET @Action = (CASE WHEN EXISTS(SELECT * FROM INSERTED) AND EXISTS(SELECT * FROM DELETED)
                    THEN N'Update: ' + CAST( (SELECT COUNT(*) FROM INSERTED) AS NVARCHAR(10)) 
                    WHEN EXISTS(SELECT * FROM INSERTED) AND NOT EXISTS(SELECT * FROM DELETED)
                    THEN N'Insert: ' + CAST( (SELECT COUNT(*) FROM INSERTED) AS NVARCHAR(10))
                    WHEN EXISTS(SELECT * FROM DELETED) AND NOT EXISTS(SELECT * FROM INSERTED)
                    THEN N'Delete: '  + CAST( (SELECT COUNT(*) FROM DELETED) AS NVARCHAR(10))
                    ELSE NULL -- Skip. It may have been a "failed delete".   
                END)

    INSERT INTO dbo.[Log] (action_type, datetime_of_action)
    VALUES (@Action , GETDATE());

END