2012-07-09 14 views
6

2つのデータベース接続があります.1つはアプリケーションデータのほとんどに使用され、もう1つは読み取り専用です。Yiiデータベース接続を読み取り専用に制限する

私は自分のデータベースユーザーアカウントで読み取りのみを許可することができますが、このシステムを管理する他のユーザーがいます。アプリケーションレベルでいくつかの冗長性を持たせて、Yiiの標準ActiveRecordクラスを使用して、

フォーラムでこの情報を見つけましたが、誰かがこれが良いアプローチであることを確認したり、別の方法を提案したりすることができるかどうか疑問に思っていました。

public function onBeforeSave($event) 
{ 
    $this->db = Yii::app()->masterDb; 
} 

public function onAfterSave($event) 
{ 
    $this->db = Yii::app()->db; 
} 

http://www.yiiframework.com/forum/index.php/topic/5712-active-record-save-to-different-server-load-balancefail-over-setup/

+2

個別のDBユーザーを使用することは、賢明な方法です。 –

+1

@tereško...と完全に保証する唯一の方法は、将来のコードがこの "慣習"を破ることはない... – Ron

+0

私は読書DBユーザーが最も優雅な解決策であることに同意するが、私は人々を信頼しないので、システムを管理する100% –

答えて

4

になると思う。 http://www.yiiframework.com/extension/dbreadwritesplitting

あなたがしている場合、私はおそらく、その最初に見てねARモデルがたくさんありました。もう一つの選択肢として、(フォーラムのフォーラムで提案されているような)行動ルートを使うことができます。

あなたが何をしても、onBeforeSave/onAfterSaveの代わりにbeforeSave/afterSaveをオーバーライドしたいと思っています。これらのメソッドは、独自の特別なコードを実行するだけでなく、イベントをトリガーするためのメソッドです。また、another one of the forum postsごとに、静的呼び出しを使用してAR db変数を設定する必要があります。だから、セルゲイのコードは実際には次のようになります。

あなたのスレーブがマスタで更新することができないシナリオを考える
class MyActiveRecord extends CActiveRecord 
{ 
    ... 
    public function beforeSave() 
    { 
     // set write DB 
     self::$db = Yii::app()->masterDb; 

     return parent::beforeSave(); 
    } 

    public function afterSave() 
    { 
     // set read db 
     self::$db = Yii::app()->db; 

     return parent::beforeSave(); 
    } 
    ... 
} 


class User extends MyActiveRecord {} 
class Post extends MyActiveRecord {} 
... 
+0

その拡張機能はかなり気が利いています。もう少し詳しくお読みください。 –

2
class MyActiveRecord extends CActiveRecord 
{ 
... 
public function onBeforeSave($event) 
{ 
    // set write DB 
    $this->db = Yii::app()->masterDb; 
} 

public function onAfterSave($event) 
{ 
    // set read db 
    $this->db = Yii::app()->db; 
} 
... 
} 


class User extends MyActiveRecord {} 
class Post extends MyActiveRecord {} 
... 

Uは、その方法を試してみて:)しかし、私見では十分ではありません。私はあなたのためにこれを扱う拡張があります、あなたはYiiのフォーラムに提供されるリンク毎のいくつかのバグや欠陥

+0

私はこの問題を見ている誰かの将来の参考のために、私の投稿から除外したこの解決策の部分を入れていただきありがとうございます。どのような種類のバグや欠陥がありますか? –

+0

@JohnZ、acorncomさんは 'onBeforeSave/onAfterSave。これらのメソッドは、独自の特殊コードを実行するだけでなく、イベントをトリガするためのメソッドです。それは私のことです。 – Sergey

2

、問題が発生した可能性があります。 データを更新した後、古いバージョンから読み込むことができます。

フォーラムの所与のアプローチは、非常にきれいで、主にYiiウィザードである作者によって書かれていますが。私には別の選択肢もあります。

public function getDbConnection(){ 
    if (Yii::app()->user->hasEditedData()) { # you've got to write something like this(!) 
    return Yii::app()->masterDb; 
    } else { 
    return Yii::app()->db; 
    } 
} 

のように、getDbConnection()メソッドをオーバーライドすることができます。ただし、データベース接続を切り替えるときは注意が必要です。

関連する問題