2014-10-13 2 views
1

Я создал триггер, задачей которого является сохранение информации о событиях-триггерах. Например: «Новый сотрудник добавляется в таблицу на дату 2014-10-13Как получить имя_таблицы в триггере - SQL Server

Я создал таблицу - Аудит - которая хранит всю информацию (от триггера)

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

.. Однако триггер я создал выглядит следующим образом:

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) 

END;

Как вы можете видеть, variabl e имя пользователя инициализируется SYSTEM_USER. , но переменная tableName занесена в категорию с жестким кодом.

Вопрос: Есть ли возможный способ как-то обобщенно инициализировать переменную TABLENAME в TABLENAME так же, как я сделал для имени пользователя?

Например, если что-то подобное существовало:

@tableName = SYSTEM_TABLE_WHERE_TRIGGER (TRIGGERNAME) _EXIST

С уважением,

Christian

+1

Ваш триггер сломана - 'inserted' может содержать * несколько * строк (или не строки), поэтому' ВЫБРАТЬ @name = имя FROM inserted' не собирается сократить горчицей. Попробуйте написать инструкцию 'insert', которая использует' insert' в предложении 'FROM' вместо того, чтобы пытаться работать со скалярными переменными. –

ответ

3

Решение:

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

С уважением,

Christian