Trigger & Table Name
Un paio di giorni fa ho ricevuto questa domanda (sinceramente, non me l’aveva mai fatta nessuno prima :-)): “come posso, dall’interno di un trigger, conoscere il nome della tabella che lo ha scatenato?”.
Ci sono almeno tre modi diversi, tramite le vista:
- sys.sysobjects
- sys.triggers
- sys.dm_tran_locks
Ad esempio:
USE tempdb
GO
/* setup */
CREATE TABLE test
(
colonna INT
)
GO
/* trigger */
CREATE TRIGGER trInsertTest ON test
FOR INSERT
AS
BEGIN
/* 1 */
SELECT OBJECT_NAME(resource_associated_entity_id) AS tableName
FROM sys.dm_tran_locks
WHERE
request_session_id = @@spid AND
resource_type = 'OBJECT'
/* 2 */
SELECT
OBJECT_NAME(parent_id) AS tableName,
OBJECT_NAME(@@PROCID) AS triggerName
FROM sys.triggers
WHERE name = OBJECT_NAME(@@PROCID)
/* 3 */
SELECT
OBJECT_NAME(parent_obj) AS TABNAME
FROM sys.sysobjects
WHERE id = @@PROCID
END
GO
/* insert per test */
INSERT test VALUES (10)
GO
/* cleanup */
DROP TRIGGER trInsertTest
DROP TABLE test
GO