SQL 使用 Dapper 在 Postgres 12 上创建角色的语句失败

SQL statement to Create Role fails on Postgres 12 using Dapper

我是 运行 Windows 上的 Postgres 12,并且有一个使用 Dapper 作为 ORM 的 .Net Core 应用程序:

以下查询工作正常:

var sql = "SELECT 1 FROM pg_roles WHERE rolname=@un"
var result = con.ExecuteScalar<int>(sql, new {un = "someuser"});

现在我正在尝试执行一个 sql 语句来创建一个角色:

var sql = @"CREATE ROLE @un WITH LOGIN NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE NOREPLICATION PASSWORD @pw";     
con.Execute(sql, new {un = "someuser", pw = "somepass");

此查询失败,出现以下异常:Npgsql.PostgresException:'42601:“$1”处或附近的语法错误。

我在这里错过了什么?

角色的名称是一个标识符。您不能将标识符作为参数传递,您需要将名称作为常量值连接到 SQL 字符串中,以便执行此操作:

var sql = @"CREATE ROLE someuser WITH LOGIN NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE NOREPLICATION PASSWORD @pw";     
con.Execute(sql, new {pw = "somepass");

我也不完全确定将密码作为参数发送是否有效。您将需要对其进行测试。