ホーム > フォーラム > 質問箱 > 複数データベースでユーザ情報を共有

複数データベースでユーザ情報を共有
投稿者: mohi | 投稿日時: 2007/9/6 22:36 | 閲覧: 18662回
mohi
こんにちは。
タイトルの通り、複数のデータベースでユーザ情報を共有できないかと思っています。

当方の環境としては、
サーバはレンタルサーバ(CORE SERVER)を利用しています。
MySQL5.1.20です。

このサーバでは、1つのアカウントでデータベースを複数作成することが可能です。

現在、サブドメインにて複数のXOOPSをそれぞれ設置しています。
サブドメインを使用しないメインのドメインを基準のXOOPSとして、それぞれのサブドメインで設置したXOOPSの間で、データベースはそれぞれの物を利用しますが、その中でユーザ情報だけを共有し、基準のXOOPSで登録したユーザ情報を利用しそれぞれのXOOPSでもログインなどができないかと思っています。

(1)[基準XOOPS] www.ドメイン(DB-0)
(2)├[サブXOOPS-A] sub-a.ドメイン(DB-a)
(3)├[サブXOOPS-B] sub-b.ドメイン(DB-b)
(4)└[サブXOOPS-C] sub-c.ドメイン(DB-c)

のような形で、この場合だと
(1)で登録したユーザ情報を利用して(2)〜(4)のXOOPSにログインをする。
というような形です。
つまり、(2)〜(3)では(1)のユーザ情報を利用します。


XOOPS 複数 ユーザ 共有 などのキーワードで検索してみたところ、1つのデータベース内で複数のXOOPSを利用する場合の方法は、「prefix」を基準となるものに変更すれば出来ると分かったのですが、どうしても複数のデータベースを利用した場合の情報が得られませんでした。

ためしに、prefixを変更して試みましたが、やはりデータベースが違うためにエラーが返されました。
それぞれのデータベースにアクセスできればいいのかなぁ?とも思うのですが・・・よく分かりません。。

XOOPSの設置や運用についてはそれなりのスキルはあります。
しかし、このようなデータベースを跨いだ運用は、したことがありません。

アイディア、アドバイス等、頂ければと思います。

どうぞ、よろしくお願い致します。

コメント(7)

Re: 複数データベースでユーザ情報を共有 
投稿者: mohi | 投稿日時: 2007/9/7 13:31
mohi
追記です。

それから、さらに調べていると
やはり、データベースが異なると色々と難しいようですね。

そこで、1つのデータベース内で複数のXOOPSを利用し、ユーザ情報を共有する方法はいくつか見つけてあったので、さっそく試して見ました。
 http://xoopscube.jp/modules/xhnewbb/viewtopic.php?topic_id=5162&post_id=22068
 http://xoopscube.jp/modules/newbb/viewtopic.php?topic_id=1741&forum=14&post_id=9009

しかし、これらの方法ではうまく動作しませんでした。
これらがXOOPS2の場合だからかな?とは思っているのですが・・・

XOOPS Cube の場合で、このような事が出来ればとりあえずは良いと思うのですが・・・
何か良い方法はりませんでしょうか。

最初の質問と併せてよろしくお願い致します。
Re: 複数データベースでユーザ情報を共有 
投稿者: Ujiki | 投稿日時: 2007/9/30 8:58
Ujiki
mohiさん、こんにちは、参照していただいた記事の投稿者のUjiki.oOです。

引用:
mohiさんは書きました:
しかし、これらの方法ではうまく動作しませんでした。
これらがXOOPS2の場合だからかな?とは思っているのですが・・・

えええ〜、問題ありですか。ガックリ。責任を感じちゃいますねえ〜
何とか問題個所を特定できれば良いのですが。。。 やはり自力でハックする前に、煮詰める努力が必要ですね。反省してます。でも、見渡せていないだけでしょうが、異常な挙動をするんですよね?


引用:
mohiさんは書きました:
XOOPS Cube の場合で、このような事が出来ればとりあえずは良いと思うのですが・・・
何か良い方法はりませんでしょうか。
最初の質問と併せてよろしくお願い致します。

