Tag: database

Truncate all tables in Oracle database

Posted by – November 17, 2015

今天開發團隊終於決定要把開發與測試用的 Oracle 資料庫清空重建了。在長達一年多的開發時間裡,這台測試 DB 是非常重要的開發工具。但長久以來承受了各式各樣亂七八糟的資料,也難以保證測試結果是否符合預期,所以大夥決定將它清空。

不過 Oracle 自己的 GUI 管理工具 SQL Developer 真是頗為難用。
Oracle SQL Developer

想一次清空 (truncate) 是沒有全選 -> 右鍵 -> 清空 這麼方便的事。但是近百個 table 又不想一個一個清... 就下指令吧。

begin
  for t in (select table_name from user_tables)
    loop
      execute immediate ' truncate table  '||t.table_name;
    end loop;
end;

這樣完成清除資料表的任務。

Laravel Eloquent – Encrypt/Decrypt Data on call

Posted by – November 3, 2014

在開發商業網站的時候,對資料加密是必要的手段,尤其是資料庫中關於會員隱私,或是商業機密的部份都要特別處理。

在實務上通常不會用資料庫內建的加密功能,而是用後端語言來實現 encrypt 與 decrypt,資料庫只儲存加密後的訊息。

在 Laravel 裡加解密可以透過繼承 Eloquent,用 magic function 來達成自動化。

class BaseModel extends Eloquent {

    protected $encrypt = [];

    public function setAttribute($key, $value)
    {
        if (in_array($key, $this->encrypt))
        {
            $value = Crypt::encrypt($value);
        }

        return parent::setAttribute($key, $value);
    }

    public function getAttribute($key)
    {
        if (in_array($key, $this->encrypt))
        {
            return Crypt::decrypt($this->attributes[$key]);
        }

        return parent::getAttribute($key);
    }

    public function attributesToArray()
    {
        $attributes = parent::attributesToArray();

        foreach ($attributes as $key => $value)
        {
            if (in_array($key, $this->encrypt))
            {
                $attributes[$key] = Crypt::decrypt($value);
            }
        }

        return $attributes;
    }

而需要用到加解密的 Model 改繼承 BaseModel,並將需要加密的欄位寫在 $encrypt 陣列中即可。

需要搜尋加密欄位的時候,可以參考以下作法...

$match = User::all()->filter(function($record) use($email) {
            $field = $record->email['email'];

            if(Crypt::decrypt($field) == $email) return $record;
         });

這個作法會 scan table,效率應該會很糟。但 Laravel 預設的加密方式會自動加鹽,相同的明文配相同的金鑰也會產出不一樣的密文,暫時只想到這種解決。

for($i = 1; $i <= 10; $i++)
{
    // 會得到十種結果
    echo "\n". Crypt::encrypt('secret');
}

先醬,想到再補充。

MySQL: 限制存取單一資料庫

Posted by – April 16, 2012

從客戶那邊拿到一份巨大的資料庫備份,解壓縮後的 .sql 文字檔接近  1GB。由於檔案很大,想要編輯或檢視內容都很不方便,就想說直接匯進測試用的資料庫。用了 source 指令後成功地匯入了,當下看起來也很正常。不過後來只要重開測試主機就會出現完全連不上資料庫的情況,而且屢試不爽,推測大概是客戶連同紀錄資料庫自身狀態的 information_schema 也一併匯出了。

問了客戶的工程師才知道他們匯入時會加指令來限制匯到哪個資料庫。語法如下:

mysql -u USERNAME -p PASSWORD --force --one-database DATABASE

登入 mysql 後再使用 source 匯入,此時若是碰到操作非指定 DB 的 statements 都會被自動略過。

總算順利搞定資料庫,繼續開發工作。又學到了一課。

後來去翻閱 MySQL 官方文件,其實只要加個 -o 就可以了,參考這篇