Использование EF core 2 с PostgreSQL.Обычно я добавляю миграции и обновляю свою локальную базу данных PostgreSQL с помощью dotnet ef update базы данных без каких-либо проблем.Однако, когда мы создаем сценарий migrations.sql
из наших миграций и затем пытаемся выполнить этот файл, используя psql cli , мы получили несколько ошибок.
Например, приведенный ниже сценарий генерируется EFcore 2. Когда я пытался запустить psql, я получаю:
ERROR: syntax error at or near "DECLARE"
LINE 5: DECLARE
Моя команда cli:
psql -h localhost -p 5432 -d postgres -U postgres -f d:\pg\migrations.sql
Как мне запустить этот скрипт?Чего мне не хватает?
DO $$
BEGIN
IF NOT EXISTS(SELECT 1 FROM "__EFMigrationsHistory" WHERE "MigrationId" = '20181001082052_InitialCreate') THEN
CREATE OR REPLACE FUNCTION "Admin".sp_assign_role_to_user (role_name varchar, user_name varchar) RETURNS void AS $$
DECLARE
role_id int;
user_id int;
user_role_id int;
role_count int;
user_count int;
user_role_count int;
role_deleted_count int;
user_deleted_count int;
BEGIN
SELECT INTO role_count COUNT(*) FROM "Admin"."Role" WHERE "Name"=role_name AND "IsDeleted"=0;
SELECT INTO user_count COUNT(*) FROM "Common"."User" WHERE "LoginName"=user_name AND "StateId"=1 AND "IsDeleted"=0;
RAISE NOTICE 'role_count %',role_count;
RAISE NOTICE 'user_count %',user_count;
SELECT INTO role_deleted_count COUNT(*) FROM "Admin"."Role" WHERE "Name"=role_name AND "IsDeleted"=1;
SELECT INTO user_deleted_count COUNT(*) FROM "Common"."User" WHERE "LoginName"=user_name AND ("IsDeleted"=1 OR "StateId" <> 1);
IF role_count = 0 AND role_deleted_count = 0 THEN
RAISE EXCEPTION 'role_name: % bulunamadı!', role_name;
RETURN;
ELSIF user_count = 0 AND user_deleted_count = 0 THEN
RAISE EXCEPTION 'user_name: % bulunamadı!', user_name;
RETURN;
ELSIF role_count = 0 and role_deleted_count > 0 THEN
RAISE EXCEPTION 'role_name: % silinmiş!',role_name;
RETURN;
ELSIF user_count = 0 and user_deleted_count > 0 THEN
RAISE EXCEPTION 'user_name: % silinmiş, yada aktif durumda değil!',user_name;
RETURN;
ELSIF role_count > 1 THEN
RAISE EXCEPTION 'role_name: %, count: % birden fazla role!',role_name, role_count;
RETURN;
ELSIF user_count > 1 THEN
RAISE EXCEPTION 'user_name: % , count: % birden fazla kullanıcı adı!',user_name, user_count;
RETURN;
ELSIF role_count = 1 AND user_count = 1 THEN
SELECT INTO role_id "Id" FROM "Admin"."Role" WHERE "Name"=role_name AND "IsDeleted"=0;
RAISE NOTICE 'role_id: %', role_id;
SELECT INTO user_id "Id" FROM "Common"."User" WHERE "LoginName"=user_name AND "IsDeleted"=0 and "StateId"=1;
RAISE NOTICE 'user_id: %', user_id;
ELSE
RAISE EXCEPTION 'tanımlanmamış durum!';
RETURN;
END IF;
SELECT INTO user_role_count COUNT(*) FROM "Admin"."UserRole" WHERE "RoleId"=role_id AND "UserId"=user_id AND "IsDeleted"=0;
RAISE NOTICE 'user_role_count: %', user_role_count;
IF user_role_count > 0 THEN
RAISE EXCEPTION 'Zaten mevcut atama var!; role_name: %, role_id: % - user_name: % , user_id: %', role_name, role_id, user_name, user_id;
RETURN;
ELSE
INSERT INTO "Admin"."UserRole"("RoleId", "UserId","Comment", "LastUpdatedDate") VALUES(role_id, user_id, 'Created by SP_ASSIGN_ROLE_TO_USER', now());
RAISE NOTICE 'User Role ataması başarılı ; role_name: %, role_id: % - user_name: %', role_name, role_id, user_name;
END IF;
END;
$$ LANGUAGE plpgsql;
END IF;
END $$;