我想根据列创建触发器,但仅限于以_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
不能设置触发只为在“_ess”结束记录运行,但你可以简单地添加一个'WHERE'条款的任何DML语句在你的触发器中。 – 2013-02-27 14:17:46
你有没有试过写触发器?如果是这样,那么请发布代码。 – Taryn 2013-02-27 14:18:19
什么时候你想检查插入数据,更新?你需要提供更多的细节。 – Taryn 2013-02-27 14:28:49