Gibt es in Magento eine Methode, mit der MySQL-Trigger und gespeicherte Prozeduren erstellt werden können?

8

Ich versuche herauszufinden, ob Magento eine Methode zur Verfügung hat, mit der MySQL-Trigger und gespeicherte Prozeduren erstellt werden können .

Derzeit verwende ich den DB-Adapter für die Kernressource, um das unformatierte SQL direkt aus meinem Setup-Skript einzufügen, und habe mich gefragt, ob tatsächlich eine Methode dafür verfügbar ist, ähnlich wie beim Hinzufügen von Fremdschlüsseln usw.

Kennt jemand so etwas entweder in EE oder CE? Eine Bibliothek oder ein benutzerdefiniertes Skript vielleicht?

Shaughn
quelle

Antworten:

5

Ok, also ich habe nicht viel Antwort darauf bekommen, also habe ich angefangen, mich umzuschauen. Ich kann die Hälfte der Frage beantworten, die ich gestellt habe.

Habe ein einfaches "grep" gemacht und bin auf die folgende Klasse gestoßen, die im lib-Ordner versteckt ist: lib/Magento/Db/Sql/Trigger.php

Es ist ziemlich einfach und hier ist, was ich mir ausgedacht habe, das funktioniert (kann in Ihr Installations- / Upgrade-Skript eingefügt werden):

<?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();

Ich habe Kommentare hinzugefügt, um eine grundlegende Vorstellung davon zu geben, was verwendet werden kann. Am besten überprüfen Sie die Klasse selbst. Der Body ist im Grunde genommen Raw-SQL, kann aber mit den herkömmlichen Methoden von Magento kompiliert werden. Ich habe Raw SQL zu Demonstrationszwecken verwendet.

Ich versuche immer noch, einen Weg zu finden, um GESPEICHERTE VERFAHREN ohne Erfolg umzusetzen . Ist jemand in Magento auf so etwas gestoßen, das für die zukünftige Verwendung versteckt sein könnte?

Shaughn
quelle
Am einfachsten ist es, eine .sqlVersionsdatei mit Ihrer gespeicherten Prozedur zu verwenden. Weitere Details: alanstorm.com/magento_setup_resources
B00MER
Zusätzlich und um Fehler zu vermeiden, können Sie einen Triggernamen mit angeben $trigger->setName('my_trigger_name')und $this->getConnection()->dropTrigger($trigger->getName())kurz zuvor hinzufügen$this->getConnection()->query($triggerCreateQuery);
Kevin Thomas