Cubeとありましたので、リセットしてしまったのですが、どうやら、深層心理に焼きついてしまっており、探して投稿しています。
面白いと言うか、オプション機能としてあっても良いように思います。で、ここ質問での投稿で、返答が無いのは、寂しい限りです。XOOPSハッカーなら既に誰かが実施していると思いますが、公開するには危険性があるからでは無いでしょうか。
もちろん、mohiさんは、同じCORESERVERアカウント内で、同じSQLサーバー内で、同じDB内で、異なるユーザー領域での統合化だからセキュリティー上の問題は無いでしょう。

SQLサーバーがlocalhostでは無いWebサーバーってあるわけで、LAN内の公開されていないSQLサーバーなら、漏洩事故は起き難いと思いますが、SQLサーバー名がドメイン名で利用を案内しているWebサーバーがあって、それってインターネット通信してSQLしているのかなって、少し心配になります。まあ、漏洩するって意味では、今のXOOPS2の仕様でも穴はありえますよね。
すると、SSLなSQL接続をサポートしないと、DBの内容が漏洩すると言う話しにまで発展し、XOOPS開発者としては、後回しになるのかも知れないですよね。違うのかな。

mohiさんが目指すような、localhost呼び出しのDBに限定しての、異なるDBユーザー名上でXOOPSユーザーアカウントDBの統合化なら、それは安全であるとして、実装されることを期待したいものです。

折角の素晴らしい提案ですから、mohiさんにお願いしたいこととは、開発者判断となる会議室に、再度、投稿されることを進言いたします。頑張ってプッシュしてみてください。

当方は、XOOPS2旧版安定化バージョンで、暇を見て、実装してみようかと考えています。

【仕様】以下のPHP定数をmainfile.phpに追加することになるのやら?
1.ユーザーアカウント専用MySQLホスト名の新設
2.DBのSSLコネクションのON/OFF。ONならドメイン呼び出しを許す
3.localhostなら安全とみなす
4.ユーザーアカウント専用MySQLユーザー名の新設
5.ユーザーアカウント専用MySQLパスワードの新設
6.ユーザーアカウント専用MySQL接頭語の新設

当方としては、localhost指定限定で具現化してみますか。。。
Re: 複数データベースでユーザ情報を共有 
投稿者: Ujiki | 投稿日時: 2007/10/14 3:03
Ujiki
以下は、XOOPS 2.0.16a JPについてのハッキングです。

【行いたい仕様】:

1.prefix_users だけを保存している別のMySQLで一元管理する。

2.どのXOOPSからもユーザーの新規登録と編集を可能とする。

3.XOOPSには、空のprefix_usersだけが存在する。

で、以下のハッキングを行いました。目下の問題は:

※ どのXOOPSのprefix_usersにはユーザー情報が無いので、
 全てのモジュールをチェックして、ハッキングしないと
 ダメみたいです。

? LDAP認証関連記事を目だけは通しましたが、prefix_usersをXOOPSシステム分、それぞれのXOOPSに持たないといけないのでしょうか・・・・・ 何としても、XOOPS用のMySQLとは別のMySQLで、prefix_usersだけを一元管理したいと思います。

? 以下のハッキングでは、usersに関係する$xoopsDBを利用しているPHPスクリプトを、$xoopsUSERSDBに改竄する必要があります。もっと良い手法って無いでしょうか?

     -----

以下の機能を利用したい場合は、どこかで(例えばmainfile.phpからincludeされる新設PHPスクリプトとか) 以下のPHP定数を埋め込みます。但し、インターネット側に開放されたMySQLだとセキュリティー上大問題ですよね!(まあ、インターネット側に開放しているMySQLコネクションって無いですよね)
1.XOOPS_USERSDB_PREFIX
2.XOOPS_USERSDB_HOST
3.XOOPS_USERSDB_USER
4.XOOPS_USERSDB_PASS
5.XOOPS_USERSDB_NAME
6.XOOPS_USERSDB_PCONNECT

     -----

