Скрипты переноса EF core 2 в PostgreSQL 10.5 с ошибкой - PullRequest
0 голосов
/ 04 декабря 2018

Использование 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 $$;

1 Ответ

0 голосов
/ 04 декабря 2018

Ваша котировка доллара испорчена.Вы используете $$ для блока DO, а также для тела функции.

Используйте $do$, чтобы отметить начало и конец блока DO, и $func$, чтобы окружить тело функции.,Вы можете использовать разные разделители, если вы не используете одно и то же для обоих.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...