La declaración SQL para crear rol falla en Postgres 12 usando Dapper

Sep 03 2020

Estoy ejecutando Postgres 12 en Windows y tengo una aplicación .Net Core que usa Dapper como ORM:

La siguiente consulta funciona bien:

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

Ahora estoy tratando de ejecutar una declaración SQL que crearía un rol:

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

Esta consulta falla con la siguiente excepción: Npgsql.PostgresException: '42601: error de sintaxis en o cerca de "$ 1"'.

¿Que me estoy perdiendo aqui?

Respuestas

2 a_horse_with_no_name Sep 03 2020 at 19:04

El nombre de un rol es un identificador. No puede pasar identificadores como parámetros, deberá concatenar el nombre como un valor constante en la cadena SQL, para que ejecute esto:

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

Tampoco estoy del todo seguro de que el envío de la contraseña como parámetro funcione. Necesitarás probar eso.