class/database/database.php
/**
*Only for backward compatibility
*
*@deprecated
*/
class Database{
function &getInstance(){
$ret =& XoopsDatabaseFactory::getDatabaseConnection();
return $ret;
}}
class UsersDatabase{
function &getInstance(){
$ret =& XoopsDatabaseFactory::getUsersDatabaseConnection();
return $ret;
}}


class/database/databasefactory.php
/**
*Get a reference to the only instance of database class and connects to DB
*
*if the class has not been instantiated yet,this will also take
*care of that
*
*@static
*@staticvar object The only instance of database class
*@return object Reference to the only instance of database class
*/
function &getDatabaseConnection(){
static $instance;
if(!isset($instance)){
$file = XOOPS_ROOT_PATH.'/class/database/'.XOOPS_DB_TYPE.'database.php';
require_once $file;
if(!defined('XOOPS_DB_PROXY')){
$class = 'Xoops'.ucfirst(XOOPS_DB_TYPE).'DatabaseSafe';
}else{
$class = 'Xoops'.ucfirst(XOOPS_DB_TYPE).'DatabaseProxy';
}
$instance =& new $class();
$instance->setLogger(XoopsLogger::instance());
$instance->setPrefix(XOOPS_DB_PREFIX);
if(!$instance->connect()){
trigger_error("Unable to connect to database",E_USER_ERROR);
}}
return $instance;
}
function &getUsersDatabaseConnection(){
static $instanceUsers;
if(!isset($instanceUsers)){
$file = XOOPS_ROOT_PATH.'/class/database/'.XOOPS_DB_TYPE.'database.php';
require_once $file;
if(!defined('XOOPS_DB_PROXY')){
$class = 'Xoops'.ucfirst(XOOPS_DB_TYPE).'DatabaseSafe';
}else{
$class = 'Xoops'.ucfirst(XOOPS_DB_TYPE).'DatabaseProxy';
}
$instanceUsers =& new $class();
$instanceUsers->setLogger(XoopsLogger::instance());
$instanceUsers->setPrefix(XOOPS_USERSDB_PREFIX);
if(!$instanceUsers->connectUSERS()){
trigger_error("Unable to connect to database",E_USER_ERROR);
}}
return $instanceUsers;
}


class/database/mysqldatabase.php
/**
*connect to the database
*
*@param bool $selectdb select the database now?
*@return bool successful?
*/
function connect($selectdb = true){
if(XOOPS_DB_PCONNECT == 1){
$this->conn = @mysql_pconnect(XOOPS_DB_HOST,XOOPS_DB_USER,XOOPS_DB_PASS);
}else{
$this->conn = @mysql_connect(XOOPS_DB_HOST,XOOPS_DB_USER,XOOPS_DB_PASS);
}
if(!$this->conn){
$this->logger->addQuery('',$this->error(),$this->errno());
return false;
}
if($selectdb != false){
if(!mysql_select_db(XOOPS_DB_NAME)){
$this->logger->addQuery('',$this->error(),$this->errno());
return false;
}}
return true;
}
function connectUSERS($selectdb = true){
if(XOOPS_USERSDB_PCONNECT == 1){
$this->conn = @mysql_pconnect(XOOPS_USERSDB_HOST,XOOPS_USERSDB_USER,XOOPS_USERSDB_PASS);
}else{
$this->conn = @mysql_connect(XOOPS_USERSDB_HOST,XOOPS_USERSDB_USER,XOOPS_USERSDB_PASS);
}
if(!$this->conn){
$this->logger->addQuery('',$this->error(),$this->errno());
return false;
}
if($selectdb != false){
if(!mysql_select_db(XOOPS_USERSDB_NAME)){
$this->logger->addQuery('',$this->error(),$this->errno());
return false;
}}
return true;
}


kernel/member.php
/**
*constructor
*
*/
function XoopsMemberHandler(&$db,&$dbu){
$this->_gHandler =& new XoopsGroupHandler($db);
$this->_uHandler =& new XoopsUserHandler($dbu);
$this->_mHandler =& new XoopsMembershipHandler($db);
}


