Sql server 如何在触发器中获取表名-SQL Server

Sql server 如何在触发器中获取表名-SQL Server,sql-server,triggers,audit,Sql Server,Triggers,Audit,我已经创建了一个触发器,它的任务是存储有关触发器事件的信息。 例如:“2014年10月13日新员工添加到表中 我已经创建了一个表-Audit-它存储了(来自触发器的)所有信息 但是,我创建的触发器如下所示: CREATE TRIGGER [dbo].[tr_Actor_ForInsert_Audit] ON [dbo].[Actor] FOR INSERT AS BEGIN DECLARE @userName NVARCHAR(255) DECLARE @tableName NVARCHAR(2

我已经创建了一个触发器,它的任务是存储有关触发器事件的信息。 例如:“2014年10月13日新员工添加到表中

我已经创建了一个表-Audit-它存储了(来自触发器的)所有信息

但是,我创建的触发器如下所示:

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)
结束

如您所见,变量userName被初始化为SYSTEM\u USER。 但是变量tableName被初始化为一个硬编码值

问题: 是否有任何可能的方法以某种方式将变量tableName初始化为tableName 与我对用户名所做的相同?

例如,如果存在类似的情况:

@tableName=SYSTEM\u TABLE\u其中存在触发器(TRIGGERNAME)\u

问候,

Christian解决方案:

@tablename = OBJECT_NAME(parent_object_id) 
             FROM sys.objects 
             WHERE sys.objects.name = OBJECT_NAME(@@PROCID)**
问候,


Christian

触发器的用途是固定的。但是,如果您想成为动态的, 从SP内部调用SP


我稍微调整了@ChrisRun answer,以包含触发器的模式,以防在不同的模式中有相同的触发器名称

@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)
祝你一切顺利,
Mike

您的触发器已损坏-
inserted
可以包含多行(或没有行),因此
SELECT@name=name FROM inserted
无法解决问题。请尝试在
FROM
子句中编写
inserted
语句,而不是尝试使用标量变量。
@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)