插入触发器问题

时间:2011-05-29 21:57:46

标签: sql sql-server tsql triggers auditing

我使用简单的触发器ins_process来捕获表process上的插入/更新。此ins_process将数据插入表process_audit

process最初按以下顺序插入以下数据:

id    name    description
---   ----    -----------
1     proc1   sql
2     proc2   scripting
3     proc3   java

这将在process_audit中创建数据,如下所示:

id    name    description    insert_dt
---   ----    -----------    ---------
3     proc3   java           [a minute ago]
2     proc2   scripting      [a minute ago]
1     proc1   sql            [a minute ago]

为什么记录会以相反的顺序插入?当我从前端编辑一行时,process_audit中的数据如下:

id    name    description    insert_dt
---   ----    -----------    ---------
3     proc3   java           [a minute ago]
2     proc2   scripting      [a minute ago]
1     proc1   sql            [a minute ago]
2     proc2   scripting      [now]

这对我来说不是一个问题。我想知道这是否是标准行为,或者我创建触发器的方式是否有问题。

以下是我创建触发器的方法:

create trigger [dbo].[ins_process]  
on [dbo].[process] for insert, update    
as
set nocount on    
begin    
insert into process_audit
    (id, name, description, insertdate)    
select 
    id, name, description,current_timestamp
from inserted ins    
end  

此外,表id中的process_audit列不是标识列。

1 个答案:

答案 0 :(得分:1)

你怎么知道SQL在表中插入行的顺序是什么?

我假设您查询select * from process_audit并期望按插入顺序查看行。这不是一个有效的期望。

如果未指定order by,SQL Server不保证任何订单。 此外,SQL Server不维护行插入的顺序。

可能返回的结果将按聚集索引顺序排序,但仍无法保证。

如果您使用默认约束添加自己的标识Id列或CreatedDateTime列,这将是插入顺序的更好指示。