include/common.php
//#################### Connect to DB #################
require_once XOOPS_ROOT_PATH.'/class/database/databasefactory.php';
if($_SERVER['REQUEST_METHOD'] != 'POST' || !xoops_refcheck(XOOPS_DB_CHKREF)){
define('XOOPS_DB_PROXY',1);
}
$xoopsDB =& XoopsDatabaseFactory::getDatabaseConnection();
if(defined('XOOPS_USERSDB_PREFIX')
&& defined('XOOPS_USERSDB_HOST')
&& defined('XOOPS_USERSDB_USER')
&& defined('XOOPS_USERSDB_PASS')
&& defined('XOOPS_USERSDB_NAME')
&& defined('XOOPS_USERSDB_PCONNECT')
) $xoopsUSERSDB =& XoopsDatabaseFactory::getUsersDatabaseConnection();
else $xoopsUSERSDB = $xoopsDB;


include/functions.php
function &xoops_gethandler($name,$optional = false ){
static $handlers;
$name = strtolower(trim($name));
if(!isset($handlers[$name])){
if( file_exists( $hnd_file = XOOPS_ROOT_PATH.'/kernel/'.$name.'.php' ) ){
require_once $hnd_file;
}
$class = 'Xoops'.ucfirst($name).'Handler';
if(class_exists($class)){
if($class == 'XoopsMemberHandler')
	$handlers[$name] = new $class($GLOBALS['xoopsDB'],$GLOBALS['xoopsUSERSDB']);
else	$handlers[$name] = new $class($GLOBALS['xoopsDB']);
}}
if(!isset($handlers[$name]) && !$optional ){
trigger_error('Class <b>'.$class.'</b> does not exist<br />Handler Name: '.$name,E_USER_ERROR);
}
$ret = false;
if(isset($handlers[$name])){
$ret =& $handlers[$name];
}
return $ret;
}
FederatedテーブルのXOOPS的な作成の方法をご指導願います 
投稿者: Ujiki | 投稿日時: 2007/10/14 15:33
Ujiki
引用:
Ujikiさん書きました:
以下は、XOOPS 2.0.16a JPについてのハッキングです。

【行いたい仕様】:
1.prefix_users だけを保存している別のMySQLで一元管理する。
2.どのXOOPSからもユーザーの新規登録と編集を可能とする。
3.XOOPSには、空のprefix_usersだけが存在する。
で、以下のハッキングを行いました。目下の問題は:

? 以下のハッキングでは、usersに関係する$xoopsDBを利用しているPHPスクリプトを、$xoopsUSERSDBに改竄する必要があります。もっと良い手法って無いでしょうか?


※ Federatedテーブルで方向が見付かりましたので削除しました。 2007/10/14 17:11 JST
MySQLのSQL文の実行時に、JOIN内での異なるDB接続で、そうは簡単にハードルを越えれない現状です。
SELECT f.*,u.uname,u.uid,p.topic_id,p.post_time,p.subject,p.icon,u2t.u2t_time
 FROM xoops_getsu.tiipf_xhnewbb_forums f
 LEFT JOIN xoops_getsu.tiipf_xhnewbb_posts p ON p.post_id = f.forum_last_post_id
 LEFT JOIN xoops.abnxz_users u ON u.uid = p.uid
 LEFT JOIN xoops_getsu.tiipf_xhnewbb_users2topics u2t ON u2t.topic_id = p.topic_id AND u2t.uid = 1 WHERE 1

Error


forumモジュールのPHPスクリプトのハッキングに着手しましたが・・・・どうやら7つのPHPファイルの改竄が必要です。
$xoopsDBを$xoopsUSERSDBに変更するだけでなく、DB名の挿入とか、色々、作業が必要ですね。

そこで、MySQL4では実装されていませんが、SELECT関連のJOINで利用する目的で、Federatedテーブルを生成させて、あたかも自分のDB内にprefix_usersが存在するかのような改訂がベターかなと思えてきました。解釈が間違ってるのかも・・・

何か、諸問題があるでしょうか?

デメリットは「MySQL4系など古いMySQLでは利用できないXOOPS」となることですね。

