В триггере получить значения из вставки - PullRequest
2 голосов
/ 16 декабря 2011

Когда я пытаюсь создать этот триггер, я получаю следующее исключение:

The name "SITE_ID" is not permitted in this context. Valid expressions are constants, constant expressions, and (in some contexts) variables. Column names are not permitted.

CREATE TRIGGER tr_VISITACTIVITY_insert ON VISITACTIVITY
INSTEAD OF INSERT AS
BEGIN

    INSERT INTO [VISITACTIVITY]
               ([O_ID]
               ,[SITE_ID]
               ,[VISIT_DATE]
               ,[STAFF]
               ,[VISIT_TYPE_ID]
               ,[COMMENTS]
               ,[DELETED])
         VALUES
               (-1
               ,SITE_ID
               ,VISIT_DATE
               ,STAFF
               ,VISIT_TYPE_ID
               ,VISIT_COMMENTS
               ,0
               )
    GO

END
GO

Вставка, которую программист выдаст в приложении, выглядит примерно так:

    INSERT INTO [VISITACTIVITY]
           ([SITE_ID]
           ,[VISIT_DATE]
           ,[STAFF_COMMENT]
           ,[VISIT_TYPE_ID]
           ,[COMMENTS]
           )
     VALUES
           (15
           ,'2011-08-08'
           ,'Eric, John'
           ,6
           ,'invasives growing along the border of the preserve'
           )

Итак, мне нужны значения, которые программист предоставил во вставке для создания вставки в триггере.

Как мне ссылаться на эти значения в триггере?

Спасибо.

1 Ответ

1 голос
/ 16 декабря 2011

Вам нужно взглянуть на мета-таблицу 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.

(Конечно, вы могли бы упростить задачу ради вопроса, но я просто подчеркиваю, как вы можете сделать это, не прибегая к триггеру).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...