1

トリガーからディスクにデータをファイルに書き込む方法はありますか? ファイル名は動的に作成する必要があります。

PREPARE を使用しても、トリガーでは機能しません。例えば

SET @Query1 = 
CONCAT("SELECT ",'data'," INTO DUMPFILE 'c:/temp/", UNIX_TIMESTAMP(),"-",RAND(), ".txt'");
PREPARE statementCreate FROM @Query1;
EXECUTE statementCreate;
DEALLOCATE PREPARE statementCreate;

注: data は変数です

または、トリガーから同じファイルに追加する他の解決策はありますか? それもうまくいきます。

4

2 に答える 2

5

MySQL のドキュメントには次のように記載されています。

SQL プリペアド ステートメント (PREPARE、EXECUTE、DEALLOCATE PREPARE) はストアド プロシージャで使用できますが、ストアド ファンクションまたはトリガーでは使用できません。したがって、ストアド ファンクションとトリガーは動的 SQL を使用できません (ステートメントを文字列として作成してから実行する場合)。

いいえ、トリガーから動的に作成された名前のファイルにデータを書き込むことはできません。

動的SQLは使用できませんが、単一のファイル名を承認してデータを追加することもできるため、データを一時ファイルにロードし、クエリの結果を追加してから、完全な結果をファイルに出力できます。もちろん、ファイル名以外に動的に作成されたクエリを使用する必要がない場合にのみ機能します。

例:

DELIMITER $$

CREATE TRIGGER rewrite_file AFTER INSERT tableName
BEGIN

  CREATE TEMPORARY TABLE IF NOT EXISTS temp(
    pk BIGINT
  );

  LOAD DATA INFILE 'c:/somefile.txt' INTO TABLE temp
  LINES TERMINATED BY '\n';

  INSERT INTO temp (pk) SELECT primaryKeyField FROM tableName;

  SELECT pk INTO OUTFILE 'c:/somefile.txt'
  LINES TERMINATED BY '\n'
  FROM temp;

END$$

DELIMITER ;

挿入ごとにファイル c:/somefile.txt を追加します。もちろん、ファイルが何百万ものエントリに成長した場合、このソリューションは最悪です。

于 2013-09-12T13:01:42.977 に答える
4

解決策は、MySQL UDF: http://www.mysqludf.orgです。sys_exec 関数をインストールした後、トリガーから次のようなもの SET @ret_val = sys_exec(CONCAT('echo.>d:/temp/',NEW.id, '-', UNIX_TIMESTAMP() , '.txt')); があります。これにより、挿入ごとに空のファイルが作成されます。Windows と Linux (CentOS) でテスト済み。

于 2013-09-16T08:28:58.637 に答える