まあ、今現状のハッキングで、ユーザーの新規登録、プロフィールの編集には問題ありませんので、$xoopsUSERSDBは残しておこうと考慮中です。
Federatedテーブルの置換ですか。 Re: 複数データベースでユーザ情報を共有 
投稿者: Ujiki | 投稿日時: 2007/10/14 16:51
Ujiki
 
※ 2007/10/16 13:00 JST 機能の不理解により「接頭語に関して」以下本文内訂正しました。

引用:
mohiさんは書きました:
タイトルの通り、複数のデータベースでユーザ情報を共有できないかと思っています。

当方の環境としては、
サーバはレンタルサーバ(CORE SERVER)を利用しています。
MySQL5.1.20です。

現在、サブドメインにて複数のXOOPSをそれぞれ設置しています。
サブドメインを使用しないメインのドメインを基準のXOOPSとして、それぞれのサブドメインで設置したXOOPSの間で、データベースはそれぞれの物を利用しますが、その中でユーザ情報だけを共有し、基準のXOOPSで登録したユーザ情報を利用しそれぞれのXOOPSでもログインなどができないかと思っています。

(1)[基準XOOPS] www.ドメイン(DB-0)
(2)├[サブXOOPS-A] sub-a.ドメイン(DB-a)
(3)├[サブXOOPS-B] sub-b.ドメイン(DB-b)
(4)└[サブXOOPS-C] sub-c.ドメイン(DB-c)

のような形で、この場合だと
(1)で登録したユーザ情報を利用して(2)〜(4)のXOOPSにログインをする。
というような形です。
つまり、(2)〜(3)では(1)のユーザ情報を利用します。


当方は2種類のCORESERVERでXOOPSを稼動していますが、以下の手順でFederatedテーブルの作成に成功しています。
但しバージョンが何故か異なりますね。MySQL 5.1.22-rc の模様です。
以下は一応 MySQL 5.1.22-rc に限定しておきます。

Federatedテーブルの作成を、
(2)├[サブXOOPS-A] sub-a.ドメイン(DB-a)
(3)├[サブXOOPS-B] sub-b.ドメイン(DB-b)
(4)└[サブXOOPS-C] sub-c.ドメイン(DB-c)
で行いますか。

具体例を考えてみましょう。
1.(1)[基準XOOPS] www.ドメイン(DB-0)のMySQLテーブルが以下のとおりとします。
 接頭語(XOOPS_DB_PREFIX): abcd
 ホスト名(XOOPS_DB_HOST): localhost
 DBユーザー名(XOOPS_DB_USER): user0
 DBパスワード(XOOPS_DB_PASS): passwd0
 DB名(XOOPS_DB_NAME) : dbname0

2.XOOPSをインストールします。すると「 abcd_users 」でユーザー管理が開始されます。どんどんユーザーを追加しますか。

3.後の異なるDBでXOOPSを新規にインストールします。
 (2)├[サブXOOPS-A] sub-a.ドメイン(DB-a)
 (3)├[サブXOOPS-B] sub-b.ドメイン(DB-b)
 (4)└[サブXOOPS-C] sub-c.ドメイン(DB-c)
 ※ 2007/10/16 13:00 JST 機能の不理解により訂正しました。
 ※ このときに、必ず接頭語(XOOPS_DB_PREFIX)を同じにします。 接頭語は自由に設定していて大丈夫です。(筆者はセキュリティーを優先して全て異なる接頭語にしています。上書き事故も怖いですから)

4.さて、それぞれで作成した「 (prefix)_users 」を消します。(事前DBバックアップは必須作業ですね) 消すのが嫌ならテーブル名をリネームしてください。時間が経過しますと混乱しますよね。やっぱり消しますか。 消すのは、
 (2)├[サブXOOPS-A] sub-a.ドメイン(DB-a)
 (3)├[サブXOOPS-B] sub-b.ドメイン(DB-b)
 (4)└[サブXOOPS-C] sub-c.ドメイン(DB-c)
 ですよ。これで、上記3つのXOOPSにはユーザーテーブルが無いことになります。

