Триггер SQL Server при вставке

#c# #sql #sql-server #triggers

#c# #sql #sql-сервер #триггеры

Вопрос:

Когда я пытаюсь вставить новую запись в таблицу, которую я создал, триггер для нее не создается.

Это после того, как я активировал триггер. Когда я деактивирую его, а затем повторяю вставку, она проходит. Чего мне не хватает в моем триггере?

Мой триггер идентифицирует все новые строки в таблице, а затем отправляет их получателю по электронной почте.

Это мой триггер

 USE [paldbCAT_TEST]
GO
/****** Object:  Trigger [dbo].[LPO_ON_INSERT]    Script Date: 10-11-2020 12:09:01 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER trigger [dbo].[LPO_ON_INSERT] 
ON [dbo].[tblOrdersDocP_POApprovals]
INSTEAD OF INSERT AS

Declare
@HTMLbody nvarchar (max),
@strOrdPDocID varchar(100),
@strSelectedApproverUserName varchar(50),
@SQL nvarchar(max)

SET @SQL =''

Set @HTMLbody = '<html><head><title> System Tables</title></head><body>'
Set @HTMLbody = @HTMLbody   '<center>       <h1 style="font-family: arial, sans-serif">Purchase Requisition(s) awaiting approvals.</h1></center>'
Set @HTMLbody = @HTMLbody   '<center><table style="font-family: arial, sans-serif;border-collapse: collapse;width: 100%;" ><TH style="background-color:black; color:white;border: 1px solid #dddddd;text-align: left;padding: 8px;">Document Number</TH><TH style="background-color:black; color:white;border: 1px solid #dddddd;text-align: left;padding: 8px;">Document Approver</TH>'

declare SystemTable cursor

for
select strOrdPDocID,strSelectedApproverUserName from tblOrdersDocP_POApprovals
open SystemTable
Fetch next from SystemTable into @strOrdPDocID,@strSelectedApproverUserName


While (@@FETCH_STATUS<> -1)
Begin
Set @SQL = @SQL   '<TR><TD style=" border: 1px solid #dddddd;text-align: left;padding: 8px;">'  @strOrdPDocID   '</TD><TD style=" border: 1px solid #dddddd;text-align: left;padding: 8px;">'   @strSelectedApproverUserName   '</TD></TR>'

Fetch next from SystemTable into @strOrdPDocID,@strSelectedApproverUserName
End
Close SystemTable
DEALLOCATE SystemTable


Set @HTMLbody = @HTMLbody   @SQL   '</table></center></body></html>'




EXEC msdb.dbo.sp_send_dbmail
@profile_name = 'CatNotificationsMain',
@recipients = 'test@gmail.com',
@subject = 'Database Record Deleted',
@body_format='HTML',
@body = @HTMLbody,
@attach_query_result_as_file = 0;


  

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

1. Это не похоже на триггер. Он никогда не использует inserted / deleted и пропускает ТРИГГЕР CREATE, поэтому мы не знаем, действительно ли это триггер

2. Привет, взгляните на поправки

3. Ваш триггер «ВМЕСТО ВСТАВКИ». Как следует из этого названия — он запускается вместо insert, поэтому фактическая вставка не происходит.

4. Эй, я только что нашел решение @Evk, утверждение «ВМЕСТО ВСТАВКИ» было ущербом

5. Обратите внимание, что вы должны получать доступ к вставляемым строкам через «ВСТАВЛЕННУЮ» ссылку, а не так, как вы делаете сейчас.

Ответ №1:

Вы создаете триггер, который заменяет оператор INSERT, пока ваш триггер уведомляет о вставке, его следует запускать ПОСЛЕ того, как произошла вставка.

Вы можете дополнительно ознакомиться с типами триггеров в документе MS

 ALTER trigger [dbo].[LPO_ON_INSERT] 
ON [dbo].[tblOrdersDocP_POApprovals]
AFTER INSERT AS
  

Ответ №2:

Эй, я только что нашел решение @Evk, утверждение «ВМЕСТО ВСТАВКИ» было ущербом

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

1. в значительной степени то, что я сказал вам в своем ответе, рад, что вы нашли проблему. Счастливого кодирования!