我似乎不能用最简单的sql创建迁移来创建PostgreSQL过程。
错误是:
异常数据:严重性:错误SqlState: 42601MessageText:输入结束时出现语法错误位置:186文件:scan.l线:1184常规:scanner_yyerror
Sql代码在pgAdmin中执行时工作正常。
protected override void Up(MigrationBuilder migrationBuilder)
{
var sp = @"CREATE PROCEDURE reset_primary_holder()
LANGUAGE SQL
BEGIN ATOMIC
SELECT * FROM id.users;
END;";
migrationBuilder.Sql(sp);
}
What am I doing wrong?
Npgsql (. NET驱动程序(不是EF提供程序)默认解析SQL以查找分号和重写语句,而新的PostgreSQL语法打破了解析器;参见https://github.com/npgsql/npgsql/issues/4445。
一般建议的修复方法是在程序的开头添加以下内容:AppContext.SetSwitch("Npgsql.EnableSqlRewriting", false);
禁用语句解析/重写;这意味着您需要使用位置参数占位符($1
,$2
而不是@p1
,@p2
) -参见文档。
然而,不幸的是,EF还不兼容这种模式,所以你必须不使用这种语法…
最后唯一可行的解决方案是使用不同的语法:
protected override void Up(MigrationBuilder migrationBuilder)
{
var sp = @"CREATE PROCEDURE my_procedure()
AS $$
UPDATE id.users
SET ...;
Another statement;
$$ LANGUAGE sql;";
migrationBuilder.Sql(sp);
}
这个语法在存储过程的文档中没有提到,因为这是我的第一个PG过程/函数,所以对我来说没有明显的替代方法。
谢谢@Shay给我指出了正确的方向。