Обновление CRM системы

В Iris CRM начиная с версии 3.1 встроен раздел Администрирование→Обновление. Он предназначен для упрощения процесса обновления системы до последней версии.

Важно отметить, что обновление возможно выполнить двумя способами.

Перенос данных из старой (рабочей) базы в новую

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

В чем заключается обновление

Небольшое теоретическое отступление.

При обновлении системы необходимо обновить файлы системы и базу данных.

Сложность заключается в том, что в Вашей версии CRM системы и в версии, до которой Вы решили обновиться, может быть различная структура базы данных и могут различаться файлы конфигурации.

Таким образом, при обновлении необходимо решить следующие задачи в следующем порядке.

  1. Создать резервные копии базы данных и файлов системы.
  2. Создать новую базу данных для новой версии CRM системы.
  3. Синхронизировать структуру базы данных (перенести дополнительные таблицы и колонки из рабочей базы в новую).
  4. Перенести данные из рабочей базы в новую.
  5. Перенести изменения файлов конфигурации из рабочей базы в новую.

Чтобы упростить эти действия, в систему встроен раздел Администрирование→Обновление, который автоматизирует этапы 3 и 4.

Выполняем обновление

Для выполнения обновления выполните следующие действия.

  1. Резервная копия.
    1. Обязательно создайте резервные копии базы данных и файлов системы.
    2. Скопируйте файлы Вашей системы в другую папку или переименуйте папку с файлами системы. По умолчанию файлы системы лежат в папке c:\Program Files\Iris CRM\htdocs\iriscrm, в этом случае переименуйте папку iriscrm, например, в папку iriscrm-old.
  2. Разворачиваем новую версию.
    1. Создайте новую базу данных и разверните в нее резервную копию базы новой версии системы.
    2. Скопируйте файлы новой версии системы в папку, куда была ранее установлена CRM система. По умолчанию это папка c:\Program Files\Iris CRM\htdocs\iriscrm.
    3. Пропишите настройки соединения с новой базой данных (файл /admin/settings/settings.xml).
  3. Выполняем обновление базы данных.
    1. Заходим в новую версию CRM системы по той же ссылке, по какой входили в рабочую версию системы (по умолчанию http://localhost/iriscrm).
    2. Переходим в раздел Администрирование→Обновление.
    3. Указываем параметры соединения с рабочей (старой) базой данных.
    4. Нажимаем кнопку Выполнить обновление.
    5. Скачиваем SQL скрипт, который сгенерировала система.
    6. Запускаем этот SQL скрипт в утилите pgAdmin, выполняем его на новой базе данных. Этот скрипт синхронизирует структуру БД и переносит данные из рабочей базы в новую.
    7. Если Вы меняли или добавляли триггеры или функции базы данных, то их необходимо перенести из рабочей базы в новую вручную.
  4. Если Вы не меняли файлы конфигурации (папка /config), то на для Вас обновление на этом можно считать завершенным. Иначе необходимо выполненные изменения перенести в новую версию системы.

На этом обновление завершено. Теперь по прежнему адресу находится новая версия системы с Вашими рабочими данными.

Перенос структуры данных из новой базы в старую (рабочую)

Перенести структуру базы данных и необходимую информацию из новой базы в старую. Используйте этот способ, если у Вас объемная база или если Вы меняли справочники.

В чем заключается обновление

Небольшое теоретическое отступление.

При обновлении системы необходимо обновить файлы системы и базу данных.

Сложность заключается в том, что в Вашей версии CRM системы и в версии, до которой Вы решили обновиться, может быть различная структура базы данных и могут различаться файлы конфигурации.

Таким образом, при обновлении необходимо решить следующие задачи в следующем порядке.

  1. Создать резервные копии базы данных и файлов системы.
  2. Создать новую базу данных новой версии CRM системы.
  3. Синхронизировать структуру базы данных (перенести дополнительные таблицы и колонки из новой базы в рабочую).
  4. Перенести только необходимые данные из новой базы в рабочую.
  5. Перенести изменения файлов конфигурации из новой базы в рабочую.

Чтобы упростить эти действия, в систему встроен раздел Администрирование→Обновление, который автоматизирует этапы 3 и 4.

Выполняем обновление

Для выполнения обновления выполните следующие действия.

  1. Резервная копия.
    1. Обязательно создайте резервные копии базы данных и файлов системы.
    2. Скопируйте файлы Вашей системы в другую папку или переименуйте папку с файлами системы. По умолчанию файлы системы лежат в папке c:\Program Files\Iris CRM\htdocs\iriscrm, в этом случае переименуйте папку iriscrm, например, в папку iriscrm-old.
  2. Разворачиваем новую версию.
    1. Создайте новую базу данных и разверните в нее резервную копию базы новой версии системы.
    2. Скопируйте файлы новой версии системы в папку, куда была ранее установлена CRM система. По умолчанию это папка c:\Program Files\Iris CRM\htdocs\iriscrm.
    3. Пропишите настройки соединения с новой базой данных (файл /admin/settings/settings.xml).
  3. Выполняем обновление базы данных.
    1. Заходим в новую версию CRM системы по той же ссылке, по какой входили в рабочую версию системы (по умолчанию http://localhost/iriscrm).
    2. Переходим в раздел Администрирование→Обновление.
    3. Указываем параметры соединения с рабочей (старой) базой данных.
    4. Нажимаем кнопку Выполнить обновление. Указываем, что мы находимся в новой базе и переносим данные из новой базы в старую.
    5. Скачиваем SQL скрипт, который сгенерировала система.
    6. Запускаем этот SQL скрипт в утилите pgAdmin, выполняем его на старой (рабочей) базе данных. Этот скрипт синхронизирует структуру БД и переносит данные из новой базы в старую (рабочую). При выполнении скрипта могут возникнуть ошибки. Удалите или закомментируйте строки, на которых возникают ошибки и попробуйте выполнить скрипт снова.
    7. Обратите внимание на функции БД и триггеры. Если в новой версии есть новые функции или триггеры, то их необходимо перенести в рабочую БД вручную.
  4. Если Вы не меняли файлы конфигурации (папка /config), то на для Вас обновление на этом можно считать завершенным. Иначе необходимо выполненные изменения перенести в новую версию системы.

На этом обновление завершено. Теперь по прежнему адресу находится новая версия системы с Вашими рабочими данными.

Решение возможных проблем

Возможные проблемы и способы их решения.

  • При создании скрипта обновления появляется следующее сообщение.

    База _____: ERROR: отношение "iris_answer_comment" не существует.

    Причина. В физической структуре БД такая таблица отсутствует, а в мета записях она еще не удалена.

    Решение. Удалите эту таблицу из раздела Таблицы и Группы таблиц. Зайдите в Вашу рабочую версию системы в раздел Администрирование→Группы таблиц. Выберите группу таблиц Решения и удалите из этой группы таблиц таблицу iris_answer_comment. Зайдите в раздел Администрирование→Таблицы и удалите таблицу iris_answer_comment.

    Для удаления также можно воспользоваться скриптом.

    DELETE FROM iris_table_tablegroup
    WHERE tableid IN (SELECT id FROM iris_table WHERE code='iris_answer_comment');
    DELETE FROM iris_table WHERE code='iris_answer_comment';
  • При подготовке скрипта обновления базы возникает следующее сообщение.

    База _____: ERROR: отношение "iris_table_column" не существует.

    Причина. В рабочей базе нет таблицы iris_table_column.

    Решение. Добавить и заполнить таблицу iris_table_column. В этой таблице содержится описание всех колонок системы. В системе порядка 200 таблиц. В каждой таблице в среднем по 10 колонок. Вручную заполнять эту таблицу не целесообразно. Для автоматического создания и заполнения этой таблицы выполните скрипт из pgAdmin.

    Скрипт для создания и заполнения iris_table_column.

    -- Table: iris_columntype
     
    -- DROP TABLE iris_columntype;
     
    CREATE TABLE iris_columntype
    (
      id character varying(36) NOT NULL,
      createid character varying(36), -- Автор
      createdate timestamp without time zone, -- Дата создания
      modifyid character varying(36), -- Изменил
      modifydate timestamp without time zone, -- Дата изменения
      "name" character varying(250) NOT NULL, -- Название
      code character varying(250), -- Код (тип колонки в БД)
      description character varying(1000), -- Описание
      CONSTRAINT pk_iris_columntype PRIMARY KEY (id)
    );
     
    COMMENT ON TABLE iris_columntype IS 'Типы колонок';
    COMMENT ON COLUMN iris_columntype.createid IS 'Автор';
    COMMENT ON COLUMN iris_columntype.createdate IS 'Дата создания';
    COMMENT ON COLUMN iris_columntype.modifyid IS 'Изменил';
    COMMENT ON COLUMN iris_columntype.modifydate IS 'Дата изменения';
    COMMENT ON COLUMN iris_columntype."name" IS 'Название';
    COMMENT ON COLUMN iris_columntype.code IS 'Код (тип колонки в БД)';
    COMMENT ON COLUMN iris_columntype.description IS 'Описание';
     
     
    -- Index: iris_columntype_pk_i
     
    -- DROP INDEX iris_columntype_pk_i;
     
    CREATE UNIQUE INDEX iris_columntype_pk_i
      ON iris_columntype
      USING btree
      (id);
     
     
    -- Table: iris_table_column
     
    -- DROP TABLE iris_table_column;
     
    CREATE TABLE iris_table_column
    (
      id character varying(36) NOT NULL,
      createid character varying(36), -- Автор
      createdate timestamp without time zone, -- Дата создания
      modifyid character varying(36), -- Изменил
      modifydate timestamp without time zone, -- Дата изменения
      tableid character varying(36), -- Таблица
      "name" character varying(250), -- Название колонки
      code character varying(250), -- Код колонки (название в БД)
      columntypeid character varying(36), -- Тип колонки
      description character varying(1000), -- Комментарий
      defaultvalue character varying(250), -- По умолчанию
      fkname character varying(250), -- Название внешнего ключа
      fktableid character varying(36), -- Таблица внешнего ключа
      --iscascade character varying(1), -- Каскадное удаление
     
      CONSTRAINT pk_iris_table_column PRIMARY KEY (id),
      CONSTRAINT fk_iris_table_column_columntypeid FOREIGN KEY (columntypeid)
          REFERENCES iris_columntype (id) MATCH SIMPLE
          ON UPDATE RESTRICT ON DELETE RESTRICT,
      CONSTRAINT fk_iris_table_column_fktableid FOREIGN KEY (fktableid)
          REFERENCES iris_table (id) MATCH SIMPLE
          ON UPDATE RESTRICT ON DELETE RESTRICT,
      CONSTRAINT fk_iris_table_column_tableid FOREIGN KEY (tableid)
          REFERENCES iris_table (id) MATCH SIMPLE
          ON UPDATE CASCADE ON DELETE CASCADE
    );
    COMMENT ON TABLE iris_table_column IS 'Колонки таблицы';
    COMMENT ON COLUMN iris_table_column.createid IS 'Автор';
    COMMENT ON COLUMN iris_table_column.createdate IS 'Дата создания';
    COMMENT ON COLUMN iris_table_column.modifyid IS 'Изменил';
    COMMENT ON COLUMN iris_table_column.modifydate IS 'Дата изменения';
    COMMENT ON COLUMN iris_table_column.tableid IS 'Таблица';
    COMMENT ON COLUMN iris_table_column."name" IS 'Название колонки';
    COMMENT ON COLUMN iris_table_column.code IS 'Код колонки (название в БД)';
    COMMENT ON COLUMN iris_table_column.columntypeid IS 'Тип колонки';
    COMMENT ON COLUMN iris_table_column.description IS 'Комментарий';
    COMMENT ON COLUMN iris_table_column.defaultvalue IS 'По умолчанию';
    COMMENT ON COLUMN iris_table_column.fkname IS 'Название внешнего ключа';
    COMMENT ON COLUMN iris_table_column.fktableid IS 'Таблица внешнего ключа';
    --COMMENT ON COLUMN iris_table_column.iscascade IS 'Каскадное удаление';
     
     
    -- Index: iris_table_column_fk_i
     
    -- DROP INDEX iris_table_column_fk_i;
     
    CREATE INDEX iris_table_column_fk_i
      ON iris_table_column
      USING btree
      (columntypeid);
     
    -- Index: iris_table_column_fk_i2
     
    -- DROP INDEX iris_table_column_fk_i2;
     
    CREATE INDEX iris_table_column_fk_i2
      ON iris_table_column
      USING btree
      (tableid);
     
    -- Index: iris_table_column_fk_i3
     
    -- DROP INDEX iris_table_column_fk_i3;
     
    CREATE INDEX iris_table_column_fk_i3
      ON iris_table_column
      USING btree
      (fktableid);
     
    -- Index: iris_table_column_pk_i
     
    -- DROP INDEX iris_table_column_pk_i;
     
    CREATE UNIQUE INDEX iris_table_column_pk_i
      ON iris_table_column
      USING btree
      (id);
     
     
    -- Добавим данные о новых таблицах
    -- Таблица "Колонки"
    INSERT INTO iris_table (id, createid, createdate, modifyid, modifydate, name, code, description, is_access) VALUES ('c0c2de54-8d22-6731-ebb5-96bb0040cad9', NULL, NULL, NULL, NULL, 'Колонки таблицы', 'iris_table_column', NULL, '0');
    -- таблица "Типы колонок таблицы"
    INSERT INTO iris_table (id, createid, createdate, modifyid, modifydate, name, code, description, is_access) VALUES ('bab891d2-ef44-7865-31ac-85886c9376c2', NULL, NULL, NULL, NULL, 'Типы колонок таблицы', 'iris_columntype', NULL, '0');
     
    -- добавим таблицу "Типы колонок" в группу таблиц "Справочники"
    INSERT INTO iris_table_tablegroup (id, createid, createdate, modifyid, modifydate, tablegroupid, tableid) VALUES (iris_genguid(), NULL, NULL, NULL, NULL, '636beb30-f4c4-3755-b407-4259fa7f12dc', 'bab891d2-ef44-7865-31ac-85886c9376c2');
     
    -- В группу таблиц "Группа таблиц"
    INSERT INTO iris_table_tablegroup (id, createid, createdate, modifyid, modifydate, tablegroupid, tableid) VALUES ('18ab97d7-71ce-923d-4ead-435afee65a87', NULL, NULL, NULL, NULL, 'f0cbb42d-0279-3a79-bac9-f198ccc3d63e', 'c0c2de54-8d22-6731-ebb5-96bb0040cad9');
     
     
    -- Вставка начальных значений
    INSERT INTO iris_columntype (id, "name", code, description)
    VALUES('84b8ce3d-2737-f6f1-1a30-a75f7e66a6d2', 'Строка (30)', 'character varying(30)', '');
    INSERT INTO iris_columntype (id, "name", code, description)
    VALUES('b9a77e4a-5714-e160-ba16-16695cff3d1e', 'Строка (50)', 'character varying(50)', '');
    INSERT INTO iris_columntype (id, "name", code, description)
    VALUES('7c6eba80-2a51-bb27-53d7-a40f00f3d024', 'Символ', 'character varying(1)', '');
    INSERT INTO iris_columntype (id, "name", code, description)
    VALUES('332cb042-111b-3598-4458-7b36a1d0b67f', 'Строка (250)', 'character varying(250)', '');
    INSERT INTO iris_columntype (id, "name", code, description)
    VALUES('8e1d85be-6230-4c6f-6905-1aa87d25fa98', 'Строка (1000)', 'character varying(1000)', '');
    INSERT INTO iris_columntype (id, "name", code, description)
    VALUES('8a51f105-3368-0c76-68b7-26fa32f3c8b5', 'Текст', 'text', 'Желательно не использовать этот тип');
    INSERT INTO iris_columntype (id, "name", code, description)
    VALUES('687bc1a7-de12-ab78-11bd-6936d9a9ff75', 'Малое целое', 'smallint', '');
    INSERT INTO iris_columntype (id, "name", code, description)
    VALUES('21622686-9ef9-b601-eb81-18b5aa8634b5', 'Целое', 'integer', '');
    INSERT INTO iris_columntype (id, "name", code, description)
    VALUES('527880f1-eeb9-4bb3-7359-c0f6b8dfc942', 'Дробное (10, 2)', 'numeric(10,2)', '');
    INSERT INTO iris_columntype (id, "name", code, description)
    VALUES('9ab5af8c-0984-f1d3-53cd-ff3901ac72b1', 'GUID', 'character varying(36)', '');
    INSERT INTO iris_columntype (id, "name", code, description)
    VALUES('c6676f47-8cc8-e9b4-c71b-74576f4d1ffe', 'Дата', 'date', '');
    INSERT INTO iris_columntype (id, "name", code, description)
    VALUES('666d5a4e-6064-9286-a921-e7957d39d283', 'Дата-время', 'timestamp without time zone', '');
     
     
    ALTER TABLE iris_table_column ADD COLUMN isprimary character varying(1);
    COMMENT ON COLUMN iris_table_column.isprimary IS 'Первичный ключ';
     
     
    CREATE TABLE iris_constraintaction
    (
      id character varying(36) NOT NULL,
      createid character varying(36), -- Автор
      createdate timestamp without time zone, -- Дата создания
      modifyid character varying(36), -- Изменил
      modifydate timestamp without time zone, -- Дата изменения
      "name" character varying(250) NOT NULL, -- Название
      code character varying(250), -- Код (действие в БД)
      description character varying(1000), -- Описание
      CONSTRAINT pk_iris_constraintaction PRIMARY KEY (id)
    );
     
    COMMENT ON TABLE iris_constraintaction IS 'Типы колонок';
    COMMENT ON COLUMN iris_constraintaction.createid IS 'Автор';
    COMMENT ON COLUMN iris_constraintaction.createdate IS 'Дата создания';
    COMMENT ON COLUMN iris_constraintaction.modifyid IS 'Изменил';
    COMMENT ON COLUMN iris_constraintaction.modifydate IS 'Дата изменения';
    COMMENT ON COLUMN iris_constraintaction."name" IS 'Название';
    COMMENT ON COLUMN iris_constraintaction.code IS 'Код (действие в БД)';
    COMMENT ON COLUMN iris_constraintaction.description IS 'Описание';
     
     
    -- Добавим данные о новых таблицах
    -- таблица "Действия для внешних ключей"
    INSERT INTO iris_table (id, createid, createdate, modifyid, modifydate, name, code, description, is_access) 
    VALUES ('396ac611-c244-60a4-027e-5f7cb82fc2a0', NULL, NULL, NULL, NULL, 'Действия для внешних ключей', 'iris_constraintaction', NULL, '0');
     
    -- добавим таблицу "Действия для внешних ключей" в группу таблиц "Справочники"
    INSERT INTO iris_table_tablegroup (id, createid, createdate, modifyid, modifydate, tablegroupid, tableid) VALUES (iris_genguid(), NULL, NULL, NULL, NULL, '636beb30-f4c4-3755-b407-4259fa7f12dc', '396ac611-c244-60a4-027e-5f7cb82fc2a0');
     
     
    -- Вставка начальных значений
    INSERT INTO iris_constraintaction (id, "name", code, description)
    VALUES('762f2d30-bd6b-00a7-2832-dbfb5a6302c8', 'Нет проверки', 'NO ACTION', '');
    INSERT INTO iris_constraintaction (id, "name", code, description)
    VALUES('9f8bccc8-923a-3e15-6484-f7f4168294b2', 'Проверка целостности', 'RESTRICT', '');
    INSERT INTO iris_constraintaction (id, "name", code, description)
    VALUES('43d1f9a8-ce2f-c342-7d67-46c6d497949d', 'Каскадное', 'CASCADE', '');
    INSERT INTO iris_constraintaction (id, "name", code, description)
    VALUES('87f7090d-72c3-616e-ed53-31a1548e91c1', 'Установить пусто', 'SET NULL', '');
    INSERT INTO iris_constraintaction (id, "name", code, description)
    VALUES('9b8a597c-b302-5703-4677-829e61df3a0c', 'Установить по умолчанию', 'SET DEFAULT', '');
     
     
    ALTER TABLE iris_table_column ADD COLUMN ondeleteid character varying(36);
    COMMENT ON COLUMN iris_table_column.ondeleteid IS 'Действие при удалении';
    ALTER TABLE iris_table_column ADD COLUMN onupdateid character varying(36);
    COMMENT ON COLUMN iris_table_column.onupdateid IS 'Действие при обновлении';
     
    ALTER TABLE iris_table_column
      ADD CONSTRAINT fk_iris_table_column_ondeleteid FOREIGN KEY (ondeleteid)
          REFERENCES iris_constraintaction (id) MATCH SIMPLE
          ON UPDATE RESTRICT ON DELETE RESTRICT;
     
    ALTER TABLE iris_table_column
      ADD CONSTRAINT fk_iris_table_column_onupdateid FOREIGN KEY (onupdateid)
          REFERENCES iris_constraintaction (id) MATCH SIMPLE
          ON UPDATE RESTRICT ON DELETE RESTRICT;
     
    CREATE INDEX iris_table_column_fk_i4
      ON iris_table_column
      USING btree
      (ondeleteid);
     
    CREATE INDEX iris_table_column_fk_i5
      ON iris_table_column
      USING btree
      (onupdateid);
     
     
    ALTER TABLE iris_table_column ADD COLUMN isnotnull smallint;
    COMMENT ON COLUMN iris_table_column.isnotnull IS 'Не пустое';
     
    ALTER TABLE iris_table_column ADD COLUMN "default" character varying(250);
    COMMENT ON COLUMN iris_table_column."default" IS 'По умолчанию';
     
    ALTER TABLE iris_table_column ADD COLUMN pkname character varying(250);
    COMMENT ON COLUMN iris_table_column.pkname IS 'Название первичного ключа';
     
    ALTER TABLE iris_table_column ADD COLUMN indexname character varying(250);
    COMMENT ON COLUMN iris_table_column.indexname IS 'Название индекса';
     
     
    --Автозаполнение колонок - начало
     
    DELETE FROM iris_table_column;
    INSERT INTO iris_table_column(id, code, tableid, columntypeid, "name", 
    isnotnull, defaultvalue, fkname, fktableid, ondeleteid, onupdateid, isprimary, pkname, indexname)
    SELECT iris_genguid(),
      a.attname,
      (SELECT id FROM iris_table WHERE code=c.relname),
      (SELECT id FROM iris_columntype WHERE code=format_type(a.atttypid, a.atttypmod)),
      (SELECT description FROM pg_description WHERE objoid=c.oid AND objsubid=a.attnum),
      CASE WHEN a.attnotnull THEN 1 ELSE 0 END AS fields_not_null,
      (SELECT adsrc FROM pg_attrdef WHERE adrelid=c.oid AND adnum=a.attnum),
      (SELECT c0.conname
        FROM pg_constraint c0, pg_namespace n0,
        pg_class p1, pg_class p2,
        pg_attribute a1, pg_attribute a2
        WHERE c0.contype = 'f'
        AND c0.confrelid > 0
        AND c0.connamespace = n0.oid
        AND c0.conrelid = p1.oid
        AND c0.confrelid = p2.oid
        AND c0.conrelid = a1.attrelid
        AND a1.attnum = ANY (c0.conkey)
        AND c0.confrelid = a2.attrelid
        AND a2.attnum = ANY (c0.confkey)
        AND n0.nspname = 'public'
        AND p1.relname = c.relname --'iris_account'
        AND a1.attname = a.attname --'cityid'
      ),
      (SELECT id FROM iris_table WHERE code=
        (SELECT p2.relname AS table2
        FROM pg_constraint c0, pg_namespace n0,
        pg_class p1, pg_class p2,
        pg_attribute a1, pg_attribute a2
        WHERE c0.contype = 'f'
        AND c0.confrelid > 0
        AND c0.connamespace = n0.oid
        AND c0.conrelid = p1.oid
        AND c0.confrelid = p2.oid
        AND c0.conrelid = a1.attrelid
        AND a1.attnum = ANY (c0.conkey)
        AND c0.confrelid = a2.attrelid
        AND a2.attnum = ANY (c0.confkey)
        AND n0.nspname = 'public'
        AND p1.relname = c.relname --'iris_account'
        AND a1.attname = a.attname --'cityid'
      )),
      (SELECT id FROM iris_constraintaction WHERE code=
        (SELECT case 
        when c0.confdeltype = 'r' then 'RESTRICT' 
        when c0.confdeltype = 'd' then 'SET DEFAULT'
        when c0.confdeltype = 'a' then 'NO ACTION'
        when c0.confdeltype = 'c' then 'CASCADE'
        when c0.confdeltype = 'n' then 'SET NULL'
        else '' end 
        FROM pg_constraint c0, pg_namespace n0,
        pg_class p1, pg_class p2,
        pg_attribute a1, pg_attribute a2
        WHERE c0.contype = 'f'
        AND c0.confrelid > 0
        AND c0.connamespace = n0.oid
        AND c0.conrelid = p1.oid
        AND c0.confrelid = p2.oid
        AND c0.conrelid = a1.attrelid
        AND a1.attnum = ANY (c0.conkey)
        AND c0.confrelid = a2.attrelid
        AND a2.attnum = ANY (c0.confkey)
        AND n0.nspname = 'public'
        AND p1.relname = c.relname --'iris_account'
        AND a1.attname = a.attname --'cityid'
      )),
      (SELECT id FROM iris_constraintaction WHERE code=
        (SELECT case 
        when c0.confupdtype = 'r' then 'RESTRICT' 
        when c0.confupdtype = 'd' then 'SET DEFAULT'
        when c0.confupdtype = 'a' then 'NO ACTION'
        when c0.confupdtype = 'c' then 'CASCADE'
        when c0.confupdtype = 'n' then 'SET NULL'
        else '' end 
        FROM pg_constraint c0, pg_namespace n0,
        pg_class p1, pg_class p2,
        pg_attribute a1, pg_attribute a2
        WHERE c0.contype = 'f'
        AND c0.confrelid > 0
        AND c0.connamespace = n0.oid
        AND c0.conrelid = p1.oid
        AND c0.confrelid = p2.oid
        AND c0.conrelid = a1.attrelid
        AND a1.attnum = ANY (c0.conkey)
        AND c0.confrelid = a2.attrelid
        AND a2.attnum = ANY (c0.confkey)
        AND n0.nspname = 'public'
        AND p1.relname = c.relname --'iris_account'
        AND a1.attname = a.attname --'cityid'
      )),
      case when a.attname='id' then 1 else 0 end,
      (SELECT c0.conname--, p1.relname, a1.attname
        FROM pg_constraint c0, pg_namespace n0,
        pg_class p1,
        pg_attribute a1
        WHERE  c0.contype = 'p'
        AND c0.connamespace = n0.oid
        AND c0.conrelid = p1.oid
        AND c0.conrelid = a1.attrelid
        AND a1.attnum = ANY (c0.conkey)
        AND p1.relname = c.relname --'iris_account'
        AND a1.attname = a.attname --'id'
      ),
     ( 
    SELECT relname--, attname--, indkey
      FROM pg_class, pg_index, pg_attribute
     WHERE pg_class.oid = pg_index.indexrelid
       AND pg_class.oid IN (
        SELECT indexrelid--, relname
          FROM pg_index, pg_class
         WHERE pg_class.relname=c.relname--'iris_account'
           AND pg_class.oid=pg_index.indrelid
       --    AND indisunique != 't'
           AND indisprimary != 't'
           AND indnatts != 2
       )
    AND pg_attribute.attrelid = pg_class.oid
    AND pg_attribute.attname = a.attname--'id'
    )
    FROM pg_class c LEFT OUTER JOIN pg_namespace n ON c.relnamespace=n.oid,
           pg_attribute a
    WHERE (n.nspname = 'public' OR n.oid IS NULL)
       AND a.attrelid = c.oid AND c.relname IN (SELECT code FROM iris_table) --'iris_account'
       AND a.attnum > 0
       AND NOT a.attname LIKE '%pg.dropped.%'
     
    --Автозаполнение колонок - конец
     
  • При выполнении подготовленного скрипта возникает следующая ошибка.

    ERROR:  ошибка синтаксиса в или рядом ";"
    LINE __: ALTER TABLE iris_pact ADD COLUMN "term" ;

    Причина. При подготовке SQL скрипта не было найдено подходящего типа для колонки в таблице iris_ColumnType (справочник Типы колонок таблиц).

    Решение. Добавьте нужный тип в таблицу iris_ColumnType (справочник Типы колонок таблиц), повторите создание скрипта и повторите попытку выполнения скрипта. Либо самостоятельно подкорректируйте SQL скрипт.

  • При выполнении подготовленного скрипта возникает следующая ошибка.

    ERROR:  insert or update on table "iris_account" violates foreign key constraint "fk_iris_account_accountfaceid"
    DETAIL:  Ключ (accountfaceid)=(3f2afaf5-d1e7-774e-4f07-d6def4f84fda) отсутствует в таблице "iris_accountface".

    Причина. В рабочей базе не было обнаружено описание таблицы iris_accountface. Поэтому из нее не были перенесены данные в новую базу. И при вставке значений в таблицу компаний нарушается ссылочная целостность.

    Решение. Добавьте в разделе Администрирование→Таблицы таблицу iris_accountface.

    Или выполните следующий скрипт.

    INSERT INTO iris_table (id, name, code) VALUES (iris_genguid(), 'Лицо', 'iris_accountface');
    --INSERT INTO iris_table (id, name, code) VALUES (iris_genguid(), 'Статусы компаний', 'iris_accountstate');
    --INSERT INTO iris_table (id, name, code) VALUES (iris_genguid(), 'Категори компаний', 'iris_category');

    Сразу проверьте, скорее всего у Вас не описаны также таблицы iris_accountstate, iris_category.

    После этого необходимо заново сформировать описание колонок.

    Для этого выполните следующий скрипт.

    --Автозаполнение колонок - начало
     
    DELETE FROM iris_table_column;
    INSERT INTO iris_table_column(id, code, tableid, columntypeid, "name", 
    isnotnull, defaultvalue, fkname, fktableid, ondeleteid, onupdateid, isprimary, pkname, indexname)
    SELECT iris_genguid(),
      a.attname,
      (SELECT id FROM iris_table WHERE code=c.relname),
      (SELECT id FROM iris_columntype WHERE code=format_type(a.atttypid, a.atttypmod)),
      (SELECT description FROM pg_description WHERE objoid=c.oid AND objsubid=a.attnum),
      CASE WHEN a.attnotnull THEN 1 ELSE 0 END AS fields_not_null,
      (SELECT adsrc FROM pg_attrdef WHERE adrelid=c.oid AND adnum=a.attnum),
      (SELECT c0.conname
        FROM pg_constraint c0, pg_namespace n0,
        pg_class p1, pg_class p2,
        pg_attribute a1, pg_attribute a2
        WHERE c0.contype = 'f'
        AND c0.confrelid > 0
        AND c0.connamespace = n0.oid
        AND c0.conrelid = p1.oid
        AND c0.confrelid = p2.oid
        AND c0.conrelid = a1.attrelid
        AND a1.attnum = ANY (c0.conkey)
        AND c0.confrelid = a2.attrelid
        AND a2.attnum = ANY (c0.confkey)
        AND n0.nspname = 'public'
        AND p1.relname = c.relname --'iris_account'
        AND a1.attname = a.attname --'cityid'
      ),
      (SELECT id FROM iris_table WHERE code=
        (SELECT p2.relname AS table2
        FROM pg_constraint c0, pg_namespace n0,
        pg_class p1, pg_class p2,
        pg_attribute a1, pg_attribute a2
        WHERE c0.contype = 'f'
        AND c0.confrelid > 0
        AND c0.connamespace = n0.oid
        AND c0.conrelid = p1.oid
        AND c0.confrelid = p2.oid
        AND c0.conrelid = a1.attrelid
        AND a1.attnum = ANY (c0.conkey)
        AND c0.confrelid = a2.attrelid
        AND a2.attnum = ANY (c0.confkey)
        AND n0.nspname = 'public'
        AND p1.relname = c.relname --'iris_account'
        AND a1.attname = a.attname --'cityid'
      )),
      (SELECT id FROM iris_constraintaction WHERE code=
        (SELECT case 
        when c0.confdeltype = 'r' then 'RESTRICT' 
        when c0.confdeltype = 'd' then 'SET DEFAULT'
        when c0.confdeltype = 'a' then 'NO ACTION'
        when c0.confdeltype = 'c' then 'CASCADE'
        when c0.confdeltype = 'n' then 'SET NULL'
        else '' end 
        FROM pg_constraint c0, pg_namespace n0,
        pg_class p1, pg_class p2,
        pg_attribute a1, pg_attribute a2
        WHERE c0.contype = 'f'
        AND c0.confrelid > 0
        AND c0.connamespace = n0.oid
        AND c0.conrelid = p1.oid
        AND c0.confrelid = p2.oid
        AND c0.conrelid = a1.attrelid
        AND a1.attnum = ANY (c0.conkey)
        AND c0.confrelid = a2.attrelid
        AND a2.attnum = ANY (c0.confkey)
        AND n0.nspname = 'public'
        AND p1.relname = c.relname --'iris_account'
        AND a1.attname = a.attname --'cityid'
      )),
      (SELECT id FROM iris_constraintaction WHERE code=
        (SELECT case 
        when c0.confupdtype = 'r' then 'RESTRICT' 
        when c0.confupdtype = 'd' then 'SET DEFAULT'
        when c0.confupdtype = 'a' then 'NO ACTION'
        when c0.confupdtype = 'c' then 'CASCADE'
        when c0.confupdtype = 'n' then 'SET NULL'
        else '' end 
        FROM pg_constraint c0, pg_namespace n0,
        pg_class p1, pg_class p2,
        pg_attribute a1, pg_attribute a2
        WHERE c0.contype = 'f'
        AND c0.confrelid > 0
        AND c0.connamespace = n0.oid
        AND c0.conrelid = p1.oid
        AND c0.confrelid = p2.oid
        AND c0.conrelid = a1.attrelid
        AND a1.attnum = ANY (c0.conkey)
        AND c0.confrelid = a2.attrelid
        AND a2.attnum = ANY (c0.confkey)
        AND n0.nspname = 'public'
        AND p1.relname = c.relname --'iris_account'
        AND a1.attname = a.attname --'cityid'
      )),
      case when a.attname='id' then 1 else 0 end,
      (SELECT c0.conname--, p1.relname, a1.attname
        FROM pg_constraint c0, pg_namespace n0,
        pg_class p1,
        pg_attribute a1
        WHERE  c0.contype = 'p'
        AND c0.connamespace = n0.oid
        AND c0.conrelid = p1.oid
        AND c0.conrelid = a1.attrelid
        AND a1.attnum = ANY (c0.conkey)
        AND p1.relname = c.relname --'iris_account'
        AND a1.attname = a.attname --'id'
      ),
     ( 
    SELECT relname--, attname--, indkey
      FROM pg_class, pg_index, pg_attribute
     WHERE pg_class.oid = pg_index.indexrelid
       AND pg_class.oid IN (
        SELECT indexrelid--, relname
          FROM pg_index, pg_class
         WHERE pg_class.relname=c.relname--'iris_account'
           AND pg_class.oid=pg_index.indrelid
       --    AND indisunique != 't'
           AND indisprimary != 't'
           AND indnatts != 2
       )
    AND pg_attribute.attrelid = pg_class.oid
    AND pg_attribute.attname = a.attname--'id'
    )
    FROM pg_class c LEFT OUTER JOIN pg_namespace n ON c.relnamespace=n.oid,
           pg_attribute a
    WHERE (n.nspname = 'public' OR n.oid IS NULL)
       AND a.attrelid = c.oid AND c.relname IN (SELECT code FROM iris_table) --'iris_account'
       AND a.attnum > 0
       AND NOT a.attname LIKE '%pg.dropped.%'
     
    --Автозаполнение колонок - конец

    После этого из раздела Обновление заново создайте SQL скрипт и снова попытайтесь выполнить его в pgAdmin.

  • При выполнении подготовленного SQL скрипта возникает следующая ошибка.

    ERROR:  duplicate key value violates unique constraint "iris_contact_access_ROLE_UK"

    Причина. В новой базе созданы пользователи и к некоторым записям они указаны в правах доступа. При добавлении новых записей во вкладки Доступ нарушаются ограничения целостности.

    Решение. Удалите записи из вкладок Доступ в новой базе.

    Для этого можно выполнить следующий скрипт.

    DELETE FROM iris_account_access;
    DELETE FROM iris_contact_access;
    DELETE FROM iris_report_access;
    DELETE FROM iris_printform_access;
  • При выполнении подготовленного SQL скрипта возникает следующая ошибка.

    ERROR:  колонка "isremind" содержит значения NULL

    Причина. При переносе данных в новой базе сначала снимаются ограничения NOT NULL и после переноса данных эти ограничения возвращаются. Если появилась такая ошибка, то это значит, что в рабочей базе не все обязательные данные были заполнены.

    Решение. Заполните данные в рабочей базе и повторите процедуру обновления. Либо закомментируйте строки SQL запроса, в которых возникает ошибка. После выполнения запроса заполните в новой базе необходимые поля и повторите попытку выполнения не выполнившихся строк запроса.

Навигация