[导入]Trigger and datatype of 'sysname'

When Create a table or in other operation of sql,could use sysname datatype and default value could be suser_sname()For Example:
CREATE TABLE auditEmployeeData (
   audit_log_id uniqueidentifier DEFAULT NEWID(),
   audit_log_type char (3) NOT NULL,
   audit_emp_id int NOT NULL,
   audit_emp_bankAccountNumber char (10) NULL,
   audit_emp_salary int NULL,
   audit_emp_SSN char (11) NULL,
   audit_user sysname DEFAULT SUSER_SNAME(),
   audit_changed datetime DEFAULT GETDATE()
   )
GO
===============================================
现象:当更新一个表后,需要将更新的这条纪录信息保存下来.故采用了一个触发器,但在后面的执行过程中,触发器捕捉到的信息不全,本来要捕捉到四个字段的信息,现在只捕捉到三个字段.
分析: 按理论是应该能捕捉到的,如果能捕捉到三个字段信息,说明此触发器已正常工作.应该是被捕捉对象的信息过时早丢失.后查是程序中在执行对该表中的该条记录进行更新后,马上删除了该条记录,造成对该纪录的其余信息捕捉不全.

解决: 增加更新与删除该条记录的时间差,让触发器在对该记录进行更新后有更多的时间去捕捉该条记录的相关信息.

-- 创建用于监视对TestResult表进行更新数据的触发器
if   exists  ( select   *   from  dbo.sysobjects  where  id  =   object_id (N ' [dbo].[TestResult_Update] ' and   OBJECTPROPERTY (id, N ' IsTrigger ' =   1 )
drop   trigger   [ dbo ] . [ TestResult_Update ]
go
if   exists  ( select   *   from  dbo.sysobjects  where  id  =   object_id (N ' [dbo].[TestResult_ServerUpdate] ' and   OBJECTPROPERTY (id, N ' IsTrigger ' =   1 )
drop   trigger   [ dbo ] . [ TestResult_ServerUpdate ]

GO
CREATE   TRIGGER  TestResult_ServerUpdate  ON  TestResult AFTER   UPDATE
AS
-- IF UPDATE (CPH)
BEGIN
DECLARE   @UniqID   uniqueidentifier ,
@id   bigint ,
@StationCode   nvarchar ( 50 ),
@TestLineCode     nvarchar ( 50 )       -- 检测线代码
DECLARE  c3  CURSOR   FOR
   
-- SELECT TestResult.AutoRTID,TestResult.ResultUniqID,TestResult.TestLineCode,TestResult.StationNo 
    -- FROM   TestResult, deleted
    -- WHERE  TestResult.AutoRTID = deleted.AutoRTID  and TestResult.StationNo= deleted.StationNo and TestResult.ResultUniqID=deleted.ResultUniqID and TestResult.TestLineCode=deleted.TestLineCode
   SELECT  AutoRTID,ResultUniqID,TestLineCode,StationNo   FROM  DELETED
OPEN  c3
FETCH   NEXT   FROM  c3  INTO   @id , @UniqID , @TestLineCode , @StationCode
WHILE   @@fetch_status   =   0
BEGIN
  
INSERT   INTO  Server_UpdateRecordTable (TableName,NumOfUniqRecord,NumOfRecordID,NumOfCheckStation,NumOfCheckGroup)  VALUES ( ' TestResult ' , @UniqID , @id , @StationCode , @TestLineCode )
  
FETCH   NEXT   FROM  c3  INTO   @id , @UniqID , @TestLineCode , @StationCode
END
CLOSE  c3
DEALLOCATE  c3
END
GO


-- 测试
--
select * from testresult
--
select * from server_updaterecordtable

-- update testresult set autortid=99999 where autortid=99999
--
delete from testresult where autortid=99999
--
go
--
drop trigger savedel
--
go
--
CREATE TRIGGER savedel
--
   ON testresult
--
FOR DELETE
--
AS
--
   INSERT INTO Server_UpdateRecordTable (NumOfUniqRecord,NumOfRecordID,NumOfCheckStation)
--
   SELECT resultuniqid,autortid,stationcode FROM deleted
--
go


- 创建监视插入Server_InsertRecordTable表中数据的触发器
--
用于更新Server_UpdateRecordTable 的纪录唯一编号,好用于后面的更新操作
if   exists  ( select   *   from  dbo.sysobjects  where  id  =   object_id (N ' [dbo].[InsertRecordTable_ServerInsert] ' and   OBJECTPROPERTY (id, N ' IsTrigger ' =   1 )
drop   trigger   [ dbo ] . [ InsertRecordTable_ServerInsert ]
go
CREATE   TRIGGER  InsertRecordTable_ServerInsert  ON  Server_InsertRecordTable
FOR   INSERT
AS
DECLARE  
@UniqID   uniqueidentifier -- 在服务器上插入纪录后的生成的惟一的纪录编号 
@id   bigint ,                        -- 在检测站的数据库中的纪录编号
@StationCode      nvarchar ( 50 ),      -- 检测站代码 
@TestLineCode     nvarchar ( 50 )       -- 检测线代码
DECLARE  c2  CURSOR   FOR
   
SELECT  Server_InsertRecordTable.NumOfUniqRecord,inserted.NumOfRecordID,inserted.NumOfCheckStation,inserted.NumOfCheckGroup
   
FROM    Server_InsertRecordTable, inserted
   
WHERE   Server_InsertRecordTable.NumOfUniqRecord  =  inserted.NumOfUniqRecord  and  Server_InsertRecordTable.NumOfRecordID =  inserted.NumOfRecordID  and  Server_InsertRecordTable.NumOfCheckStation = inserted.NumOfCheckStation  and  Server_InsertRecordTable.NumOfCheckGroup = inserted.NumOfCheckGroup
OPEN  c2
FETCH   NEXT   FROM  c2  INTO    @UniqID @id , @StationCode , @TestLineCode
WHILE   @@fetch_status   =   0
BEGIN
    
UPDATE   Server_UpdateRecordTable  set  NumOfUniqRecord = @UniqID    WHERE  NumOfRecordID = @id   and  NumOfCheckStation = @StationCode   and  NumOfCheckGroup = @TestLineCode
    
FETCH   NEXT   FROM  c2  INTO   @UniqID , @id , @StationCode , @TestLineCode
END
CLOSE  c2
DEALLOCATE  c2
GO

select   top   3   *   from  testresult
select   top   3   *   from  server_insertrecordtable
select   *   from  Server_UpdateRecordTable

    文章来源: http://blog.163.com/zkx_1022/blog/static/8806247200610853716740

    你可能感兴趣的:(trigger)