📅  最后修改于: 2023-12-03 15:06:56.094000             🧑  作者: Mango
在 C 编程语言中,我们可以使用 libpq 库来连接和操作 PostgreSQL 数据库。如果我们想要在 psql 中创建一个新角色,可以使用以下代码片段:
#include <stdio.h>
#include <stdlib.h>
#include <libpq-fe.h>
int main(int argc, char** argv) {
const char* conninfo = "host=localhost port=5432 dbname=mydb user=myuser";
PGconn* conn = PQconnectdb(conninfo);
if (PQstatus(conn) != CONNECTION_OK) {
fprintf(stderr, "Connection to database failed: %s", PQerrorMessage(conn));
PQfinish(conn);
return EXIT_FAILURE;
}
const char* username = "newuser";
const char* password = "mypass";
const char* query = "CREATE ROLE %s WITH LOGIN ENCRYPTED PASSWORD '%s';";
char* escaped_username = PQescapeLiteral(conn, username, strlen(username));
char* escaped_password = PQescapeLiteral(conn, password, strlen(password));
char* command = (char*) malloc(strlen(query) + strlen(escaped_username) + strlen(escaped_password) + 1);
sprintf(command, query, escaped_username, escaped_password);
PQfreemem(escaped_username);
PQfreemem(escaped_password);
PGresult* res = PQexec(conn, command);
if (PQresultStatus(res) != PGRES_COMMAND_OK) {
fprintf(stderr, "Failed to create role: %s", PQresultErrorMessage(res));
PQclear(res);
PQfinish(conn);
return EXIT_FAILURE;
}
PQclear(res);
free(command);
PQfinish(conn);
return EXIT_SUCCESS;
}
在这个例子中,我们首先连接到数据库。然后我们定义要创建的角色的用户名和密码。注意,我们使用 PQescapeLiteral
函数来转义这些字符串,以避免 SQL 注入攻击。接下来,我们使用 sprintf
函数将这些字符串插入到一个 SQL 查询中。我们然后执行该查询,并检查结果状态以确保它成功执行。
请注意,为了保证安全性,我们应该尽可能避免在代码中硬编码密码。取而代之的是,我们可以使用环境变量或命令行参数来传递密码。例如,我们可以使用以下代码来读取密码:
const char* password = getenv("PGPASSWORD");
if (password == NULL) {
fprintf(stderr, "PGPASSWORD environment variable not set");
PQfinish(conn);
return EXIT_FAILURE;
}
这将从名为 PGPASSWORD
的环境变量中读取密码。如果该变量未设置,则会输出错误消息并关闭连接。
以上就是使用密码在 psql 中创建角色的 C 编程语言示例。