创建PostgreSQL ROLE(user)(如果不存在)
技术问答
417 人阅读
|
0 人回复
|
2023-09-14
|
如何编写SQL脚本以在PostgreSQL 9.1中创建ROLE,但如果已经存在则不引发错误?8 L+ |& x7 S: F8 C9 Q5 A- L
当前脚本仅具有:; m4 Z4 j/ B/ h
CREATE ROLE my_user LOGIN PASSWORD 'my_password';% a& Q7 _( ?5 G3 ~
1 _; v# M# Y! K7 e
如果用户已经存在,则此操作将失败。我想要类似的东西: N1 @; D; x! I8 P. \# j
IF NOT EXISTS (SELECT * FROM pg_user WHERE username = 'my_user')
4 R. [4 A9 ^0 O* mBEGIN& i- t4 q9 f7 A; t% I& O: b
CREATE ROLE my_user LOGIN PASSWORD 'my_password';
( R; h9 E! R( a0 V/ r. g; VEND;' Z! U5 y+ z! l$ a* T1 |+ b1 m
8 @* F/ D5 }5 \2 M4 I
…但是那行不通-IF普通的SQL似乎不支持该功能。
/ w k6 G. N. X- r3 x0 S4 b& J我有一个批处理文件,它创建了PostgreSQL 9.1数据库,角色和其他一些东西。它调用psql.exe,并传入要运行的SQL脚本的名称。到目前为止,所有这些脚本都是纯SQL,如果可能的话,我想避免使用PL / pgSQL等。, ^) m- G# o% K2 `
# G o3 S! d3 W$ r( C5 q0 q; Z |
解决方案:% j2 U+ j, u4 R: w$ t9 D
0 g) h! u9 {9 C9 f! E
/ V; X6 I) E7 `" i2 i/ i
6 D# }' y7 P* S5 o
以与您所想到的类似的方式进行简化:
0 _3 g; {% R* ZDO
& y2 M% f7 H# Z$ J; r( b$do$
" ^& V8 N( O+ pBEGIN( i( s/ L4 ]" ~/ o, T' R! H
IF NOT EXISTS (
) V( U0 s$ s5 \ SELECT FROM pg_catalog.pg_roles -- SELECT list can be empty for this
?. j- i6 V2 Y WHERE rolname = 'my_user') THEN Z) h2 L& Y7 J/ T( y2 X. s5 ^
CREATE ROLE my_user LOGIN PASSWORD 'my_password';6 ]% ^) G/ W( i0 V: A$ h) H. r: @
END IF;
' W r1 K+ L9 h/ x; f: {6 E! [$ PEND# s' h8 t' f j9 }% i
$do$;6 R/ Q4 u% M# n2 S5 a" D( {1 q! Y
% j R* U% O7 j. u例如,与之不同的CREATE TABLE是,没有IF NOT EXISTSfor子句CREATE ROLE(至少第12页)。而且,您无法在普通SQL中执行动态DDL语句。; ^8 I& S+ e# \' k/ {
您无法“避免PL / pgSQL”的请求,除非使用另一个PL。该DO语句使用plpgsql作为默认过程语言。该语法允许省略显式声明:
$ Q, A5 p0 ^! p9 m* n& g6 ^! `DO [ LANGUAGE lang_name ] code
) O6 e' w F$ H2 r% j4 K
8 J, Z( Z! w7 B" h# C p… 编写代码所用的过程语言的名称。如果省略,则默认值为。
& D& D B& C _! n: R, alang_name, W7 K7 J. i" Y
plpgsql |
|
|
|
|
|