Oracle 10: локально распределенная система, проблемы с UDT - PullRequest
0 голосов
/ 12 декабря 2010

Мне нужно настроить распределенную объектно-реляционную систему с репликацией между двумя пользователями в той же базе данных .То есть у меня есть база данных с двумя пользователями User1 и User2 .Оба они используют один и тот же сценарий для создания типов объектов и таблиц.Некоторые из этих таблиц должны иметь одинаковое содержимое для каждого пользователя, поэтому я использую триггеры, поэтому всякий раз, когда происходит изменение на одной стороне, оно реплицируется на другой стороне.

Предположим, существует UDT с именем DepartmentType и еще один с именем AreaType .Каждый Район связан с одним Департаментом, и Департамент может включать много Районов.Итак, AreaType имеет ссылку на DepartmentType, а DepartmentType имеет вложенную таблицу ссылок на AreaTypes.Эта вложенная таблица имеет тип NT_AreasInDepartment (например).Оба типа имеют первичный ключ с именем Name.Это триггер для вставок в таблицу Department:

CREATE OR REPLACE TRIGGER NewDept
AFTER INSERT
ON DeptObj
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
BEGIN
   INSERT INTO DIST_DeptObj VALUES (:NEW.Name, :NEW.Areas);
END NewDept;
/

Не работает, он говорит, что ожидался User1.NT_AreasInDepartment, но был обнаружен User2.NT_AreasInDepartment (ошибка ORA-00932).Если я использую

INSERT INTO DIST_DeptObj VALUES (:NEW.Name, :NULL);

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

INSERT INTO DIST_DeptObj VALUES (:NEW.Name, NT_AreasInDepartment());

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

Есть ли способ иметь один и тот жетипы объектов, используемые двумя пользователями?

Отказ от ответственности: Возможно, это выглядит странно, и могут быть более простые способы сделать это, но я боюсь, что это то, что меня просили.То есть да, это задание колледжа.Если бы это зависело от меня, я бы даже не использовал Oracle.

Ответы [ 2 ]

2 голосов
/ 13 декабря 2010

Да, это выглядит ужасно.Во-первых, я бы выбрал один UDT, на который ссылаются как user1, так и user2.

Если это не удастся, я бы хотел какую-то явную функцию, которая разбивает user1.udt на его компоненты (VARCHAR2, числа, датыи т. д.) и использует их при вызове конструктора user2.udt.И наоборот.

Стоит также рассмотреть извлечение / конструктор на основе XML (особенно в производственной среде, если есть вероятность того, что определения UDT выйдут из строя, что почти наверняка произойдет в реальной жизни).

1 голос
/ 13 декабря 2010

Таким образом, проблема заключается в том, что Oracle применяет строгую типизацию для своих пользовательских типов.Неважно, что User1.NT_AreasInDepartment и User2.NT_AreasInDepartment имеют одинаковые подписи: они объявлены в отдельных схемах и поэтому являются разными объектами в отношении базы данных.

"Есть ли способиметь одинаковые типы объектов, используемые двумя пользователями? "

Ну, самый простой способ - это владеть NT_AreasInDepartment, принадлежащим только пользователю User1, который предоставляет EXECUTE для этого пользователю User2.Однако, если вы хотите, чтобы обе схемы совместно использовали идентичные сценарии - и это, безусловно, облегчает управление реплицированными средами - тогда представьте новую схему User0, которая владеет всеми объектами и предоставляет EXECUTE для них обоим пользователям..

...