0

我有两张桌子EmployeeEmp_Audit.

在 table 上Employee,我有一个AFTER INSERT触发器,当我将行插入Employee. 触发器的作用是将Emp_Audit已经插入的行插入到表中Employee

当我为要插入的每条记录明确使用“插入值”时,触发器工作Employee正常

 INSERT INTO Employee_Test VALUES ('Anees',1000);
 INSERT INTO Employee_Test VALUES ('Rick',1200);
 INSERT INTO Employee_Test VALUES ('John',1100);
 INSERT INTO Employee_Test VALUES ('Stephen',1300);
 INSERT INTO Employee_Test VALUES ('Maria',1400);

触发器插入所有这些行 inti Emp_Audit-------------GOOD

但是当我使用值构造函数作为

insert into dbo.Employee_Test
values   ('Kritika', 25000),
         ('Ritu', 15000),
         ('Maduri', 7000),
         ('Dinkar', 7000);

只有第一行('Kritika', 25000)被插入Emp_Audit

整个查询如下:

CREATE TABLE Employee_Test
(
Emp_ID INT Identity,
Emp_name Varchar(100),
Emp_Sal Decimal (10,2)
)

CREATE TABLE Employee_Test_Audit
(
     Emp_ID int,
     Emp_name varchar(100), 
     Emp_Sal decimal (10,2), 
     Audit_Action varchar(100), 
     Audit_Timestamp datetime 
) 

-----------------------Trigger------------------------------------
CREATE TRIGGER trgInsertAfter ON [dbo].[Employee_Test]
FOR INSERT 
AS
   declare @empid int; 
   declare @empname varchar(100); 
   declare @empsal decimal(10,2); 
   declare @audit_action nvarchar(200); 

   select @empid = inserted.Emp_ID   
   FROM inserted;  
   select @empname = inserted.Emp_name 
   from inserted;  
   select @empsal = inserted.Emp_Sal  
   from inserted;  

   set @audit_action = 'Record Inserted after Insert Trigger Fired';  

   INSERT INTO Employee_Test_Audit 
   VALUES(@empid, @empname, @empsal, @audit_action, GETDATE());  
   GO

   print('Insert trigger FIRED') 

   insert into dbo.Employee_Test  
   values ('Kritika', 25000), 
          ('Ritu', 15000), 
          ('Maduri', 7000), 
          ('Dinkar', 7000); 
4

3 回答 3

3

是的,你想要的是:

CREATE TRIGGER trgInsertAfter ON [dbo].[Employee_Test]

FOR INSERT

AS

INSERT INTO Employee_Test_Audit (Emp_ID, Emp_name, Emp_Sal, Audit_Action, Audit_Timestamp)

SELECT Emp_ID,Emp_name,Emp_Sal,
    'Record Inserted after Insert Trigger Fired',GETDATE()
from inserted;

因为inserted可以包含行(或不包含行),所以您必须将其视为一个表。我从未见过任何不同的行为,但不能保证(在您的版本中)所有变量都会被分配来自同一行的值。

此外,您真的应该养成向INSERT.

于 2013-04-29T08:06:02.957 回答
1

试试这个——

CREATE TRIGGER dbo.trgInsertAfter 
    ON [dbo].[Employee_Test]
    FOR INSERT
AS BEGIN

    INSERT INTO dbo.Employee_Test_Audit(Emp_ID, Emp_name, Emp_Sal, ..., ...)
    SELECT 
          i.Emp_ID
        , i.Emp_name
        , i.Emp_Sal 
        , 'Record Inserted after Insert Trigger Fired'
        , GETDATE()
    FROM INSERTED i

END
于 2013-04-29T08:06:48.840 回答
0

仅插入一条记录的原因是当您使用 select 为变量赋值时,它不会提供任何错误并将值设置为列中的任意值。并且也使用该方法只插入一条记录。所以正确的触发代码应该是

CREATE TRIGGER trgInsertAfter ON [dbo].[Employee_Test]

FOR INSERT

AS

INSERT INTO Employee_Test_Audit

SELECT Emp_ID,Emp_name,Emp_Sal,
    'Record Inserted after Insert Trigger Fired',GETDATE()
from inserted;
于 2013-04-29T08:17:49.743 回答