2015-06-18 3 views
0

У меня есть таблица, которая имеет как After Insert, так и триггер After Update. Если я, как вставлять записи, так и обновлять записи в одну команду, в каком порядке срабатывает триггеры?MySQL Trigger Execution Order

+2

Что Вы имеете в виду «вставить и обновление записей в одной команде» - пожалуйста, покажите один. Триггеры из определений, работающих над строками (ON tbl_name FOR EACH ROW). Я не знаю, в какой ситуации один запрос добавляет и обновляет одну строку за одно время. – ryrysz

+0

. Мы используем команды .Net и если эта команда запускает как вложенные, так и обновляемые строки, которые запускаются первым, вставка или обновление – Bryan

+0

вы можете показать некоторые строки кода? – ryrysz

ответ

0

После создания тестового проекта я смог получить ответ. Триггеры запускаются в том порядке, в котором строки находятся в таблице. Поэтому, если бы у меня была таблица с триггерами 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 
+0

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

+0

Комментарий может быть неправильно понят. Я обновил свой ответ, чтобы включить, как я обновил данные одним вызовом и уволил все три триггера. – Bryan

+0

На самом деле вы не выпускаете один оператор SQL, который выполняет несколько функций. Триггеры MySQL (после вставки, после обновления и т. Д.) Выполняются при выполнении отдельных операторов SQL. Если логика в вашей программе такова, что вы вызываете функцию, и эта функция вызывает SQL INSERT, за которой следует SQL UPDATE, тогда триггер insert будет запущен до того, как MySQL даже узнает о заявлении об обновлении. Триггер обновления будет запущен, когда SQL UPDATE будет выполняться MySQL. Порядок выполнения триггера зависит от порядка выдачи выписок в вашей программе. –