Не удается изменить таблицу, когда я выполняю функцию, которая модифицирует таблицу - PullRequest
0 голосов
/ 09 января 2019

Я написал обобщенную функцию для изменения идентификаторов студентов с неправильными идентификаторами. Поскольку на таблицу студентов ссылаются другие таблицы, мне пришлось удалить внешние ключи и временно отключить триггеры. Это моя функция.

CREATE OR REPLACE FUNCTION update_student_id(varchar, varchar) RETURNS varchar AS $$
DECLARE 
old_id ALIAS FOR  $1;
new_id ALIAS FOR  $2;
msg varchar(120);

BEGIN

    --disable triggers
   ALTER TABLE students
   DISABLE TRIGGER ALL;

    ALTER TABLE studentdegrees
    DISABLE TRIGGER ALL;


    ALTER TABLE studentdegrees DROP CONSTRAINT studentdegrees_studentid_fkey;
    UPDATE students 
    SET studentid=new_id
    WHERE studentid=old_id;

    ALTER TABLE studentdegrees
    ADD CONSTRAINT studentdegrees_studentid_fkey
    FOREIGN KEY (studentid)
    REFERENCES students(studentid);

    UPDATE studentdegrees 
    SET studentid=new_id
    WHERE studentid=old_id;

    UPDATE entitys 
    SET user_name=new_id
    WHERE user_name=old_id;

    --enable triggers
    ALTER TABLE students
    ENABLE TRIGGER ALL;

    ALTER TABLE studentdegrees
    ENABLE TRIGGER ALL;

    msg:=old_id|| ' Changed to '||new_id;

RETURN msg;
END;
$$ LANGUAGE plpgsql; 

Когда я вызываю такую ​​функцию

SELECT  update_student_id(
studentid, a.stdid)
FROM
(SELECT studentid,  REPLACE(studentid, ' ', '') AS stdid
FROM students
WHERE studentid NOT IN (SELECT REPLACE(studentid, ' ', ''))) AS a

Я получаю эту ошибку

ОШИБКА: невозможно ИЗМЕНИТЬ ТАБЛИЦУ "студентов", потому что он используется активными запросами в этом сеансе
КОНТЕКСТ: оператор SQL "ALTER TABLE студенческие степени DROP CONSTRAINT studentdegrees_studentid_fkey"
Функция PL / pgSQL update_student_id (символьная, символьная) строка 17 в операторе SQL

...