SQL 2005触发器的问题。请高手帮忙!很急!

wytianyi2012 2012-06-08 02:16:20
有个ERP系统,操作数据库的表,在往表插入数据的时候,做了个触发器,往另外一张表写数据。

触发器是这样写的:
ALTER TRIGGER [ST].TRIG_TABLE1_LOG_INSERT
ON [ST].TABLE1_TMP
AFTER INSERT
AS
BEGIN
declare @HOSTNAME varchar(50)
declare @NETADDRESS varchar(50)
declare @LOGINNAME varchar(50)
declare @LOGINTIME varchar(32)
declare @spid varchar(32)

SET NOCOUNT ON;
set @spid = (select @@spid)
set @HOSTNAME = (select distinct hostname from master..sysprocesses where spid = @spid)
set @NETADDRESS = (select distinct net_address from master..sysprocesses where spid = @spid)
set @LOGINNAME = (select distinct loginame from master..sysprocesses where spid = @spid)
set @LOGINTIME = (select distinct login_time from master..sysprocesses where spid = @spid)

insert into TAB_LOG
(
HOST_NAME,
NET_ADDRESS,
LOGIN_NAME,
LOGIN_TIME,
TABLE_NAME,
OPERATE_TPYE
)
VALUES (
@HOSTNAME,
@NETADDRESS,
@LOGINNAME,
@LOGINTIME,
'[ST].TABLE1_TMP,
'INSERT'
)

END
GO

现在在ERP系统中往TABLE1_TMP插入数据的时候(批量导入多行数据),插入不进去。总是回滚。
下面是trace里面的信息
SQL:BatchStarting rollback tran
ST 2736 61 2012-06-08 14:01:18.160
SQL:BatchCompleted rollback tran
ST 0 0 0 0 2736 61 2012-06-08 14:01:18.160 2012-06-08 14:01:18.160
...全文
161 点赞 收藏 9
写回复
9 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
[Quote=引用 8 楼 的回复:]

谢谢各位大侠。是我的原因,触发器插入的那个表不在同一个用户下,可能是权限问题。现在已经可以插入数据了。再次感谢!
[/Quote]
额,亲,记得结贴

回复
wytianyi2012 2012-06-08
谢谢各位大侠。是我的原因,触发器插入的那个表不在同一个用户下,可能是权限问题。现在已经可以插入数据了。再次感谢!
回复
孤独加百列 2012-06-08
ERP程序批量导入的时候是不是有什么事务控制的语句,看看逻辑是不是有什么问题,你的触发器我试过了没什么问题,在SQL Server端批量导入也没什么问题。但是导入的数据量大的时候触发器很占资源可能会导致超时从而回滚事务的。
回复
额,那这个我也不知道。貌似跟数据库没关系了
回复
wytianyi2012 2012-06-08
是这样,我直接在sql2005的编辑器里面执行insert语句就能促动触发器把数据插入到TAB_LOG表中,但是从ERP系统里面执行就不可以了。
回复
[Quote=引用 3 楼 的回复:]

我试了,还是不行。我是往TABLE1_TMP插入数据的时候就没反应了,好像挂起了。这个是不是跟事物有关啊?
[/Quote]

这个是跟你那个进程号有关吧?你把那个去掉试试。直接插入,不要where条件
回复
wytianyi2012 2012-06-08
我试了,还是不行。我是往TABLE1_TMP插入数据的时候就没反应了,好像挂起了。这个是不是跟事物有关啊?
回复

ALTER TRIGGER [ST].TRIG_TABLE1_LOG_INSERT
ON [ST].TABLE1_TMP
AFTER INSERT
AS
BEGIN
declare @spid varchar(32)
set @spid = (select @@spid)
SET NOCOUNT ON;
insert into TAB_LOG
(
HOST_NAME,
NET_ADDRESS,
LOGIN_NAME,
LOGIN_TIME,
TABLE_NAME,
OPERATE_TPYE
)
SELECT NET_ADDRESS,LOGIN_NAME,LOGIN_TIME,TABLE_NAME,OPERATE_TPYE,'[ST].TABLE1_TMP,INSERT'
FROM master..sysprocesses where spid = @spid

END
出了点小意外
回复

--批量处理不能你这样
ALTER TRIGGER [ST].TRIG_TABLE1_LOG_INSERT
ON [ST].TABLE1_TMP
AFTER INSERT
AS
BEGIN
declare @spid varchar(32)
set @spid = (select @@spid)
SET NOCOUNT ON;
insert into TAB_LOG
(
HOST_NAME,
NET_ADDRESS,
LOGIN_NAME,
LOGIN_TIME,
TABLE_NAME,
OPERATE_TPYE
)
SELECT NET_ADDRESS,LOGIN_NAME,LOGIN_TIME,TABLE_NAME,OPERATE_TPYE,'[ST].TABLE1_TMP,'INSERT'
FROM master..sysprocesses where spid = @spid

END
GO
回复
相关推荐
发帖
疑难问题
创建于2007-09-28

2.1w+

社区成员

MS-SQL Server 疑难问题
申请成为版主
帖子事件
创建了帖子
2012-06-08 02:16
社区公告
暂无公告