在PostgreSQL 9.1 中,使用CREATE ROLE my_user LOGIN 等簡單腳本建立不存在的ROLE如果使用者已存在,則PWLOGINORDORD 'my_password' 可能會失敗。為了避免這個錯誤,需要更複雜的方法。
一個有效的解決方案是在PL/pgSQL 等過程語言中使用DO 語句:
DO $do$ BEGIN IF EXISTS ( SELECT FROM pg_catalog.pg_roles WHERE rolname = 'my_user') THEN RAISE NOTICE 'Role "my_user" already exists. Skipping.'; ELSE CREATE ROLE my_user LOGIN PASSWORD 'my_password'; END IF; END $do$;
此腳本使用EXISTS 語句檢查角色是否已存在。如果是,則會發出通知並跳過建立。否則,將創建角色。
對於高爭用工作負載,可以透過在巢狀區塊中嵌套CREATE ROLE 語句來進行進一步最佳化:
DO $do$ BEGIN IF EXISTS ( SELECT FROM pg_catalog.pg_roles WHERE rolname = 'my_user') THEN RAISE NOTICE 'Role "my_user" already exists. Skipping.'; ELSE BEGIN -- nested block CREATE ROLE my_user LOGIN PASSWORD 'my_password'; EXCEPTION WHEN duplicate_object THEN RAISE NOTICE 'Role "my_user" was just created by a concurrent transaction. Skipping.'; END; END IF; END $do$;
此巢狀區塊確保僅在不太可能發生的競爭條件發生時才建立角色。這顯著降低了與引發和捕獲異常相關的效能開銷。
以上是如果 PostgreSQL 角色尚不存在,如何安全地建立它?的詳細內容。更多資訊請關注PHP中文網其他相關文章!