A instrução SQL para criar função falha no Postgres 12 usando o Dapper

Sep 03 2020

Estou executando o Postgres 12 no Windows e tenho um aplicativo .Net Core que usa o Dapper como um ORM:

A consulta a seguir funciona bem:

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

Agora estou tentando executar uma instrução sql que criaria uma função:

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

Esta consulta falha com a seguinte exceção: Npgsql.PostgresException: '42601: erro de sintaxe em ou próximo a "$1"'.

O que estou perdendo aqui?

Respostas

2 a_horse_with_no_name Sep 03 2020 at 19:04

O nome de uma função é um identificador. Você não pode passar identificadores como parâmetros, você precisará concatenar o nome como um valor constante na string SQL, para que você execute isso:

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

Também não tenho certeza de que enviar a senha como parâmetro funciona. Você vai precisar testar isso.