我们如何从触发器内部获取表名?

Kul*_*MCA 5 trigger sql-server-2008 t-sql

我需要将表名从触发器传递到过程。

ALTER TRIGGER [dbo].[Trg_ProjectCreation] 
   ON  [dbo].[Projects] 
   AFTER INSERT
AS 
BEGIN   
    SET NOCOUNT ON; 
 -- procedure call 
    exec Proc_Test @Tablename (not need to hardcode)
END
Run Code Online (Sandbox Code Playgroud)

我想知道有什么方法可以从触发器本身获取表名。我需要它是动态的,因为当表的名称更改时,我不想更改我的代码。

RoK*_*oKa 8

这可能不是解决您问题的最佳方法,但它肯定会实现既定目标。

ALTER TRIGGER [dbo].[Trg_ProjectCreation] ON  [dbo].[Projects] 
   AFTER INSERT
AS 
BEGIN   
    SET NOCOUNT ON; 
    declare @TableName sysname
    select @tablename = object_schema_name(parent_id) + '.' + object_name(parent_id) 
    from sys.triggers where object_id = @@PROCID

    exec dbo.myProcedure @Tablename 
END
GO
Run Code Online (Sandbox Code Playgroud)

更好的选择可能是更改触发器的创建方式,并手动放下名称(如果它适合您的场景),例如:

declare @tablename sysname, @sql nvarchar(max)
set @tablename = '[dbo].[myTableName]'
set @sql = 'ALTER TRIGGER [dbo].[Trg_ProjectCreation] ON  ' + @tablename + ' 
   AFTER INSERT
AS 
BEGIN   
    SET NOCOUNT ON; 
    exec dbo.myProcedure ' + @tablename + '
END
GO'
exec sp_executeSQL @sql
Run Code Online (Sandbox Code Playgroud)