#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
не было бы строк, находится в aDELETE
, и вы ничего не делаете в случае aDELETE
в приведенном выше, а внутриIF
вы только ссылаетесьinserted
.4. Почему триггер после вставки вставляет дополнительные строки в ту же таблицу, в которой он определен? И ваша логика, скорее всего, ошибочна, поскольку оба блока кода (т. Е. Блок обновления и блок вставки) будут выполнены для обновления. Как утверждает Ларну, это, похоже, путь к неправильному назначению. И, похоже, вы полагаетесь на неявное преобразование — плохая привычка, которой вам следует избегать.