5.(1)[基準XOOPS] www.ドメイン(DB-0)のテーブルを模倣して、Federatedテーブルの作成をphpMyAdminのSQLで実行します。実行するのは
 (2)├[サブXOOPS-A] sub-a.ドメイン(DB-a)
 (3)├[サブXOOPS-B] sub-b.ドメイン(DB-b)
 (4)└[サブXOOPS-C] sub-c.ドメイン(DB-c)
 ですよ〜。
 ※ 実行する前に、バックアップは必須。SQLにミスしますと、全テーブルが隠れてしまうというトラブルに見舞われます。ミスにより作成したFederatedテーブルをDROPすれば正常になるのですが、最悪はDBを全削除して、DBを新規に生成し、インポートして再挑戦してください。だから事前のDBバックアップが必須なんですよね。

 ※ SQLは以下の通りです。ここでは例として、接頭語に「 vwxy 」を採用したXOOPSと仮定します。
-- phpMyAdmin SQL Dump
-- version 2.10.1
-- http://www.phpmyadmin.net
-- 
-- ホスト: localhost
-- 生成時間: 2007 年 10 月 14 日 15:58
-- サーバのバージョン: 5.1.22
-- PHP のバージョン: 5.2.4

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";

-- 
-- データベース: `user0`
-- 

-- --------------------------------------------------------

-- 
-- テーブルの構造 `abcd_users`
-- 
-- 作成日時: 2007 年 10 月 14 日 13:15
-- 最終更新: 2007 年 10 月 14 日 13:31
-- 

DROP TABLE IF EXISTS `vwxy_users`;
CREATE TABLE IF NOT EXISTS `vwxy_users` (
  `uid` mediumint(8) unsigned NOT NULL,
  `name` varchar(60) NOT NULL DEFAULT '',
  `uname` varchar(25) NOT NULL DEFAULT '',
  `email` varchar(60) NOT NULL DEFAULT '',
  `url` varchar(100) NOT NULL DEFAULT '',
  `user_avatar` varchar(30) NOT NULL DEFAULT 'blank.gif',
  `user_regdate` int(10) unsigned NOT NULL DEFAULT '0',
  `user_icq` varchar(15) NOT NULL DEFAULT '',
  `user_from` varchar(100) NOT NULL DEFAULT '',
  `user_sig` tinytext NOT NULL,
  `user_viewemail` tinyint(1) unsigned NOT NULL DEFAULT '0',
  `actkey` varchar(8) NOT NULL DEFAULT '',
  `user_aim` varchar(18) NOT NULL DEFAULT '',
  `user_yim` varchar(100) NOT NULL DEFAULT '',
  `user_msnm` varchar(100) NOT NULL DEFAULT '',
  `pass` varchar(32) NOT NULL DEFAULT '',
  `posts` mediumint(8) unsigned NOT NULL DEFAULT '0',
  `attachsig` tinyint(1) unsigned NOT NULL DEFAULT '0',
  `rank` smallint(5) unsigned NOT NULL DEFAULT '0',
  `level` tinyint(3) unsigned NOT NULL DEFAULT '1',
  `theme` varchar(100) NOT NULL DEFAULT '',
  `timezone_offset` float(3,1) NOT NULL DEFAULT '9.0',
  `last_login` int(10) unsigned NOT NULL DEFAULT '0',
  `umode` varchar(10) NOT NULL DEFAULT '',
  `uorder` tinyint(1) unsigned NOT NULL DEFAULT '0',
  `notify_method` tinyint(1) NOT NULL DEFAULT '1',
  `notify_mode` tinyint(1) NOT NULL DEFAULT '0',
  `user_occ` varchar(100) NOT NULL DEFAULT '',
  `bio` tinytext NOT NULL,
  `user_intrest` varchar(150) NOT NULL DEFAULT '',
  `user_mailok` tinyint(1) unsigned NOT NULL DEFAULT '1',
  `maillanguage` varchar(2) NOT NULL DEFAULT 'ja',
  `mailencode` varchar(10) NOT NULL DEFAULT 'Japanese',
  `lock` tinyint(1) NOT NULL DEFAULT '0'
) ENGINE=FEDERATED CONNECTION='mysql://user0:passwd0@localhost/dbname0/abcd_users' DEFAULT CHARSET=utf8 ;


