Я создал триггер, задачей которого является сохранение информации о событиях-триггерах. Например: «Новый сотрудник добавляется в таблицу на дату 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
Ваш триггер сломана - 'inserted' может содержать * несколько * строк (или не строки), поэтому' ВЫБРАТЬ @name = имя FROM inserted' не собирается сократить горчицей. Попробуйте написать инструкцию 'insert', которая использует' insert' в предложении 'FROM' вместо того, чтобы пытаться работать со скалярными переменными. –