[Memo]PHPからMT経由でMicrosoft SQL ServerにオブジェクトをINSERTする
公開日 : 2013-08-20 20:19:51
メモっとかないとな。普通にやると、
Error Code: 544 Message: [Microsoft][SQL Server Native Client 11.0][SQL Server]Cannot insert explicit value for identity column in table 'mt_entry' when IDENTITY_INSERT is set to OFF. ]
INSERT文に entry_id があると、どうもこいつが出るようで
INSERT INTO mt_entry(entry_id,entry_author_id,...
SET IDENTITY_INSERT mt_entry ON
とすると、今度は
Error Code: 515 Message: [Microsoft][SQL Server Native Client 11.0][SQL Server]Cannot insert the value NULL into column 'entry_id', table...
NULLなので、あかん、と出る(そりゃそうだ)。SQL文は mt/php/extlib/adodb/adodb-active-record.inc.php (function Insert())が生成しているので、INSERT文にentry_idが入るのは避けられない。SET IDENTITY_INSERT テーブル名 ON して、任意の値を入れられるようにして最大値に ++ したものを突っ込むように。IDの重複があればエラーになるので、上書きとかにはならんのですが、エラーの際には大きめの値をセットし直して突っ込むように(綺麗じゃないけど。保険)。
Enterprise.pack/php/mtdb.mssqlserver.php で function Insert を定義しなおすのが根本解決なんだろうけどな(メモっとかないとまたハマるからさっ)。
<?php
define( "MT_DIR", 'C:\mt\\' );
define( "TIME_OFFSET", 9 );
// create_entry( 1, 'title', 'text' );
function create_entry( $blog_id, $title, $text ) {
$offset = TIME_OFFSET;
$offset = $offset * 60 * 60;
require_once( MT_DIR . 'php\mt.php' );
try {
$mt = MT::get_instance( $blog_id, MT_DIR . 'mt-config.cgi' );
} catch ( Exception $e ) {
sleep( 1 ); // Retry
$mt = MT::get_instance( $blog_id, MT_DIR . 'mt-config.cgi' );
}
$title = $mt->db()->escape( $title );
$text = $mt->db()->escape( $text );
require_once( MT_DIR . 'php\lib\class.mt_entry.php' );
$sql = 'SET IDENTITY_INSERT mt_entry ON';
$mt->db()->Execute( $sql );
$e = new Entry();
$e->class = 'entry';
$e->blog_id = $blog_id;
$e->author_id = 1;
$e->status = 1;
$e->current_revision = 0;
$e->title = $title;
$e->text = $text;
$ts = gmdate( "Y/m/d H:i:s", time() + $offset );
$e->authored_on = $ts;
$e->modified_on = $ts;
$e->created_on = $ts;
$sql = 'select max(entry_id) from mt_entry';
$res = $mt->db()->Execute( $sql );
$max = $res->_array[0][''];
$max++;
$e->id = $max;
try {
$e->Insert();
} catch ( Exception $e ) {
// $e->getMessage();
$max += 10;
$e->id = $max;
$e->Insert();
}
$sql = 'SET IDENTITY_INSERT mt_entry OFF';
$mt->db()->Execute( $sql );
}
?>
何か最近こんなんばっか...