У меня есть таблица, которая имеет как After Insert
, так и триггер After Update
. Если я, как вставлять записи, так и обновлять записи в одну команду, в каком порядке срабатывает триггеры?MySQL Trigger Execution Order
ответ
После создания тестового проекта я смог получить ответ. Триггеры запускаются в том порядке, в котором строки находятся в таблице. Поэтому, если бы у меня была таблица с триггерами After Insert, After Update и After Delete, они запускали бы в том порядке, в котором они запускают строки. Это было протестировано в MySQL 5.6.
Вот запрашиваемое Sample
Public Function UpdateTriggerrecords(ByVal dt As DataTable) As Boolean
Try
Return PerformUpdate(dt, SETUPTriggerrecords_UPDATE(), SETUPTriggerrecords_INSERT(), SETUPTriggerrecords_DELETE(), False)
Catch ex As Exception
Throw ex
End Try
End Function
Private Function SETUPTriggerrecords_UPDATE() As MySqlCommand
Dim cmd As New MySqlCommand("UPDATE tbltriggerrecords SET [email protected], [email protected] " & _
"WHERE [email protected]")
CreateTriggerrecordsParameters(cmd)
CreateTriggerrecordsIDParameters(cmd)
Return cmd
End Function
Private Function SETUPTriggerrecords_INSERT() As MySqlCommand
Dim cmd As New MySqlCommand("INSERT INTO tbltriggerrecords(strDescription,intTestingValue) " & _
"VALUES(@strDescription,@intTestingValue)")
CreateTriggerrecordsParameters(cmd)
Return cmd
End Function
Private Function SETUPTriggerrecords_DELETE() As MySqlCommand
Dim cmd As New MySqlCommand("DELETE FROM tbltriggerrecords WHERE [email protected]")
CreateTriggerrecordsIDParameters(cmd)
Return cmd
End Function
Private Sub CreateTriggerrecordsIDParameters(ByVal cmd As MySqlCommand)
cmd.Parameters.Add("@idTriggerRecords", MySqlDbType.Int32).SourceColumn = "idTriggerRecords"
End Sub
Private Sub CreateTriggerrecordsParameters(ByVal cmd As MySqlCommand)
cmd.Parameters.Add("@strDescription", MySqlDbType.VarChar).SourceColumn = "strDescription"
cmd.Parameters.Add("@intTestingValue", MySqlDbType.Int32).SourceColumn = "intTestingValue"
End Sub
Private Function PerformUpdate(ByVal dt As DataTable, ByVal cmdUpdate As MySqlCommand, ByVal cmdInsert As MySqlCommand, ByVal cmdDelete As MySqlCommand, ByVal capturePrimaryKeyValue As Boolean) As Boolean
If connMySQL Is Nothing Then
connMySQL = New MySqlConnection(connstrMySQL)
End If
Using connMySQL
If connMySQL.State <> ConnectionState.Open Then
connMySQL.ConnectionString = connstrMySQL
connMySQL.Open()
End If
trans = connMySQL.BeginTransaction
Dim da As New MySqlDataAdapter("", connMySQL)
cmdUpdate.Connection = connMySQL
cmdUpdate.Transaction = trans
cmdInsert.Connection = connMySQL
cmdInsert.Transaction = trans
If cmdDelete IsNot Nothing Then
cmdDelete.Connection = connMySQL
cmdDelete.Transaction = trans
End If
Try
If capturePrimaryKeyValue = True Then
AddHandler da.RowUpdated, New MySqlRowUpdatedEventHandler(AddressOf OnRowUpdatedMySQL)
End If
da.UpdateCommand = cmdUpdate
da.InsertCommand = cmdInsert
If cmdDelete IsNot Nothing Then
da.DeleteCommand = cmdDelete
End If
da.Update(dt)
If capturePrimaryKeyValue = True Then
RemoveHandler da.RowUpdated, AddressOf OnRowUpdatedMySQL
End If
PerformUpdate = True
trans.Commit()
Catch ex As Exception
trans.Rollback()
PerformUpdate = False
Finally
If connMySQL.State <> ConnectionState.Closed Then
connMySQL.Close()
End If
End Try
End Using
End Function
Можете ли вы привести пример своего кода, в результате которого появляется один оператор SQL, запускающий как после вставки, так и после триггера обновления в той же таблице? Я понимаю, что вы используете .NET с одной командой, но как это сводится к тому, что SQL-запрос обрабатывается MySQL? –
Комментарий может быть неправильно понят. Я обновил свой ответ, чтобы включить, как я обновил данные одним вызовом и уволил все три триггера. – Bryan
На самом деле вы не выпускаете один оператор SQL, который выполняет несколько функций. Триггеры MySQL (после вставки, после обновления и т. Д.) Выполняются при выполнении отдельных операторов SQL. Если логика в вашей программе такова, что вы вызываете функцию, и эта функция вызывает SQL INSERT, за которой следует SQL UPDATE, тогда триггер insert будет запущен до того, как MySQL даже узнает о заявлении об обновлении. Триггер обновления будет запущен, когда SQL UPDATE будет выполняться MySQL. Порядок выполнения триггера зависит от порядка выдачи выписок в вашей программе. –
Что Вы имеете в виду «вставить и обновление записей в одной команде» - пожалуйста, покажите один. Триггеры из определений, работающих над строками (ON tbl_name FOR EACH ROW). Я не знаю, в какой ситуации один запрос добавляет и обновляет одну строку за одно время. – ryrysz
. Мы используем команды .Net и если эта команда запускает как вложенные, так и обновляемые строки, которые запускаются первым, вставка или обновление – Bryan
вы можете показать некоторые строки кода? – ryrysz