MathJax

MathJax-2

MathJax-3

Google Code Prettify

置頂入手筆記

EnterproseDB Quickstart — 快速入門筆記

由於考慮採用 EnterpriseDB 或是直接用 PostgreSQL 的人,通常需要一些入手的資料。這邊紀錄便提供相關快速上手的簡單筆記 ~ 這篇筆記以 資料庫安裝完畢後的快速使用 為目標,基本紀錄登入使用的範例:

2017年11月20日 星期一

Oracle MERGE INTO 語法在 Postgres 的改寫方式

在 SQL 語言裡面,資料的輸入(INSERT)和更新(UPDATE)是不一樣的作業,要是對非重複欄位再輸入會發生失敗,整個交易作業都會取消。

所謂的 Upsert 功能用來進行資料衝突判斷,決定資料要新增還是更新,簡單的避開上述困擾。在 Postgres 9.5 之後,引入了 Upsert 功能,INSERT . . . ON CONFLICT DO . . .,可以達成上述功能。PGSQL 的 Upsert 把資料先嘗試以 INSERT 塞入表格,發生衝突時才進行更新或略過資料。

而在 Oracle 資料庫的 Merge 功能,與 Upsert 有一點點小差別:MERGE INTO 是一次以多筆資料塞入表格。資料併入表格的方法以輸入或更新二選一的方式,而非先進行輸入失敗才更新

這裡紀錄 Oracle MERGE INTO 轉換成 PGSQL INSERT ON CONFLICT 的筆記。

2017年11月17日 星期五

PostgreSQL 裡面的時區設定使用筆記

PostgreSQL 的時區,內建預設是 GMT。不過時區會在 initdb 時,根據作業系統設定值決定,然後設定在 $PGDATA/postgesql.conf 裡面的 GUC 參數 timezone 上。而可以設置的時區資訊則紀錄在 pg_timezone_names 這個系統表裡面。

下面在 CentOS 底下,在 OS 和 DB 中,列舉這些資訊出來作比較

2017年11月13日 星期一

LinuX Container on Slackware 14.2 練習筆記 - 建立 Container

這一陣子,Docker Container 很紅,好像是因為比起跑 Virtual Machine 吃的資源更少一些。又聽說 Docker 原先是 Linux Container 衍生的。再聽說後來 Docker 不只支援 Liunx Container(看到好像主要有 libcontainer, LXC, OpenVZ, systemd-nspawn, libvirt-lxc, libvirt-sandbox, qemu/kvm, BSD Jails, Solaris Zones, chroot 這一堆詞)。所以跟跟風,也來看看怎麼用 Container~
Container 功能,我最先知道的就是 Linux Container(LXC)。目前對 LXC的認識不多,我目前假裝理解成是 chroot 的衍生物,Docker 前驅物。
以前曾經用過 chroot 把 MBR 被蓋掉的 Slackware Linux 給弄回來,大概知道 chroot 的用途。
現在練習一下 Linux Container,操作後的感想:有一點把 Linux Container 當成是 chroot 來看待。

2017年10月23日 星期一

在 PostgreSQL 9.6 裡面實作 Autonomous Transaction

所謂 Autonomous Transaction,指的是在一個資料庫的交易(Transaction)中,能夠再「分支」出另外一個獨立的交易。

這和子交易(Sub-Transaction)是不同的概念:子交易和上層的交易是巢狀的概念,仍然是單一個工作程序,在子交易中發生 Rollback,就對整個交易都會 Rollback;而 Autonomous Transaction 則是在呼叫之時,額外分支出另外一個交易執行,分之出去的交易活動成敗(Commit/Rollback)不會再影響目前的交易,兩者獨立開來。

在 Oracle 的 Stored Procedure 中,有一個 PRAGMA AUTONOMOUS_TRANSACTION 的修飾字,讓一個函數的運行,額外分支出一個交易。

不過到 Postgres 9.6 為止,都沒有「直接」支援這樣的功能,那在 Postgres 9.6 要如何做到呢?

2017年10月6日 星期五

找出 PGSQL 資料庫裡面,隱含被移除欄位的表格

在 Postgres 資料庫裡面,表格欄位沒有被其他表格或是 View 參照(相依)的話,可以直接用 ALTER TABLE 作欄位的異動。(有被參照的話,需要先解除這些 Regerence 才能動作)
有時候,可能有移除欄位的需要。但是移除欄位時,明明有這多的資料,移除欄位怎麼快速會完成?

2017年9月19日 星期二

在 Postgres 透過 SET ROLE 實現類似 sudoer 的功能

Postgres 裡面的有絕對控制權的帳戶權限叫做 Superuser。一般在 Postgres 預設狀況下,除非特別指定,執行 initdb 的作業系統帳戶會擁有因此產生的 Postgres 資料庫服務(Postgres instance),並且預設資料庫內的同名帳戶是資料庫的 Superuser。

不過通常都以預設的配置,產生出以 postgres(企業版為 enterprisedb)為 Superuser 的資料庫服務。

除了預設的 Superuser 帳戶之外,Superuser 的權限也可以手動賦予其他新的資料庫帳戶。

更進一步,甚至可以類似 Linux 底下的 sudo 功能,使一個一般帳戶加入一個「Superuser 群組」:平常這些帳戶不能執行 Superuser 權限的動作;但在必要時,便能類似 sudo 一樣,切換身份,暫時成為 Superuser。

那要怎麼設定呢?

2017年9月15日 星期五

一個 PL/R 的使用範例 — 產生樞紐表

其實,在 PostgreSQL 產生樞紐表已經有一個模組 tablefunc,之前也有紀錄一篇筆記。不過聽說 tablefunc 的 crosstab() 在資料量「太大」的時候,會很耗記憶體用量. . . 有多麼嚴重,我也沒東西可以試驗,就留給有實際應用的人,使用後製作使用心得了。
在這裡是藉著這個功能,來了解 R 語言嵌入 PostgreSQL 作為 Stored Procedure 的用法的筆記~
對了,這個 R 語言的 Procedural Language 外掛叫做 PL/R