创建PostgreSQL ROLE(user)(如果不存在)
技术问答
368 人阅读
|
0 人回复
|
2023-09-14
|
如何编写SQL脚本以在PostgreSQL 9.1中创建ROLE,但如果已经存在则不引发错误?: ]7 a: J9 I! _
当前脚本仅具有:
: {& k" i& }2 A) I, G- yCREATE ROLE my_user LOGIN PASSWORD 'my_password';
% ?* u( K2 Z- D0 C! s- `
. {1 Y6 I$ L w6 l% y9 L! B& Z如果用户已经存在,则此操作将失败。我想要类似的东西:6 N' c0 N8 `* k M# g2 X- X4 i
IF NOT EXISTS (SELECT * FROM pg_user WHERE username = 'my_user')
9 X4 c J7 E5 x/ e+ f. D* T! eBEGIN
. m* \- t- C2 r CREATE ROLE my_user LOGIN PASSWORD 'my_password';" c5 I% k- Q. T1 v5 r* p
END;
- d3 d- W9 F; P! I4 a- c7 [
- m8 h8 L2 B' G…但是那行不通-IF普通的SQL似乎不支持该功能。. D" k T. M' t, e3 r/ k
我有一个批处理文件,它创建了PostgreSQL 9.1数据库,角色和其他一些东西。它调用psql.exe,并传入要运行的SQL脚本的名称。到目前为止,所有这些脚本都是纯SQL,如果可能的话,我想避免使用PL / pgSQL等。
! W/ V: j9 ^5 A, A' X0 L
/ R1 a* j. f, Y' ^# [/ Y9 z; j) e解决方案:& t$ }: `4 {. w8 F7 W# {
2 I+ E9 J8 o6 d7 g! M" N
7 L/ _1 s- u3 Q. O7 u) S' N2 {7 o& e
以与您所想到的类似的方式进行简化:$ f( `0 G8 M+ U8 ?0 K0 F) d# P
DO
8 L& {1 W& K4 b+ u$ r' P5 _$do$
6 ~" ] V% }( W& h9 kBEGIN
) m. d* B; y4 w0 o IF NOT EXISTS (& I$ i$ Y6 ~! h7 A! p
SELECT FROM pg_catalog.pg_roles -- SELECT list can be empty for this
; R7 i( M* Y) X1 l C2 a a3 | WHERE rolname = 'my_user') THEN
+ _4 {& e, E+ t: m CREATE ROLE my_user LOGIN PASSWORD 'my_password';
. p: ?# X* B; M8 }% D7 {$ H% y END IF;
2 H& b( i# y9 s! @END: T! q# s& F. [0 C
$do$;7 n) ?: }1 B% b9 L
) }% ^ v! u5 V3 p
例如,与之不同的CREATE TABLE是,没有IF NOT EXISTSfor子句CREATE ROLE(至少第12页)。而且,您无法在普通SQL中执行动态DDL语句。. ]4 C O! h5 A/ C4 c& n3 u1 w
您无法“避免PL / pgSQL”的请求,除非使用另一个PL。该DO语句使用plpgsql作为默认过程语言。该语法允许省略显式声明:' n: s, h: m) C( q; B% c
DO [ LANGUAGE lang_name ] code
- G5 D. m$ J5 x9 H6 p+ E) M0 S8 |% C3 I6 g7 M, y. V" L; n
… 编写代码所用的过程语言的名称。如果省略,则默认值为。
& O3 [0 K9 d9 `6 V/ olang_name
$ x( U2 o# F+ E- n+ d3 z# Aplpgsql |
|
|
|
|
|