Ok, entonces no he recibido mucha respuesta de esto, así que comencé a cavar a mi alrededor y puedo responder la mitad de la pregunta que hice.
Hice un simple "grep" y encontré la siguiente clase escondida en la carpeta lib: lib/Magento/Db/Sql/Trigger.php
Es bastante sencillo y esto es lo que se me ocurrió que funciona (se puede colocar en su script de instalación / actualización):
<?php
/** @var $installer Mage_Core_Model_Resource_Setup */
$installer = $this;
$installer->startSetup();
// Trigger
$trigger = new Magento_Db_Sql_Trigger();
// Set time SQL_TIME_BEFORE / SQL_TIME_AFTER
$trigger->setTime($trigger::SQL_TIME_BEFORE);
// Set time SQL_EVENT_INSERT / SQL_EVENT_UPDATE / SQL_EVENT_DELETE
$trigger->setEvent($trigger::SQL_EVENT_INSERT);
// Set target table name
$trigger->setTarget($installer->getTable('fontera_trader/leaderboards_global_tmp'));
// Set Body
$trigger->setBody(
'INSERT INTO '.$installer->getTable('fontera_trader/leaderboards_global').'
(entity_id, customer_id , credit_value, prize_value, games_played, rank, prev_rank)
VALUES
(NEW.entity_id, NEW.customer_id, NEW.credit_value, NEW.prize_value, NEW.games_played, NEW.rank, NEW.prev_rank)
ON DUPLICATE KEY UPDATE
customer_id = NEW.customer_id,
credit_value = NEW.credit_value,
prize_value = NEW.prize_value,
games_played = NEW.games_played,
rank = NEW.rank,
prev_rank = NEW.prev_rank;
SET @r = 0;
UPDATE '.$installer->getTable('fontera_trader/leaderboards_global').'
SET
prev_rank = rank,
rank = @r:= (@r+1)
ORDER BY
credit_value
DESC;
'
);
// Assemble query, returns direct SQL for trigger
$triggerCreateQuery = $trigger->assemble();
// Adapter initiates query
$this->getConnection()->query($triggerCreateQuery);
$installer->endSetup();
He agregado comentarios para dar una idea básica de lo que se puede usar, de lo contrario, mejor ve a ver la clase tú mismo. El cuerpo es básicamente SQL sin formato, pero puede compilarse utilizando los métodos convencionales de Magento. He usado SQL sin formato para fines de demostración.
Fuera del camino, todavía estoy tratando de encontrar una manera de implementar PROCEDIMIENTOS ALMACENADOS sin éxito. ¿Alguien ha encontrado algo como esto en Magento que pueda estar escondido para su uso futuro?
.sql
archivo de versión con su procedimiento almacenado. Más detalles: alanstorm.com/magento_setup_resources$trigger->setName('my_trigger_name')
y agregar$this->getConnection()->dropTrigger($trigger->getName())
justo antes$this->getConnection()->query($triggerCreateQuery);