2

私は完全に機能するトリガーを持っています。テストを追加していくと、現在のデータベースに基づいてデータベースを動的に選択するようにこのトリガーを変更したいことがわかりました。本番環境では、このトリガーはデータベースrdataに常駐し、 と通信しますdefault。ただし、テストでは、トリガーは に存在し、test_rdataと通信しtest_defaultます。以下のトリガーを変更して、適切なデータベースを動的に選択するにはどうすればよいですか

DROP TRIGGER IF EXISTS `af_rdata_data_trigger_4` $$
CREATE TRIGGER af_rdata_data_trigger_4
    AFTER INSERT on Results FOR EACH ROW
    BEGIN
        DECLARE project_id INT;
        -- Do this first - another table may have already created it..
        INSERT INTO default.rdata_project (`user`,`result_number`, `created_on`)
        VALUES (USER(), NEW.LBLDGRUNNO, NOW()) ON DUPLICATE KEY UPDATE last_update=NOW();
        -- Now push in our values 

        -- THIS IS WHAT NEEDS TO BE DYNAMIC!!
        UPDATE default.rdata_project project JOIN Results
        ON project.result_number = Results.LBLDGRUNNO SET
            project.annual_total_cost = Results.FTOTCOST
        WHERE project.result_number=NEW.LBLDGRUNNO;

    END$$
DELIMITER ;

どうもありがとう!

4

1 に答える 1

0

STORED PROCEDUREを使用して動的SELECTステートメントを作成し、 TRIGGERからそのプロシージャをCALLできます。たとえば、以下のコードを確認してください。

DELIMITER $$

DROP PROCEDURE IF EXISTS `sp_UpdateProject`$$

CREATE PROCEDURE `sp_UpdateProject`(IN _dbName VARCHAR(100), IN _LBLDGRUNNO INT)
BEGIN 
    SET @s = CONCAT("UPDATE ", _dbName, ".rdata_project project ");
    SET @s = CONCAT(@s, "JOIN Results ON project.result_number = Results.LBLDGRUNNO ");
    SET @s = CONCAT(@s, "SET project.annual_total_cost = Results.FTOTCOST ");
    SET @s = CONCAT(@s, "WHERE project.result_number=", _LBLDGRUNNO,";");
    PREPARE stmt FROM @s;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
END$$

DELIMITER ;

DROP TRIGGER IF EXISTS `af_rdata_data_trigger_4` $$
CREATE TRIGGER af_rdata_data_trigger_4
    AFTER INSERT ON Results FOR EACH ROW
    BEGIN
        DECLARE project_id INT;
        -- Do this first - another table may have already created it..
        INSERT INTO default.rdata_project (`user`,`result_number`, `created_on`)
        VALUES (USER(), NEW.LBLDGRUNNO, NOW()) ON DUPLICATE KEY UPDATE last_update=NOW();
        -- Now push in our values 

        -- THIS IS WHAT NEEDS TO BE DYNAMIC!!
        CALL sp_UpdateProject(dbName, NEW.LBLDGRUNNO);
    END$$
DELIMITER ;
于 2013-01-01T05:26:45.597 に答える