Вам нужно взглянуть на мета-таблицу INSERTED
, которая в основном представляет собой таблицу, содержащую все вставляемые данные, поэтому вы должны ссылаться (например) SITE_ID
как inserted.SITE_ID
.
Кроме того, вам также следует соблюдать осторожность при выполнении однострочных вставок внутри триггера (как вы, похоже, делаете). Если в пакет вставлено несколько строк, то INSERTED
будет содержать несколько строк. Так что вам нужно использовать INSERT INTO table (...) SELECT ...
, например:
INSERT INTO [VISITACTIVITY]
([SITE_ID]
,[VISIT_DATE]
,[STAFF_COMMENT]
,[VISIT_TYPE_ID]
,[COMMENTS]
)
SELECT VISITACTIVITY, SITE_ID, VISIT_DATE, STAFF_COMMENT, VISIT_TYPE_ID, COMMENTS
FROM inserted
Кстати, читая ваш вопрос, похоже, вы просто используете триггер для заполнения значений по умолчанию в нескольких столбцах. Рассматривали ли вы просто использование ограничения DEFAULT для таблицы вместо этого? Например, если вы сделали следующее:
ALTER TABLE VisitActivity ADD CONSTRAINT DF_VisitActivity_Deleted DEFAULT (0) FOR DELETED
ALTER TABLE VisitActivity ADD CONSTRAINT DF_VisitActivity_OID DEFAULT (-1) FOR O_ID
... тогда ваш пример вставки будет вести себя так же без триггера. Это зависит от того, хотите ли вы всегда переопределять значения в Deleted или O_ID или нет. Если вы всегда хотите переопределить, используйте триггер - или еще лучше, вставьте CHECK
в столбец, чтобы принудительно установить его в фиксированное значение (также будет выделено, где ваш код пытается изменить его, поскольку SQL Server не выполнит вставку из-за к ссылочной целостности). Если вы хотите иметь возможность переопределить его, используйте ограничения DEFAULT
.
(Конечно, вы могли бы упростить задачу ради вопроса, но я просто подчеркиваю, как вы можете сделать это, не прибегая к триггеру).