триггер sql Server выдает ошибку в именах столбцов

#sql-server #sql-server-2014

#sql-server #sql-server-2014

Вопрос:

Я пытаюсь создать триггер в таблице в SQL Server 2014, но он выдает ошибку, подобную приведенной ниже

Недопустимое имя столбца ‘MemberID’

Запрос, который я выполняю, является

 CREATE TRIGGER dbo.EDIT_CASH_BOX_TREGER
ON dbo.CASH_BOX
AFTER INSERT,UPDATE,DELETE
AS
BEGIN
SET NOCOUNT ON;
 IF EXISTS(SELECT * FROM INSERTED)
                         AND EXISTS(SELECT * FROM DELETED)-- Set Action to Updated.
BEGIN 
 
   UPDATE dbo.CASH_BOX
     SET CASH_BOX.CASH_NAME='CANCEL NEW MEMBER ' INSERTED.MemberID
   ,  CASH_BOX.CASH_AMOUNT=INSERTED.NetAmount
    ,  CASH_BOX.CASH_REMARKS='CANCEL INSERT NEW MEMBER'
    ,  CASH_BOX.UPDATED_BY=INSERTED.UpdatedBy
    ,  CASH_BOX.UPDATED=GETDATE()
    ,  CASH_BOX.USER_ID=INSERTED.UpdatedBy
    ,  CASH_BOX.ACTIVE=1
    ,  CASH_BOX.OPERATION='CANCEL'
  FROM
        INSERTED
   WHERE (CASH_BOX.CASH_NAME=('NEW MEMBER ' INSERTED.MemberID)) AND  CASH_BOX.CASH_AMOUNT=INSERTED.NetAmount
END
IF EXISTS(SELECT * FROM INSERTED)-- Set Action to Insert.
BEGIN
  INSERT INTO CASH_BOX (CASH_NAME, CASH_AMOUNT, CASH_REMARKS, INSERTED_BY, INSERTED_DATE, USER_ID, ACTIVE,OPERATION)VALUES
    ('NEW MEMBER ' INSERTED.MemberID,INSERTED.NetAmount,'NEW MEMBER',INSERTED.UpdatedBy ,INSERTED.Updated,INSERTED.UpdatedBy,1,'ADD')
END
  END 

;
  

Комментарии:

1. Кроме того, почему, если этот триггер включен, DELETE когда он никогда не ссылается deleted ? Такое ощущение, что триггер является частью более крупной проблемы XY , если честно.

2. Проблема в вашей IF EXISTS части TRIGGER . Вы используете VALUES , а затем ссылаетесь INSERTED.MemberID . MemberID там нет контекста. Вам нужно использовать INSERT INTO...SELECT ... FROM... синтаксис. Это, однако, не меняет мой комментарий выше.

3. На самом деле, почему там вообще есть IF EXISTS(SELECT * FROM INSERTED) ? Единственный раз, когда inserted не было бы строк, находится в a DELETE , и вы ничего не делаете в случае a DELETE в приведенном выше, а внутри IF вы только ссылаетесь inserted .

4. Почему триггер после вставки вставляет дополнительные строки в ту же таблицу, в которой он определен? И ваша логика, скорее всего, ошибочна, поскольку оба блока кода (т. Е. Блок обновления и блок вставки) будут выполнены для обновления. Как утверждает Ларну, это, похоже, путь к неправильному назначению. И, похоже, вы полагаетесь на неявное преобразование — плохая привычка, которой вам следует избегать.