如何在触发器中获取table_name-SQL Server

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)

一切顺利,迈克


Chr*_*Run 5

解:

@tablename = OBJECT_NAME(parent_object_id) 
             FROM sys.objects 
             WHERE sys.objects.name = OBJECT_NAME(@@PROCID)**
Run Code Online (Sandbox Code Playgroud)

问候,

基督教