ユーザー情報を既存のデータベースから vbulletin データベースに転送するために使用したプロセスを変更しました。MySQL コマンド ライン クライアントから入力されたデータベース クエリを使用するため、PHP 処理は必要ありません。
これは、概説したシナリオで機能します。つまり、既存のデータベースのパスワードが を使用して保存されているということですmd5(password)
。
両方のデータベースが同じサーバー、vBulletin 4.x 上にあります。
3 つのストアド ファンクションが作成されます。
vbulletin.userTitle() // Convert user type from current db to a user title
vbulletin.groupId() // Convert current user type into permission group ID
vbulletin.randomSalt() // Create salt using same approach as used by vbulletin
MySQL クライアントからログインします。
mysql --user=xxx -p vbulletin
ストアド関数を作成します。
delimiter //
CREATE FUNCTION vbulletin.userTitle(mtype VARCHAR(255))
RETURNS CHAR(250)
NO SQL
BEGIN
DECLARE userTypeTitle CHAR(250) DEFAULT "";
CASE mtype
WHEN 'user' THEN SET userTypeTitle = 'Member';
WHEN 'admin' THEN SET userTypeTitle = 'Administrator';
WHEN 'moderator' THEN SET userTypeTitle = 'Regional Moderator';
ELSE
SET userTypeTitle = 'Member';
END CASE;
RETURN userTypeTitle;
END//
CREATE FUNCTION vbulletin.groupId(mtype VARCHAR(255))
RETURNS smallint(5)
NO SQL
BEGIN
DECLARE groupTypeId smallint(5) DEFAULT 0;
CASE mtype
WHEN 'user' THEN SET groupTypeId = 2;
WHEN 'admin' THEN SET groupTypeId = 6;
WHEN 'moderator' THEN SET groupTypeId = 11;
ELSE
SET groupTypeId = 12;
END CASE;
RETURN groupTypeId;
END//
CREATE FUNCTION vbulletin.randomSalt()
RETURNS CHAR(30)
READS SQL DATA
BEGIN
DECLARE count INT DEFAULT 0;
DECLARE rn1 CHAR;
DECLARE saltout VARCHAR(30) DEFAULT "";
WHILE count<30 DO
SET count = count+1;
SET rn1 = CHAR(FLOOR(33 + (RAND() * 93)));
SELECT CONCAT(saltout, rn1) INTO saltout;
END WHILE;
RETURN saltout;
END//
delimiter ;
ユーザー情報を移行する前に、データベースをバックアップしてください。
vbulletin データベースには、セットアップおよびテスト中に使用されるすべての情報が含まれているため、更新する 3 つのテーブルを空にします。
TRUNCATE `vbulletin`.`user`;
TRUNCATE `vbulletin`.`userfield`;
TRUNCATE `vbulletin`.`usertextfield`;
次のクエリを変更して、既存のデータベースとその関連フィールドを使用します。
メイン ユーザー テーブルに入力します。
ソルトは、既存のユーザー テーブルの各行に対して格納された関数を介して生成されます。
既存のデータベースからハッシュ化されたパスワードは、次のように vbulletin データベースに挿入されるときにソルトでハッシュ化されます。
MD5(current_hashed_password + new_salt)
主なクエリ:
INSERT INTO `vbulletin`.`user` (
`userid`, `username`, `salt`, `password`, `email`, `passworddate`, `styleid`, `showvbcode`, `joindate`, `lastvisit`, `lastactivity`, `reputationlevelid`, `timezoneoffset`, `usergroupid`, `usertitle`
)
SELECT
`current_userid`, `current_username`, vbulletin.randomSalt() as new_salt, MD5(current_hashed_password + new_salt), `current_email`, CURDATE(), 5, 2, UNIX_TIMESTAMP(), UNIX_TIMESTAMP(), UNIX_TIMESTAMP(), 5, 0, vbulletin.groupId(current_type), vbulletin.userTitle(current_type)
from `current_database`.`user`;
次のクエリは、各ユーザーの既定のエントリを追加します。
カスタマイズされたプロファイル フィールドを追加した場合は、その情報を userfield テーブルに転送します。
INSERT INTO `vbulletin`.`userfield` (
`userid`, `field5`, `field6`
)
SELECT
`current_userid`, `firstname`, `lastname`
from `current_database`.`user`;
INSERT INTO `vbulletin`.`usertextfield` (
`userid`
)
SELECT `current_userid`
from `current_database`.`user`;
管理者グループ ユーザーの評価レベルを設定します。
UPDATE `vbulletin`.`user` SET `reputationlevelid` = 1 WHERE `usergroupid` = 6;
保存された関数を削除します。それらは再び使用されません。
DROP FUNCTION vbulletin.userTitle;
DROP FUNCTION vbulletin.groupId;
DROP FUNCTION vbulletin.randomSalt;