Chr*_*Run 4 sql-server audit triggers
我创建了一个触发器,该任务是存储有关触发器事件的信息。例如:“新员工于2014年10月13日添加到表中。
我创建了一个表-Audit-存储所有信息(来自触发器)。
CREATE TABLE [dbo].[Audit](
[id] [int] IDENTITY(1,1) NOT NULL,
[tableName] [nvarchar](255) NOT NULL,
[auditData] [nvarchar](max) NULL,
[userName] [nvarchar](255) NOT NULL,
PRIMARY KEY (id))
Run Code Online (Sandbox Code Playgroud)
但是,我创建的触发器如下所示:
CREATE TRIGGER [dbo].[tr_Actor_ForInsert_Audit]
ON [dbo].[Actor]
FOR INSERT
AS
BEGIN
DECLARE @userName NVARCHAR(255)
DECLARE @tableName NVARCHAR(255) = 'Actor'
DECLARE @name VARCHAR(255)
DECLARE @birthdate DATE
SELECT @userName = SYSTEM_USER
SELECT @name = name FROM inserted
SELECT @birthdate = birthdate FROM inserted
INSERT INTO Audit VALUES (@tableName, 'New ' + LOWER(@tableName) + ' with Name = ' + @name +
' and Birthdate = ' + CONVERT(NVARCHAR,@birthdate) + ' was added at ' + CONVERT(NVARCHAR,GETDATE()), @userName)
Run Code Online (Sandbox Code Playgroud)
结束;
如您所见,变量userName初始化为SYSTEM_USER。 但是变量tableName被初始化为硬编码值。
问题:有什么办法可以像我对userName一样,将变量tableName通用地初始化为tableName?
例如,如果存在类似这样的内容:
@tableName = SYSTEM_TABLE_WHERE_TRIGGER(TRIGGERNAME)_EXIST
问候,
基督教
小智 7
我稍微调整了@ChrisRun 的答案以包含触发器的架构,以防您在不同的架构中具有相同的触发器名称。
@tablename = SCHEMA_NAME(schema_id) + '.' + OBJECT_NAME(parent_object_id)
FROM sys.objects
WHERE sys.objects.name = OBJECT_NAME(@@PROCID)
AND SCHEMA_NAME(sys.objects.schema_id) = OBJECT_SCHEMA_NAME(@@PROCID)
Run Code Online (Sandbox Code Playgroud)
一切顺利,迈克
解:
@tablename = OBJECT_NAME(parent_object_id)
FROM sys.objects
WHERE sys.objects.name = OBJECT_NAME(@@PROCID)**
Run Code Online (Sandbox Code Playgroud)
问候,
基督教
| 归档时间: |
|
| 查看次数: |
5850 次 |
| 最近记录: |