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.