MySqlトリガアプリケーション


需要:プロトコル解析プログラムがあり、車両管理システムの車載端末設備の警報情報を生成する必要がある.
構想:開発コードをできるだけ増やさず、拡張能力を提供し、MySqlトリガを採用して完成することにした.
実際の作業例:
DELIMITER |
CREATE TRIGGER   ankaiAlarm0000   After INSERT ON AK_CAN_0000    FOR EACH ROW
 BEGIN
	//            
        declare  vid  varchar( 20 ) ;
	set  @vid = ( SELECT   VehicleManager.vm_id     FROM    VehicleManager   LEFT JOIN   MdtInfo  ON VehicleManager.vm_mdt_id = MdtInfo.m_id   WHERE  MdtInfo.m_code = NEW.m_code );
	//    ,      
	if  isnull(@vid ) = 0 then
		
		//        
		if   NEW.Max_Temprature_Battery  is not null  then
			if     ROUND(  NEW.Max_Temprature_Battery * 1 - 40 ,2  ) > 55       then	
				INSERT INTO   VarFault (vf_gcode,vf_faulttype,vf_faultnum,vf_vmid  )  VALUES( 
					 NEW.m_code,
					'    ',
					CONCAT( NEW.m_code,'        : ',ROUND(  NEW.Max_Temprature_Battery * 1 - 40 ,2  )   ,'  ',(  NEW.Max_Temprature_BatteryBox_No  &  0xf0 )  >> 4 , ' ' ) ,
					@vid
			 	 );
			end if ;
		end if ;

		//          
		if  NEW.Minimum_Voltage_Battery  is not null then

			if     ROUND(  NEW.Minimum_Voltage_Battery * 0.001  ,2 ) <   3.6      then
				INSERT INTO   VarFault (vf_gcode,vf_faulttype,vf_faultnum,vf_vmid  )  VALUES(  
					NEW.m_code,
					'    ',
					CONCAT( NEW.m_code,'        : ',ROUND(  NEW.Max_Temprature_Battery * 1 - 40 ,2  )   ,
								'   ',  NEW.Max_Vlotage_BatteryBox_No     &    0x0f, ' ',
								' ',NEW.Min_Single_Voltage_BatNO,' ' 
						) ,
					@vid 
				);
			end if ;
		
		end if ;
		//          

	end if ;
 END
|
DELIMITER ;

MySQLトリガ構文の詳細
CREATE TRIGGER構文
CREATE TRIGGER trigger_name trigger_time trigger_event
    ON tbl_name FOR EACH ROW trigger_stmt
トリガは、テーブルに関連する名前付きデータベース・オブジェクトであり、テーブルに特定のイベントが発生すると、オブジェクトがアクティブになります.
トリガと名前tbl_nameのテーブル関連.tbl_nameは永続テーブルを参照する必要があります.
トリガをTEMPORARYテーブルまたはビューに関連付けることはできません.
trigger_timeはトリガプログラムの動作時間です.
これはBEFOREまたはAFTERであり、トリガが文をアクティブにする前または後にトリガされることを示すことができる.
trigger_eventは、トリガをアクティブにする文のタイプを示します.trigger_イベントは、次のいずれかの値で指定できます.
・INSERT:テーブルに新しい行を挿入するときにトリガーを起動します.例えば、INSERT、LOAD DATA、REPLACEを通して
文.
・UPDATE:ある行を変更したときにトリガーをアクティブにします.たとえば、UPDATE文を使用します.
・DELETE:テーブルからローを削除するとトリガーがアクティブになります.たとえば、DELETE文とREPLACE文を使用します.
注意してtrigger_eventは、トリガをテーブル操作でアクティブにするSQL文とあまり似ていないことが重要です.
例えば、INSERTに関するBEFOREトリガは、INSERT文のみならず、LOAD DATA文によってもアクティブ化される.
紛らわしい例の一つはINSERT INTOです.ON DUPLICATE UPDATE ...構文:BEFORE INSERT
トリガは各行に対してアクティブになり、AFTER INSERTトリガ、またはBEFORE UPDATEおよびAFTERに続く
UPDATEトリガは、行に重複キーがあるかどうかによって異なります.
同じトリガ動作時間とイベントを持つ所定のテーブルには、2つのトリガは使用できません.たとえば、あるテーブルに対して、
BEFORE UPDATEトリガを2つ持つことができます.ただし、BEFORE UPDATEトリガが1つ、BEFOREが1つあります
INSERTトリガ、またはBEFORE UPDATEトリガ1つとAFTER UPDATEトリガ1つ.
trigger_stmtは、トリガがアクティブになったときに実行される文です.複数の文を実行する場合は、BEGINを使用します.END複
文構造を結合します.これにより、ストレージ・サブルーチンで許可されている同じ文を使用できます.
二DROP TRIGGER構文
DROP TRIGGER [schema_name.]trigger_name
トリガプログラムを破棄します.シナリオ名(schema_name)はオプションです.schema(シナリオ)を省略すると、現在の側から
シナリオではトリガプログラムを破棄します.
注記:MySQL 5.0.10以前のMySQLバージョンから5.0.10以降にアップグレードした場合(すべてのMySQL 5.1バージョンを含む)
本)は、アップグレード前にすべてのトリガを破棄し、その後に再作成する必要があります.そうしないと、アップグレード後DROP
TRIGGERは働きません.
DROP TRIGGER文にはSUPER権限が必要です.