创建PostgreSQL ROLE(user)(如果不存在)
技术问答
312 人阅读
|
0 人回复
|
2023-09-14
|
如何编写SQL脚本以在PostgreSQL 9.1中创建ROLE,但如果已经存在则不引发错误?
" Y+ @7 I2 f, w! ^( A当前脚本仅具有:
8 z/ e; C. u* E* f2 o, S- KCREATE ROLE my_user LOGIN PASSWORD 'my_password';
# H7 w3 @8 O4 u% }$ c$ D$ |& u7 P7 a* w
如果用户已经存在,则此操作将失败。我想要类似的东西:
0 Q. k5 t5 }; Q9 YIF NOT EXISTS (SELECT * FROM pg_user WHERE username = 'my_user')" o$ C0 ]5 m/ Y. O6 @4 z
BEGIN" I5 P- m- W/ e0 E
CREATE ROLE my_user LOGIN PASSWORD 'my_password';
! J% d( x0 \1 |, i, tEND;0 @3 {$ u0 [ L& a; Z5 B
2 P/ i d0 W. p% N y8 i…但是那行不通-IF普通的SQL似乎不支持该功能。% o9 O) F8 O8 ?& h8 ~5 a
我有一个批处理文件,它创建了PostgreSQL 9.1数据库,角色和其他一些东西。它调用psql.exe,并传入要运行的SQL脚本的名称。到目前为止,所有这些脚本都是纯SQL,如果可能的话,我想避免使用PL / pgSQL等。) T$ k3 H* _# K; l3 w/ u& U% Z
: ^" l* k& f( F5 \6 V解决方案:7 }& ` y5 C7 y2 b; }! h& z, T& {
" O! a6 \) C7 v, p& P) m2 g
4 K! Z" k3 G8 d3 {/ P9 _9 S& {/ o
以与您所想到的类似的方式进行简化:0 C+ j5 i6 Y7 U4 R* D: k
DO
) q* ^, ], [! K' d0 b% S3 B6 S$do$
5 p+ A5 m3 T7 x/ |; t( sBEGIN2 b; {% B5 F: `; M8 u% H" }
IF NOT EXISTS (
n$ }/ y6 }7 m% } SELECT FROM pg_catalog.pg_roles -- SELECT list can be empty for this1 T5 |! K8 D9 P n$ ~6 Z& q! q
WHERE rolname = 'my_user') THEN
+ q* S/ }; f; G% j/ c CREATE ROLE my_user LOGIN PASSWORD 'my_password';
0 Y% ~% E$ | O9 e END IF;. p& N! \3 F9 _9 |4 S) R
END* }" u! |! g# w9 F) O
$do$;' n; o4 {3 R. S% `! j
4 U' T8 F: c' b例如,与之不同的CREATE TABLE是,没有IF NOT EXISTSfor子句CREATE ROLE(至少第12页)。而且,您无法在普通SQL中执行动态DDL语句。
& k9 |4 N, J% M: {您无法“避免PL / pgSQL”的请求,除非使用另一个PL。该DO语句使用plpgsql作为默认过程语言。该语法允许省略显式声明:
% `$ K0 S- ~0 v6 Z1 ]3 k3 O: KDO [ LANGUAGE lang_name ] code9 y% c' ~% T7 ]+ }4 q8 ?
9 F5 m* B2 r) `; X- M# F( C) j… 编写代码所用的过程语言的名称。如果省略,则默认值为。
, p2 w# T5 H4 W0 e% ~; ~lang_name
- J! }8 F% {4 u8 f3 d& A; ^plpgsql |
|
|
|
|
|