回答

收藏

创建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
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则