2016-12-27 3 views
0

Ich brauche Auslöser zu schaffen, die in dbo.Log Tabellenwerte einfügen: - in action_type: wie viele Datensätze aktualisiert, gelöscht oder EINZUFÜGEN - in datetime_of_action ofcourse Zeitstempel der AktionLog-Tabelle mit Trigger

Vorerst I haben dies:

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 

Und das ist ein Skript von Sales.Customers Tabelle:

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 

Wenn jemand weiß, wie zu tun das bin ich offen auf deinen Rat.

+0

Was haben Sie recherchiert, ausprobiert und fand nicht erfüllen, was Sie zu tun versuchen? – dfundako

Antwort

0

Verwenden Sie diese Abfrage:

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

Nehmen Sie Änderungen an Ihrem echten Fall vor. – LONG

+0

Das Problem der Erfassung, wie viele Datensätze betroffen sind, wird nicht gelöst. – dfundako

+0

@dfundako, überprüfen Sie bitte die 'log' Tabelle Schema vor dem Kommentar geben – LONG

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