2013-02-27 72 views
0

我想根據列創建觸發器,但僅限於以_ess結尾的那些記錄。我如何設置審計觸發器來執行此操作?SQL Server 2008基於子字符串的審計觸發器

這是當前的觸發器,但它只是檢查用戶名的所有更改,而我只是希望它檢查用戶名更新爲或來自以_ess結尾的用戶名。

SET ANSI_NULLS ON 
GO 

SET QUOTED_IDENTIFIER ON 
GO 


CREATE TRIGGER [dbo].[AUDIT_UPD_HRPERSONS_USERNAME] ON [dbo].[HRPersons] FOR UPDATE NOT FOR REPLICATION As 
BEGIN 
DECLARE 
@OperationNum int, 
@DBMSTransaction VARCHAR(255), 
@OSUSER VARCHAR(50), 
@DBMSUSER VARCHAR(50), 
@HostPhysicalAddress VARCHAR(17), 
@contexto varchar(128), 
@ApplicationModifierUser varchar(50), 
@SessionInfo_OSUser varchar(50), 
@HostLogicalAddress varchar(30) 

Set NOCOUNT On 

IF @@trancount>0 
BEGIN 
EXECUTE sp_getbindtoken @DBMSTransaction OUTPUT 
END 
ELSE BEGIN 
SET @DBMSTransaction = NULL 
END 

IF PatIndex('%\%',SUSER_SNAME()) > 0 
BEGIN 
set @OSUSER = SUSER_SNAME() 
set @DBMSUSER = NULL 
END 
ELSE BEGIN 
SET @OSUSER = NULL 
SET @DBMSUSER = SUSER_SNAME() 
END 

set @HostPhysicalAddress = (SELECT net_address FROM master..sysprocesses where [email protected]@spid) 
set @HostPhysicalAddress = substring (@HostPhysicalAddress,1,2) + '-' + substring (@HostPhysicalAddress,3,2) + '-' + substring (@HostPhysicalAddress,5,2) + '-' + substring (@HostPhysicalAddress,7,2) + '-' + substring (@HostPhysicalAddress,9,2) + '-' + substring (@HostPhysicalAddress,11,2) 

SELECT @contexto=CAST(context_info AS varchar(128)) FROM master..sysprocesses WHERE [email protected]@SPID 
IF (PatIndex('%APPLICATION_USER=%',@contexto) is not null) and (PatIndex('%APPLICATION_USER=%',@contexto) > 0) 
set @ApplicationModifierUser=substring(ltrim(substring(@contexto,PatIndex('%APPLICATION_USER=%',@contexto)+17,128)),1, charIndex('///',ltrim(substring(@contexto,PatIndex('%APPLICATION_USER=%',@contexto)+17,128))) - 1) 
ELSE 
set @ApplicationModifierUser=NULL 
IF (PatIndex('%OS_USER=%',@contexto) is not null) and (PatIndex('%OS_USER=%',@contexto)>0) 
set @SessionInfo_OSUser=substring(ltrim(substring(@contexto,PatIndex('%OS_USER=%',@contexto)+8,128)),1, charIndex('///',ltrim(substring(@contexto,PatIndex('%OS_USER=%',@contexto)+8,128))) - 1) 
ELSE 
set @SessionInfo_OSUser=NULL 
IF (PatIndex('%LOGICAL_ADDRESS=%',@contexto) is not null) and (PatIndex('%LOGICAL_ADDRESS=%',@contexto)>0) 
set @HostLogicalAddress=substring(ltrim(substring(@contexto,PatIndex('%LOGICAL_ADDRESS=%',@contexto)+16,128)),1, charIndex('///',ltrim(substring(@contexto,PatIndex('%LOGICAL_ADDRESS=%',@contexto)+16,128))) - 1) 
ELSE 
set @HostLogicalAddress=NULL 

INSERT INTO AuditedOperations (Application, Object, OperationType, ModifiedDate, ApplicationModifierUser, OSModifierUser, DBMSModifierUser, Host, HostLogicalAddress, HostPhysicalAddress, DBMSTransaction) 
VALUES (APP_NAME(), 'HRPERSONS', 'U', GETDATE(), @ApplicationModifierUser, @OSUSER, @DBMSUSER, HOST_NAME(), @HostLogicalAddress, @HostPhysicalAddress, @DBMSTransaction) 

Set @OperationNum = @@IDENTITY 

INSERT INTO AuditedRows (OperationNum, RowPK) 
SELECT @OperationNum, ISNULL(CAST(INSERTED.ID as nvarchar),CAST(DELETED.ID as nvarchar)) 
FROM INSERTED FULL OUTER JOIN DELETED ON INSERTED.ID=DELETED.ID 

INSERT INTO AuditedRowsColumns (OperationNum, RowPK, ColumnName, ColumnAudReg, OldValue, NewValue) 
SELECT @OperationNum, ISNULL(CAST(INSERTED.ID as nvarchar),CAST(DELETED.ID as nvarchar)), 'USERNAME','A', CONVERT(VARCHAR(3500),DELETED.USERNAME), CONVERT(VARCHAR(3500),INSERTED.USERNAME) 
FROM INSERTED FULL OUTER JOIN DELETED ON INSERTED.ID=DELETED.ID 

END 

GO 
+1

不能設置觸發只爲在「_ess」結束記錄運行,但你可以簡單地添加一個'WHERE'條款的任何DML語句在你的觸發器中。 – 2013-02-27 14:17:46

+1

你有沒有試過寫觸發器?如果是這樣,那麼請發佈代碼。 – Taryn 2013-02-27 14:18:19

+0

什麼時候你想檢查插入數據,更新?你需要提供更多的細節。 – Taryn 2013-02-27 14:28:49

回答

1

只需補充一點:

INSERT INTO AuditedRows (OperationNum, RowPK) 
SELECT @OperationNum, ISNULL(CAST(INSERTED.ID as nvarchar),CAST(DELETED.ID as nvarchar)) 
FROM INSERTED FULL OUTER JOIN DELETED ON INSERTED.ID=DELETED.ID 
-- Restrict it to only those where the username is changing from or to %_ess 
WHERE (deleted.username like '%_ess' or inserted.username like '%_ess') 

INSERT INTO AuditedRowsColumns (OperationNum, RowPK, ColumnName, ColumnAudReg, OldValue, NewValue) 
SELECT @OperationNum, ISNULL(CAST(INSERTED.ID as nvarchar),CAST(DELETED.ID as nvarchar)), 'USERNAME','A', CONVERT(VARCHAR(3500),DELETED.USERNAME), CONVERT(VARCHAR(3500),INSERTED.USERNAME) 
FROM INSERTED FULL OUTER JOIN DELETED ON INSERTED.ID=DELETED.ID 
-- Restrict it to only those where the username is changing from or to %_ess 
WHERE (deleted.username like '%_ess' or inserted.username like '%_ess') 
+0

它看起來像只檢查刪除或插入的用戶名。如果我添加「或更新。用戶名像'%_ess'」我得到錯誤「多部分標識符」updated.username「cound不受限制」 – 2013-02-27 16:28:15

+0

沒有'更新'僞表。已刪除的行出現在「已刪除」中,但未出現在「已插入」中。插入的行出現在「插入」中,但不出現在「已刪除」中。更新的行出現在「已刪除」和「已插入」中。 – Ben 2013-02-27 16:34:21