Использование времени в триггерах отправляет запрос в бесконечный цикл - PullRequest
0 голосов
/ 18 мая 2018

Я создал триггер для вставки, и он работает нормально.Это прекрасно создает триггер:

While (exists(Select Id from #temp))

Но запрос на вставку входит в бесконечный цикл.Я использую пока существует для размещения нескольких вставок одновременно.Может кто-нибудь сказать мне, что вызывает бесконечный цикл?

Create Table sqltutorial.Employee
(
     Id int,
     Name nvarchar(50),
     Salary int,
     Gender nvarchar(50),
     DepartmentId int
)

Alter Trigger sqltutorial.trg_forinsert_Employee
on sqltutorial.Employee
For Insert
As
Begin
    print 'Audit Begins'

    Declare @Id int, @Name nvarchar(50), @Salary int,
            @Gender nvarchar(50), @DepartmentId nvarchar(50)
    Declare @AuditText nvarchar(500)

    Select * 
    into #temp 
    from inserted

    While (exists(Select Id from #temp))
        Select @Id = Id from #temp

    Select 
        @Id = Id, @Name = Name, @Salary = Salary,
        @Gender = Gender, @DepartmentId = DepartmentID 
    from 
        #temp

    Set @AuditText = 'New Record Inserted With Id='+Cast(@Id As nvarchar(50))+',Name='+@Name+' ,Salary='+CAST(@Salary as nvarchar(50))+' Gender'+@Gender
                  +' ,Department Id='+@DepartmentId+' on '+CAST((Select GETDATE()) AS nvarchar(50))+' by '+(Select  system_user)

    Insert into sqltutorial.AuditTrial 
    values (@AuditText)

    Delete from #temp 
    where Id = @Id

    print 'Audit Ends'
End

Ответы [ 2 ]

0 голосов
/ 18 мая 2018

Причина бесконечного цикла состоит в том, что вы не указали BEGIN и END для своего WHILE блока кода цикла следующим образом:

WHILE SomeCondition = true
  BEGIN

  Do stuff

  END

Когда вы используете WHILE ине указывайте BEGIN..END, цикл WHILE повторяет только следующий оператор , снова и снова, пока условие WHILE больше не будет выполнено.И в вашем коде этого никогда не произойдет, поскольку следующий оператор ничего не удаляет из #temp.

Другими словами, в вашем коде это то, что вы делаете в цикле:

While (exists(Select Id from #temp))
    Select @Id = Id from #temp

Остальная часть кода после этого никогда даже не выполняется, потому что цикл WHILE никогда не завершается.

0 голосов
/ 18 мая 2018

Вам не нужно использовать все переменные и временные таблицы в вашем триггере, просто выполните следующее:

ALTER TRIGGER sqltutorial.trg_forinsert_Employee
ON sqltutorial.Employee
FOR INSERT
AS
BEGIN
    SET NOCOUNT ON;

    INSERT INTO sqltutorial.AuditTrial 
        SELECT  
            ' New Record Inserted With Id=' + CAST([Id] AS NVARCHAR(50)) +
            ',Name=' + [Name] +
            ',Salary=' + CAST(Salary AS NVARCHAR(50)) +
            ',Gender' + Gender +
            ',Department Id=' + DepartmentId + 
            ' on ' + CAST((SELECT GETDATE()) AS NVARCHAR(50)) +
            ' by ' + CAST(system_user AS NVARCHAR(256))
        FROM 
            inserted
END
...