Ok, então eu não tive muita resposta disso, então comecei a cavar em torno de mim e sou capaz de responder metade da pergunta que fiz.
Fiz um simples "grep" e me deparei com a seguinte classe escondida na pasta lib: lib/Magento/Db/Sql/Trigger.php
É bem simples e aqui está o que eu criei que funciona (pode ser colocado no seu script de instalação / atualização):
<?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();
Eu adicionei comentários para dar uma idéia básica do que pode ser usado; caso contrário, é melhor ir conferir a aula. O corpo é basicamente SQL bruto, mas pode ser compilado usando os métodos convencionais do Magento. Eu usei o SQL bruto para fins de demonstração.
Que fora do caminho, ainda estou tentando encontrar uma maneira de implementar PROCEDIMENTOS ARMAZENADOS sem sucesso. Alguém já encontrou algo assim no Magento que pode ser escondido para uso futuro?
.sql
arquivo de versão com o procedimento armazenado. Mais detalhes: alanstorm.com/magento_setup_resources$trigger->setName('my_trigger_name')
e adicionar um$this->getConnection()->dropTrigger($trigger->getName())
pouco antes$this->getConnection()->query($triggerCreateQuery);