フィールド数、フィールド名、フィールドのパラメーターが同じでないと、エラーとなりますので、SQLのTABLEの構造は、phpMyAdminのテーブル「 abcd_users 」(例)から、エキスポートして差し替えてください。
全てのフィールドが合致すればよいので、key指定を抜き、key生成関連を消しますか。
それと例示は「 utf8 」ですが、これも異なるなら差し替えてください。

エラー無く、Federatedテーブルの作成が完了できれば、phpMyAdminでも確認できますね。
接頭語が同じなら異なっても、通常のXOOPSのままで済みそうですね。既に稼動中でも、それぞれのユーザーアカウントを1つに融合できるのなら・・・・簡単に統合化できますが、標準のXOOPSですと、それぞれのユーザーIDが「2」からインクリメンタルに決まってしまうので、統合化は困難ですね。ユーザーIDを一機に全てのモジュールを含めて自動的にシフトするユーティリティーがあれば良いですよね。

※ 但し、マスターが壊れると、全てのXOOPSでログインできなくなりますよね。夜間の自動バックアップは必須ですね。文献で「Federatedテーブルを応用して、リアルタイムなマスター/スレーブ化を行う」レポートがありましたが、これはこれで便利ですが、危険ですね。リアルタイムなミラーリングで安心しないで、夜間にでも必ずバックアップを行いますか。
XREAで完璧XOOPS その7 / 完全無人で全自動によるMySQLのバックアップとXOOPSのミラーリングをサーバー機を越えて行いましょうか 」で、安全圏に移行してみてください。

参考URL:[ThinkIT] 第5回:Federatedエンジン (1/3)
やってみたら簡単でした。Re: FederatedテーブルのXOOPS的な作成の方法をご指導願います 
投稿者: Ujiki | 投稿日時: 2007/10/14 17:09
Ujiki
Federatedテーブルを作成することによって、問題は解決しました。

まあ、せっかくのハッキングですので、
「ユーザー新規登録」「プロフィール編集」「ユーザー削除」などは、このままハッキングしたまま利用して、
モジュール関連は、特にJOINTで参照する場合は、Federatedテーブルを参照すると言う、2本立てで試行してみます。

まあ、結論としては、XOOPS標準のまま、prefix_usersの異なる接頭語対応を施して、Federatedテーブルで行くのが正攻法なのでしょうね。
これなら自由にprefix_users以外の統合化も必要となれば簡単ですね。
裏技(?)発見しちゃいました Re: やってみたら簡単でした。Re: FederatedテーブルのXOOPS的な作成の方法をご指導願います 
投稿者: Ujiki | 投稿日時: 2007/10/16 9:09
Ujiki
引用:
Ujikiさん書きました:
Federatedテーブルを作成することによって、問題は解決しました。

まあ、せっかくのハッキングですので、
「ユーザー新規登録」「プロフィール編集」「ユーザー削除」などは、このままハッキングしたまま利用して、
モジュール関連は、特にJOINTで参照する場合は、Federatedテーブルを参照すると言う、2本立てで試行してみます。


Federatedテーブルを作成した後に、呼び出し先リモート側のMySQLのテーブルの構造に手を加えると、Federatedテーブルで交信するローカル側のMySQLでは、エラー表示無く、書き込みが不能となりますね。これってMySQLの改訂作業の過渡期の仕様なのでしょうか。

この特性を利用すれば、リモート側のMySQLを「リードオンリー」のように利用できますか。ある意味「安全」になりますね。例えばリモート側のテーブルに、1ビットの新規フィールドでも追加すれば「リードオンリー」となる、そして追加したフィールドを削除すれば「RW」に戻る。

MySQL本体のバージョンアップによって、異なる挙動を示すのでしょうかね

    投票(0)

    新しいものから | 古いものから | RSS feed
     
    To Top