【发布时间】:2021-06-20 03:54:06
【问题描述】:
这是我试图通过迁移脚本执行的功能。
CREATE OR REPLACE FUNCTION test(key1 text)
RETURNS void AS $$
BEGIN
INSERT INTO table1(c1) VALUES($1);
END;
$$ LANGUAGE 'plpgsql';
上面的脚本执行成功,但是当我尝试使用 .NET Core 幂等迁移脚本时,它给出了错误ERROR: syntax error at or near "BEGIN"
这是迁移脚本。
DO $$
BEGIN
IF NOT EXISTS(SELECT 1 FROM __EFMigrationsHistory WHERE "MigrationId" = 'migrationid') THEN
CREATE OR REPLACE FUNCTION test(key1 text)
RETURNS void AS $$
BEGIN
INSERT INTO table1(c1) VALUES($1);
END;
$$ LANGUAGE 'plpgsql';
END IF;
END $$;
我也尝试添加 EXECUTE 还是同样的错误。
DO $$
BEGIN
IF NOT EXISTS(SELECT 1 FROM __EFMigrationsHistory WHERE "MigrationId" = 'migrationid') THEN
EXECUTE('CREATE OR REPLACE FUNCTION test(key1 text)
RETURNS void AS $$
BEGIN
INSERT INTO table1(c1) VALUES($1);
END;
$$ LANGUAGE ''plpgsql'';');
END IF;
END $$;
如何通过检查迁移历史表来创建 SQL 语句来创建/替换函数?
【问题讨论】:
-
将
$$美元报价更改为函数内部的其他位置,例如$other$。在线上的$$RETURNS void AS $$正在终止DO $$报价。 -
为什么会阻塞呢?
create or replace将始终有效,除非您更改签名或返回类型。另外(不相关):语言名称是一个标识符。不要将其括在单引号中。这已被弃用,并且可能在未来的版本中不起作用。请改用language plpgsql。 -
@a_horse_with_no_name do begin 语句由迁移实用程序生成。
标签: sql postgresql entity-framework-core plpgsql