Age Owner Branch data TLA Line data Source code
1 : : /*-------------------------------------------------------------------------
2 : : *
3 : : * createuser
4 : : *
5 : : * Portions Copyright (c) 1996-2025, PostgreSQL Global Development Group
6 : : * Portions Copyright (c) 1994, Regents of the University of California
7 : : *
8 : : * src/bin/scripts/createuser.c
9 : : *
10 : : *-------------------------------------------------------------------------
11 : : */
12 : :
13 : : #include "postgres_fe.h"
14 : :
15 : : #include <limits.h>
16 : :
17 : : #include "common.h"
18 : : #include "common/logging.h"
19 : : #include "common/string.h"
20 : : #include "fe_utils/option_utils.h"
21 : : #include "fe_utils/simple_list.h"
22 : : #include "fe_utils/string_utils.h"
23 : :
24 : :
25 : : static void help(const char *progname);
26 : :
27 : : int
8208 peter_e@gmx.net 28 :CBC 25 : main(int argc, char *argv[])
29 : : {
30 : : static struct option long_options[] = {
31 : : {"with-admin", required_argument, NULL, 'a'},
32 : : {"connection-limit", required_argument, NULL, 'c'},
33 : : {"createdb", no_argument, NULL, 'd'},
34 : : {"no-createdb", no_argument, NULL, 'D'},
35 : : {"echo", no_argument, NULL, 'e'},
36 : : {"encrypted", no_argument, NULL, 'E'},
37 : : {"role", required_argument, NULL, 'g'},
38 : : {"member-of", required_argument, NULL, 'g'},
39 : : {"host", required_argument, NULL, 'h'},
40 : : {"inherit", no_argument, NULL, 'i'},
41 : : {"no-inherit", no_argument, NULL, 'I'},
42 : : {"login", no_argument, NULL, 'l'},
43 : : {"no-login", no_argument, NULL, 'L'},
44 : : {"with-member", required_argument, NULL, 'm'},
45 : : {"port", required_argument, NULL, 'p'},
46 : : {"pwprompt", no_argument, NULL, 'P'},
47 : : {"createrole", no_argument, NULL, 'r'},
48 : : {"no-createrole", no_argument, NULL, 'R'},
49 : : {"superuser", no_argument, NULL, 's'},
50 : : {"no-superuser", no_argument, NULL, 'S'},
51 : : {"username", required_argument, NULL, 'U'},
52 : : {"valid-until", required_argument, NULL, 'v'},
53 : : {"no-password", no_argument, NULL, 'w'},
54 : : {"password", no_argument, NULL, 'W'},
55 : : {"replication", no_argument, NULL, 1},
56 : : {"no-replication", no_argument, NULL, 2},
57 : : {"interactive", no_argument, NULL, 3},
58 : : {"bypassrls", no_argument, NULL, 4},
59 : : {"no-bypassrls", no_argument, NULL, 5},
60 : : {NULL, 0, NULL, 0}
61 : : };
62 : :
63 : : const char *progname;
64 : : int optindex;
65 : : int c;
4960 66 : 25 : const char *newuser = NULL;
8208 67 : 25 : char *host = NULL;
68 : 25 : char *port = NULL;
69 : 25 : char *username = NULL;
4287 rhaas@postgresql.org 70 : 25 : SimpleStringList roles = {NULL, NULL};
1151 michael@paquier.xyz 71 : 25 : SimpleStringList members = {NULL, NULL};
72 : 25 : SimpleStringList admins = {NULL, NULL};
6036 peter_e@gmx.net 73 : 25 : enum trivalue prompt_password = TRI_DEFAULT;
74 : : ConnParams cparams;
8208 75 : 25 : bool echo = false;
4960 76 : 25 : bool interactive = false;
2035 alvherre@alvh.no-ip. 77 : 25 : int conn_limit = -2; /* less than minimum valid value */
7208 bruce@momjian.us 78 : 25 : bool pwprompt = false;
79 : 25 : char *newpassword = NULL;
1151 michael@paquier.xyz 80 : 25 : char *pwexpiry = NULL;
81 : :
82 : : /* Tri-valued variables. */
6912 bruce@momjian.us 83 : 25 : enum trivalue createdb = TRI_DEFAULT,
84 : 25 : superuser = TRI_DEFAULT,
85 : 25 : createrole = TRI_DEFAULT,
86 : 25 : inherit = TRI_DEFAULT,
87 : 25 : login = TRI_DEFAULT,
1151 michael@paquier.xyz 88 : 25 : replication = TRI_DEFAULT,
89 : 25 : bypassrls = TRI_DEFAULT;
90 : :
91 : : PQExpBufferData sql;
92 : :
93 : : PGconn *conn;
94 : : PGresult *result;
95 : :
2350 peter@eisentraut.org 96 : 25 : pg_logging_init(argv[0]);
8208 peter_e@gmx.net 97 : 25 : progname = get_progname(argv[0]);
6113 98 : 25 : set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pgscripts"));
99 : :
8208 100 : 25 : handle_help_version_opts(argc, argv, "createuser", help);
101 : :
1151 michael@paquier.xyz 102 : 52 : while ((c = getopt_long(argc, argv, "a:c:dDeEg:h:iIlLm:p:PrRsSU:v:wW",
7328 tgl@sss.pgh.pa.us 103 [ + + ]: 52 : long_options, &optindex)) != -1)
104 : : {
8208 peter_e@gmx.net 105 [ + - - - : 30 : switch (c)
- - + - -
- - + + -
- + - + -
+ + - - +
- - + +
+ ]
106 : : {
1151 michael@paquier.xyz 107 : 3 : case 'a':
108 : 3 : simple_string_list_append(&admins, optarg);
109 : 3 : break;
1151 michael@paquier.xyz 110 :UBC 0 : case 'c':
111 [ # # ]: 0 : if (!option_parse_int(optarg, "-c/--connection-limit",
112 : : -1, INT_MAX, &conn_limit))
113 : 0 : exit(1);
8208 peter_e@gmx.net 114 : 0 : break;
115 : 0 : case 'd':
7208 bruce@momjian.us 116 : 0 : createdb = TRI_YES;
8208 peter_e@gmx.net 117 : 0 : break;
118 : 0 : case 'D':
7208 bruce@momjian.us 119 : 0 : createdb = TRI_NO;
8208 peter_e@gmx.net 120 : 0 : break;
1151 michael@paquier.xyz 121 : 0 : case 'e':
122 : 0 : echo = true;
7328 tgl@sss.pgh.pa.us 123 : 0 : break;
1151 michael@paquier.xyz 124 : 0 : case 'E':
125 : : /* no-op, accepted for backward compatibility */
7328 tgl@sss.pgh.pa.us 126 : 0 : break;
1151 michael@paquier.xyz 127 :CBC 3 : case 'g':
128 : 3 : simple_string_list_append(&roles, optarg);
7328 tgl@sss.pgh.pa.us 129 : 3 : break;
1151 michael@paquier.xyz 130 :UBC 0 : case 'h':
131 : 0 : host = pg_strdup(optarg);
7328 tgl@sss.pgh.pa.us 132 : 0 : break;
8208 peter_e@gmx.net 133 : 0 : case 'i':
7208 bruce@momjian.us 134 : 0 : inherit = TRI_YES;
7328 tgl@sss.pgh.pa.us 135 : 0 : break;
136 : 0 : case 'I':
7208 bruce@momjian.us 137 : 0 : inherit = TRI_NO;
7328 tgl@sss.pgh.pa.us 138 : 0 : break;
139 : 0 : case 'l':
7208 bruce@momjian.us 140 : 0 : login = TRI_YES;
7328 tgl@sss.pgh.pa.us 141 : 0 : break;
7328 tgl@sss.pgh.pa.us 142 :CBC 1 : case 'L':
7208 bruce@momjian.us 143 : 1 : login = TRI_NO;
7328 tgl@sss.pgh.pa.us 144 : 1 : break;
1151 michael@paquier.xyz 145 : 4 : case 'm':
146 : 4 : simple_string_list_append(&members, optarg);
147 : 4 : break;
1151 michael@paquier.xyz 148 :UBC 0 : case 'p':
149 : 0 : port = pg_strdup(optarg);
8208 peter_e@gmx.net 150 : 0 : break;
151 : 0 : case 'P':
152 : 0 : pwprompt = true;
153 : 0 : break;
1151 michael@paquier.xyz 154 :CBC 1 : case 'r':
155 : 1 : createrole = TRI_YES;
156 : 1 : break;
1151 michael@paquier.xyz 157 :UBC 0 : case 'R':
158 : 0 : createrole = TRI_NO;
159 : 0 : break;
1151 michael@paquier.xyz 160 :CBC 7 : case 's':
161 : 7 : superuser = TRI_YES;
162 : 7 : break;
1151 michael@paquier.xyz 163 :UBC 0 : case 'S':
164 : 0 : superuser = TRI_NO;
165 : 0 : break;
1151 michael@paquier.xyz 166 :CBC 6 : case 'U':
167 : 6 : username = pg_strdup(optarg);
168 : 6 : break;
169 : 1 : case 'v':
170 : 1 : pwexpiry = pg_strdup(optarg);
171 : 1 : break;
1151 michael@paquier.xyz 172 :UBC 0 : case 'w':
173 : 0 : prompt_password = TRI_NO;
174 : 0 : break;
175 : 0 : case 'W':
176 : 0 : prompt_password = TRI_YES;
8208 peter_e@gmx.net 177 : 0 : break;
5097 rhaas@postgresql.org 178 :CBC 1 : case 1:
179 : 1 : replication = TRI_YES;
180 : 1 : break;
5097 rhaas@postgresql.org 181 :UBC 0 : case 2:
182 : 0 : replication = TRI_NO;
183 : 0 : break;
4960 peter_e@gmx.net 184 : 0 : case 3:
185 : 0 : interactive = true;
186 : 0 : break;
1151 michael@paquier.xyz 187 :CBC 1 : case 4:
188 : 1 : bypassrls = TRI_YES;
189 : 1 : break;
190 : 1 : case 5:
191 : 1 : bypassrls = TRI_NO;
192 : 1 : break;
8208 peter_e@gmx.net 193 : 1 : default:
194 : : /* getopt_long already emitted a complaint */
1247 tgl@sss.pgh.pa.us 195 : 1 : pg_log_error_hint("Try \"%s --help\" for more information.", progname);
8208 peter_e@gmx.net 196 : 1 : exit(1);
197 : : }
198 : : }
199 : :
200 [ - + + ]: 22 : switch (argc - optind)
201 : : {
8208 peter_e@gmx.net 202 :UBC 0 : case 0:
203 : 0 : break;
8208 peter_e@gmx.net 204 :CBC 21 : case 1:
205 : 21 : newuser = argv[optind];
206 : 21 : break;
207 : 1 : default:
2350 peter@eisentraut.org 208 : 1 : pg_log_error("too many command-line arguments (first is \"%s\")",
209 : : argv[optind + 1]);
1247 tgl@sss.pgh.pa.us 210 : 1 : pg_log_error_hint("Try \"%s --help\" for more information.", progname);
8208 peter_e@gmx.net 211 : 1 : exit(1);
212 : : }
213 : :
214 [ - + ]: 21 : if (newuser == NULL)
215 : : {
4960 peter_e@gmx.net 216 [ # # ]:UBC 0 : if (interactive)
217 : : {
1829 tgl@sss.pgh.pa.us 218 : 0 : newuser = simple_prompt("Enter name of role to add: ", true);
219 : : }
220 : : else
221 : : {
4960 peter_e@gmx.net 222 [ # # ]: 0 : if (getenv("PGUSER"))
223 : 0 : newuser = getenv("PGUSER");
224 : : else
4280 bruce@momjian.us 225 : 0 : newuser = get_user_name_or_exit(progname);
226 : : }
227 : : }
228 : :
8208 peter_e@gmx.net 229 [ - + ]:CBC 21 : if (pwprompt)
230 : : {
231 : : char *pw2;
232 : :
1829 tgl@sss.pgh.pa.us 233 :UBC 0 : newpassword = simple_prompt("Enter password for new role: ", false);
234 : 0 : pw2 = simple_prompt("Enter it again: ", false);
235 [ # # ]: 0 : if (strcmp(newpassword, pw2) != 0)
236 : : {
8208 peter_e@gmx.net 237 : 0 : fprintf(stderr, _("Passwords didn't match.\n"));
238 : 0 : exit(1);
239 : : }
1829 tgl@sss.pgh.pa.us 240 : 0 : free(pw2);
241 : : }
242 : :
915 dgustafsson@postgres 243 [ + + ]:CBC 21 : if (superuser == TRI_DEFAULT)
244 : : {
4960 peter_e@gmx.net 245 [ - + - - ]: 14 : if (interactive && yesno_prompt("Shall the new role be a superuser?"))
7208 bruce@momjian.us 246 :UBC 0 : superuser = TRI_YES;
247 : : else
7208 bruce@momjian.us 248 :CBC 14 : superuser = TRI_NO;
249 : : }
250 : :
251 [ + + ]: 21 : if (superuser == TRI_YES)
252 : : {
253 : : /* Not much point in trying to restrict a superuser */
254 : 7 : createdb = TRI_YES;
255 : 7 : createrole = TRI_YES;
256 : : }
257 : :
915 dgustafsson@postgres 258 [ + + ]: 21 : if (createdb == TRI_DEFAULT)
259 : : {
4960 peter_e@gmx.net 260 [ - + - - ]: 14 : if (interactive && yesno_prompt("Shall the new role be allowed to create databases?"))
7208 bruce@momjian.us 261 :UBC 0 : createdb = TRI_YES;
262 : : else
7208 bruce@momjian.us 263 :CBC 14 : createdb = TRI_NO;
264 : : }
265 : :
915 dgustafsson@postgres 266 [ + + ]: 21 : if (createrole == TRI_DEFAULT)
267 : : {
4960 peter_e@gmx.net 268 [ - + - - ]: 13 : if (interactive && yesno_prompt("Shall the new role be allowed to create more new roles?"))
7208 bruce@momjian.us 269 :UBC 0 : createrole = TRI_YES;
270 : : else
7208 bruce@momjian.us 271 :CBC 13 : createrole = TRI_NO;
272 : : }
273 : :
915 dgustafsson@postgres 274 [ + + ]: 21 : if (bypassrls == TRI_DEFAULT)
275 : 19 : bypassrls = TRI_NO;
276 : :
277 [ + + ]: 21 : if (replication == TRI_DEFAULT)
278 : 20 : replication = TRI_NO;
279 : :
280 [ + - ]: 21 : if (inherit == TRI_DEFAULT)
7208 bruce@momjian.us 281 : 21 : inherit = TRI_YES;
282 : :
915 dgustafsson@postgres 283 [ + + ]: 21 : if (login == TRI_DEFAULT)
7208 bruce@momjian.us 284 : 20 : login = TRI_YES;
285 : :
1783 tgl@sss.pgh.pa.us 286 : 21 : cparams.dbname = NULL; /* this program lacks any dbname option... */
287 : 21 : cparams.pghost = host;
288 : 21 : cparams.pgport = port;
289 : 21 : cparams.pguser = username;
290 : 21 : cparams.prompt_password = prompt_password;
291 : 21 : cparams.override_dbname = NULL;
292 : :
293 : 21 : conn = connectMaintenanceDatabase(&cparams, progname, echo);
294 : :
208 andres@anarazel.de 295 : 21 : setFmtEncoding(PQclientEncoding(conn));
296 : :
8208 peter_e@gmx.net 297 : 21 : initPQExpBuffer(&sql);
298 : :
7328 tgl@sss.pgh.pa.us 299 : 21 : printfPQExpBuffer(&sql, "CREATE ROLE %s", fmtId(newuser));
8208 peter_e@gmx.net 300 [ - + ]: 21 : if (newpassword)
301 : : {
302 : : char *encrypted_password;
303 : :
4310 heikki.linnakangas@i 304 :UBC 0 : appendPQExpBufferStr(&sql, " PASSWORD ");
305 : :
3043 306 : 0 : encrypted_password = PQencryptPasswordConn(conn,
307 : : newpassword,
308 : : newuser,
309 : : NULL);
310 [ # # ]: 0 : if (!encrypted_password)
1247 tgl@sss.pgh.pa.us 311 : 0 : pg_fatal("password encryption failed: %s",
312 : : PQerrorMessage(conn));
3043 heikki.linnakangas@i 313 : 0 : appendStringLiteralConn(&sql, encrypted_password, conn);
314 : 0 : PQfreemem(encrypted_password);
315 : : }
7208 bruce@momjian.us 316 [ + + ]:CBC 21 : if (superuser == TRI_YES)
4310 heikki.linnakangas@i 317 : 7 : appendPQExpBufferStr(&sql, " SUPERUSER");
7208 bruce@momjian.us 318 [ + + ]: 21 : if (superuser == TRI_NO)
4310 heikki.linnakangas@i 319 : 14 : appendPQExpBufferStr(&sql, " NOSUPERUSER");
7208 bruce@momjian.us 320 [ + + ]: 21 : if (createdb == TRI_YES)
4310 heikki.linnakangas@i 321 : 7 : appendPQExpBufferStr(&sql, " CREATEDB");
7208 bruce@momjian.us 322 [ + + ]: 21 : if (createdb == TRI_NO)
4310 heikki.linnakangas@i 323 : 14 : appendPQExpBufferStr(&sql, " NOCREATEDB");
7208 bruce@momjian.us 324 [ + + ]: 21 : if (createrole == TRI_YES)
4310 heikki.linnakangas@i 325 : 8 : appendPQExpBufferStr(&sql, " CREATEROLE");
7208 bruce@momjian.us 326 [ + + ]: 21 : if (createrole == TRI_NO)
4310 heikki.linnakangas@i 327 : 13 : appendPQExpBufferStr(&sql, " NOCREATEROLE");
7208 bruce@momjian.us 328 [ + - ]: 21 : if (inherit == TRI_YES)
4310 heikki.linnakangas@i 329 : 21 : appendPQExpBufferStr(&sql, " INHERIT");
7208 bruce@momjian.us 330 [ - + ]: 21 : if (inherit == TRI_NO)
4310 heikki.linnakangas@i 331 :UBC 0 : appendPQExpBufferStr(&sql, " NOINHERIT");
7208 bruce@momjian.us 332 [ + + ]:CBC 21 : if (login == TRI_YES)
4310 heikki.linnakangas@i 333 : 20 : appendPQExpBufferStr(&sql, " LOGIN");
7208 bruce@momjian.us 334 [ + + ]: 21 : if (login == TRI_NO)
4310 heikki.linnakangas@i 335 : 1 : appendPQExpBufferStr(&sql, " NOLOGIN");
5097 rhaas@postgresql.org 336 [ + + ]: 21 : if (replication == TRI_YES)
4310 heikki.linnakangas@i 337 : 1 : appendPQExpBufferStr(&sql, " REPLICATION");
5097 rhaas@postgresql.org 338 [ + + ]: 21 : if (replication == TRI_NO)
4310 heikki.linnakangas@i 339 : 20 : appendPQExpBufferStr(&sql, " NOREPLICATION");
1151 michael@paquier.xyz 340 [ + + ]: 21 : if (bypassrls == TRI_YES)
341 : 1 : appendPQExpBufferStr(&sql, " BYPASSRLS");
342 [ + + ]: 21 : if (bypassrls == TRI_NO)
343 : 20 : appendPQExpBufferStr(&sql, " NOBYPASSRLS");
2035 alvherre@alvh.no-ip. 344 [ - + ]: 21 : if (conn_limit >= -1)
2035 alvherre@alvh.no-ip. 345 :UBC 0 : appendPQExpBuffer(&sql, " CONNECTION LIMIT %d", conn_limit);
1151 michael@paquier.xyz 346 [ + + ]:CBC 21 : if (pwexpiry != NULL)
347 : : {
348 : 1 : appendPQExpBufferStr(&sql, " VALID UNTIL ");
349 : 1 : appendStringLiteralConn(&sql, pwexpiry, conn);
350 : : }
4287 rhaas@postgresql.org 351 [ + + ]: 21 : if (roles.head != NULL)
352 : : {
353 : : SimpleStringListCell *cell;
354 : :
355 : 3 : appendPQExpBufferStr(&sql, " IN ROLE ");
356 : :
357 [ + + ]: 6 : for (cell = roles.head; cell; cell = cell->next)
358 : : {
359 [ - + ]: 3 : if (cell->next)
4287 rhaas@postgresql.org 360 :UBC 0 : appendPQExpBuffer(&sql, "%s,", fmtId(cell->val));
361 : : else
2944 peter_e@gmx.net 362 :CBC 3 : appendPQExpBufferStr(&sql, fmtId(cell->val));
363 : : }
364 : : }
1151 michael@paquier.xyz 365 [ + + ]: 21 : if (members.head != NULL)
366 : : {
367 : : SimpleStringListCell *cell;
368 : :
369 : 2 : appendPQExpBufferStr(&sql, " ROLE ");
370 : :
371 [ + + ]: 5 : for (cell = members.head; cell; cell = cell->next)
372 : : {
373 [ + + ]: 3 : if (cell->next)
374 : 1 : appendPQExpBuffer(&sql, "%s,", fmtId(cell->val));
375 : : else
376 : 2 : appendPQExpBufferStr(&sql, fmtId(cell->val));
377 : : }
378 : : }
379 [ + + ]: 21 : if (admins.head != NULL)
380 : : {
381 : : SimpleStringListCell *cell;
382 : :
383 : 2 : appendPQExpBufferStr(&sql, " ADMIN ");
384 : :
385 [ + + ]: 5 : for (cell = admins.head; cell; cell = cell->next)
386 : : {
387 [ + + ]: 3 : if (cell->next)
388 : 1 : appendPQExpBuffer(&sql, "%s,", fmtId(cell->val));
389 : : else
390 : 2 : appendPQExpBufferStr(&sql, fmtId(cell->val));
391 : : }
392 : : }
393 : :
3719 heikki.linnakangas@i 394 : 21 : appendPQExpBufferChar(&sql, ';');
395 : :
8208 peter_e@gmx.net 396 [ - + ]: 21 : if (echo)
4226 peter_e@gmx.net 397 :UBC 0 : printf("%s\n", sql.data);
8208 peter_e@gmx.net 398 :CBC 21 : result = PQexec(conn, sql.data);
399 : :
400 [ + + ]: 21 : if (PQresultStatus(result) != PGRES_COMMAND_OK)
401 : : {
2350 peter@eisentraut.org 402 : 1 : pg_log_error("creation of new role failed: %s", PQerrorMessage(conn));
8208 peter_e@gmx.net 403 : 1 : PQfinish(conn);
404 : 1 : exit(1);
405 : : }
406 : :
7040 bruce@momjian.us 407 : 20 : PQclear(result);
8208 peter_e@gmx.net 408 : 20 : PQfinish(conn);
409 : 20 : exit(0);
410 : : }
411 : :
412 : :
413 : : static void
414 : 1 : help(const char *progname)
415 : : {
7328 tgl@sss.pgh.pa.us 416 : 1 : printf(_("%s creates a new PostgreSQL role.\n\n"), progname);
8208 peter_e@gmx.net 417 : 1 : printf(_("Usage:\n"));
7281 418 : 1 : printf(_(" %s [OPTION]... [ROLENAME]\n"), progname);
8208 419 : 1 : printf(_("\nOptions:\n"));
839 nathan@postgresql.or 420 : 1 : printf(_(" -a, --with-admin=ROLE ROLE will be a member of new role with admin\n"
421 : : " option\n"));
6037 peter_e@gmx.net 422 : 1 : printf(_(" -c, --connection-limit=N connection limit for role (default: no limit)\n"));
7328 tgl@sss.pgh.pa.us 423 : 1 : printf(_(" -d, --createdb role can create new databases\n"));
4960 peter_e@gmx.net 424 : 1 : printf(_(" -D, --no-createdb role cannot create databases (default)\n"));
6037 425 : 1 : printf(_(" -e, --echo show the commands being sent to the server\n"));
839 nathan@postgresql.or 426 : 1 : printf(_(" -g, --member-of=ROLE new role will be a member of ROLE\n"));
837 427 : 1 : printf(_(" --role=ROLE (same as --member-of, deprecated)\n"));
7281 peter_e@gmx.net 428 : 1 : printf(_(" -i, --inherit role inherits privileges of roles it is a\n"
429 : : " member of (default)\n"));
430 : 1 : printf(_(" -I, --no-inherit role does not inherit privileges\n"));
6037 431 : 1 : printf(_(" -l, --login role can login (default)\n"));
432 : 1 : printf(_(" -L, --no-login role cannot login\n"));
839 nathan@postgresql.or 433 : 1 : printf(_(" -m, --with-member=ROLE ROLE will be a member of new role\n"));
6037 peter_e@gmx.net 434 : 1 : printf(_(" -P, --pwprompt assign a password to new role\n"));
435 : 1 : printf(_(" -r, --createrole role can create new roles\n"));
4960 436 : 1 : printf(_(" -R, --no-createrole role cannot create roles (default)\n"));
6037 437 : 1 : printf(_(" -s, --superuser role will be superuser\n"));
4960 438 : 1 : printf(_(" -S, --no-superuser role will not be superuser (default)\n"));
1150 michael@paquier.xyz 439 : 1 : printf(_(" -v, --valid-until=TIMESTAMP\n"
440 : : " password expiration date and time for role\n"));
4828 peter_e@gmx.net 441 : 1 : printf(_(" -V, --version output version information, then exit\n"));
4960 442 : 1 : printf(_(" --interactive prompt for missing role name and attributes rather\n"
443 : : " than using defaults\n"));
1151 michael@paquier.xyz 444 : 1 : printf(_(" --bypassrls role can bypass row-level security (RLS) policy\n"));
915 dgustafsson@postgres 445 : 1 : printf(_(" --no-bypassrls role cannot bypass row-level security (RLS) policy\n"
446 : : " (default)\n"));
5097 rhaas@postgresql.org 447 : 1 : printf(_(" --replication role can initiate replication\n"));
915 dgustafsson@postgres 448 : 1 : printf(_(" --no-replication role cannot initiate replication (default)\n"));
4828 peter_e@gmx.net 449 : 1 : printf(_(" -?, --help show this help, then exit\n"));
8208 450 : 1 : printf(_("\nConnection options:\n"));
8123 bruce@momjian.us 451 : 1 : printf(_(" -h, --host=HOSTNAME database server host or socket directory\n"));
8208 peter_e@gmx.net 452 : 1 : printf(_(" -p, --port=PORT database server port\n"));
453 : 1 : printf(_(" -U, --username=USERNAME user name to connect as (not the one to create)\n"));
6036 454 : 1 : printf(_(" -w, --no-password never prompt for password\n"));
6479 tgl@sss.pgh.pa.us 455 : 1 : printf(_(" -W, --password force password prompt\n"));
2017 peter@eisentraut.org 456 : 1 : printf(_("\nReport bugs to <%s>.\n"), PACKAGE_BUGREPORT);
457 : 1 : printf(_("%s home page: <%s>\n"), PACKAGE_NAME, PACKAGE_URL);
8208 peter_e@gmx.net 458 : 1 : }
|