日期:2014-05-18  浏览次数:20446 次

历史记录的触发器求优化
刚接触存储过程,东拼西凑的写了这些,因为急着用于做个表的历史记录。现求助大家。
1、不知这些语句有没有什么问题。
2、会不会效率很慢,有没有办法提高效率?
3、有人说,这个当,Qty,price,deliverydate都更改时,会插入三条,应该无论如何,只插入一条比较节约空间与效率,但只插一条的话,那个更改字段怎么办?哪位大侠有好办法吗?
4、有没有好办法真正获得IP,用户名,电脑名,而不是有时候有,有时候没有。
谢谢帮助。
IF EXISTS (SELECT * FROM dbo.sysobjects 
  WHERE id = object_id(N'[TR_OdrBatRec]') 
  AND OBJECTPROPERTY(id, N'IsTrigger') = 1)
  DROP TRIGGER [TR_OdrBatRec]
GO

Create TRIGGER [TR_OdrBatRec] on [dbo].[Mkt_OdrBatch]
For Insert,Update
--此位置也可以写After Insert或before Insert等等
As

--Set nocount on
--上一句先不使用,以利于发现出错。
declare @dtForwardDeliveryDate DateTime
declare @dtModiDeliveryDate DateTime

declare @iForwardQty Int
declare @iModiQty int

declare @fForwardPrice float
declare @fModiPrice float

declare @sFieldName char(13)
Declare @sNetAddress nchar(12)
Declare @sNtUserName varchar(50)
declare @sSQLcmd varchar(255)

--要在此处赋值,否则有可能提示插入空值
--查找前后DeliveryDate
Select @dtForwardDeliveryDate=DeliveryDate From Deleted
Select @dtModiDeliveryDate=DeliveryDate From Inserted
--查找前后 Pcs的Qty
Select @iForwardQty=Qty From Deleted
Select @iModiQty=Qty From Inserted
--查找前后 Price
Select @fForwardPrice=Price From Deleted
Select @fModiPrice=Price From Inserted
--下面为获取当前用户最后一句SQL语句,因程序限制,只能获得255个字符。
if exists (Select * From sysobjects where id=Object_id(N'#tSQLCmd') and ObjectProperty(id, N'IsUserTable')=1)
  drop table #tSQLCmd
create table #ip(id int identity(1,1),re varchar(200) null)
Create Table #tSQLCmd(sEventType varchar(50),iParameters int,sEventInfo varchar(255))
insert #tSQLCmd Exec('DBCC InputBuffer (@@SPID)')
Select @sSQLCmd=sEventInfo From #tSQLCmd
--上面完成获得最后一句SQL语句的过程,有可能还需要改善。

--此处不使用if update(DeliveryDate),因为有时数值相同,但也做update操作。
--更新DeliveryDate的更改。
--比较时要使用Convert 以免明明是同一内容,因存储的原因而比较成数据有差异,因为此处只使用到日期:2000-01-01,所以只使用到Char(10)
if (Convert(char(10),@dtForwardDeliveryDate,20)<>Convert(char(10),@dtModiDeliveryDate,20))
Begin
Select @sFieldName='DeliveryDate'
Select @sNetAddress=Net_Address from master..sysprocesses where spid=@@SPID
Select @sNtUserName=Nt_UserName From master..sysprocesses where spid=@@SPID

  Insert into Mkt_OdrHisModi (BatchNo,ChangeNo,FieldName,ForwardContent,ModiContent,CreateBy,CreateDate,HostName,ProgName,NetAddress,sSQLCmd)
  Select BatchNo,ChangeNo,@sFieldName,@dtForwardDeliveryDate,@dtModiDeliveryDate,@sNTUserName,GetDate(),Host_Name(),App_Name(),@sNetAddress,@sSQLCmd From Inserted
End  
--更新pcs的Qty的更改。
else if (@iForwardQty<>@iModiQty)
Begin

Select @sFieldName='PcsQty'
Select @sNetAddress=Net_Address from master..sysprocesses where spid=@@SPID
Select @sNtUserName=Nt_UserName From master..sysprocesses where spid=@@SPID

  Insert into Mkt_OdrHisModi (BatchNo,ChangeNo,FieldName,ForwardContent,ModiContent,CreateBy,CreateDate,HostName,ProgName,NetAddress,sSQLCmd)
  Select BatchNo,ChangeNo,@sFieldName,@iForwardQty,@iModiQty,@sNTUserName,GetDate(),Host_Name(),App_Name(),@sNetAddress,@sSQLCmd From Inserted
End  
--更表Price的更改
--此处使用Convert来限制数字,以免出现,3.5000000<>3.499999的情况。
else if (Convert(Numeric(18,4),@fForwardPrice)<>Convert(Numeric(18,4),@fModiPrice))
Begin

Select @sFieldName='Price'
Select @sNetAddress=Net_Address from master..sysprocesses where spid=@@SPID
Select @sNtUserName=Nt_UserName From master..sysprocesses where spid=@@SPID

  Insert into Mkt_OdrHisModi (BatchNo,ChangeNo,FieldName,ForwardContent,ModiContent,CreateBy,CreateDate,HostName,ProgName,NetAddress,sSQLCmd)
  Select BatchNo,ChangeNo,@sFieldName,@fForwardPrice,@fModiPrice,@sNTUserName,