Foreign Keys проверка

Lav
Дата: 02.08.2005 12:06:31
Доброго времени суток!!!

Господа, я вот задался таким вопросом:

- А можно ли проверить запись(Rowid) на предмет ссылок на нее по Foreign кеям из других таблиц? Что-то типа статуса строки, никаких конкретных значений не надо получать просто, используется ли она или нет.

Копал, копал так и не накопал. Если кто-нибудь знает ту функцию или вьюху где можно посмотреть, буду премного благодарен....
Bely
Дата: 02.08.2005 12:13:25
Lav
- А можно ли проверить запись(Rowid) на предмет ссылок на нее по Foreign кеям из других таблиц? Что-то типа статуса строки, никаких конкретных значений не надо получать просто, используется ли она или нет.
А вчем проблема-то?
Делаешь запрос по всем таблицам, которые связаны через FK с данной и считаешь кол-во записей.

Или имеется ввиду "Узнать с какими таблицами данная таблица повязана"?
Это вам в системные VIEW надо для этого.
alex-ls
Дата: 02.08.2005 12:15:17
USER_CONSTRAINTS, USER_CONS_COLUMNS
Lav
Дата: 02.08.2005 12:34:36
с кол-вом записей понятно, но это ресусоемко и контекстно зависимо я хотел что-то типа :
Select  TableConstrRef.Status
from MyTable,  TableConstrRef
where TableConstrRef.Tablename='MyTable' and  TableConstrRef.TableRowId=MyTable.RowId
Tolmachov Dmitiry
Дата: 02.08.2005 13:00:31
Не путай ключи и RowID. RowID - это физический идентификатор строки. Выгрузишь таблицу, а потом заново зальешь, и RowID у строк будут свосем другие. Так что ссылаться по RowID в качестве Foreign Key физического смысла нет. Если foreign key в дочерних таблицах не on delete cascade, то можно пробовать удалять родительскую запись. При наличии дочерних записей будет срабатывать ограничение целостности и выдаваться ошибка ora-02292. При отсутствии родительская запись будет удалена. Естественно, после удаления надо откатить изменения.
PS Способ какой-то опасный я предложил, но зато быстро работает :)
softwarer
Дата: 02.08.2005 14:32:59
Tolmachov Dmitiry
PS Способ какой-то опасный я предложил, но зато быстро работает :)

Работает-то быстро, но не всегда правильно :)
Bely
Дата: 02.08.2005 14:56:01
softwarer
Tolmachov Dmitiry
PS Способ какой-то опасный я предложил, но зато быстро работает :)

Работает-то быстро, но не всегда правильно :)
Это почему, например?
softwarer
Дата: 02.08.2005 15:09:52
Bely

deferred
Vadim_Maximov
Дата: 02.08.2005 15:17:45
softwarer
Bely

deferred
Саша, как ты понимаешь, это решаемый вопрос :)
SQL> -- Create table
SQL> create table TEST
  2  (
  3    ID number
  4  )
  5  ;

Table created.

SQL> -- Create/Recreate check constraints 
SQL> alter table TEST
  2    add constraint TEST_ID_VAL
  3    check (ID IN (0,1))
  4    deferrable initially deferred;

Table altered.

SQL> insert into test values(2);

1 row created.

SQL> commit;
commit
*
ERROR at line 1:
ORA-02091: transaction rolled back
ORA-02290: check constraint (SYS.TEST_ID_VAL) violated

SQL> set constraints all immediate;

Constraint set.

SQL> insert into test values(2);
insert into test values(2)
*
ERROR at line 1:
ORA-02290: check constraint (SYS.TEST_ID_VAL) violated
Oracle newbie
Дата: 02.08.2005 15:27:42
softwarer
Tolmachov Dmitiry
PS Способ какой-то опасный я предложил, но зато быстро работает :)

Работает-то быстро, но не всегда правильно :)

и не всегда быстро :-)