|
Перечислители (SEQUENCE) в Oracle 8i...
|
|||
---|---|---|---|
#18+
Ребят, помощи прошу, подскажите правильный ли у меня ход мысли?! Я создаю таблицу в Oracle, обозначаю первичный ключ, создаю перечислитель (SEQUENCE) и... дальше непонятки как работает этот перечислитель??? Я думаю, что его надо создавать один для всех первичных ключей? Или для каждой таблицы и каждого уникального ключа свой? -- Последовательность для генерации первичных ключей CREATE SEQUENCE s_clients START WITH 1 INCREMENT BY 1; -- Клиенты CREATE TABLE t_clients ( id NUMBER(20) NOT NULL, olf NVARCHAR2(7) NULL, -- Орг.-пр.форма long_title NVARCHAR2(200) NULL, -- Полное имя short_title NVARCHAR2(70) NULL, -- Краткое имя inn NVARCHAR2(12) NULL, -- ИНН okpo NVARCHAR2(20) NULL, -- ОКПО kpp NVARCHAR2(9) NULL, -- КПП CONSTRAINT pk_clients PRIMARY KEY (id) ); Неудобно как-то получается... а если я в Делфи захочу сделать вставку полей в dbGrid-е? Откуда "Оракул" возьмёт значение первичного ключа?! Тригер на вставку писать?Вопрос: как организовать ключи (включая и foreign key), чтоб сохранилась целостность данных? Может есть какая нибудь хитрость? Поделитесь опытом, плиз!Вообще я на Оракула с MS SQL Server пересел... может есть какой нибудь AUTOINCREMENT?! Сбросте, кому не жалко, на мыло сценарии на PL/SQL, буду очень признателен. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.09.2002, 12:17 |
|
Перечислители (SEQUENCE) в Oracle 8i...
|
|||
---|---|---|---|
#18+
Упс! А ящик-то я свой и не указал :). Неправильно как-то :). Ящик мой: zemal@fronda.ru или AZemlyansky@fronda.ru ... |
|||
:
Нравится:
Не нравится:
|
|||
03.09.2002, 12:22 |
|
Перечислители (SEQUENCE) в Oracle 8i...
|
|||
---|---|---|---|
#18+
> Я думаю, что его надо создавать один для всех первичных ключей? Или для каждой таблицы и каждого уникального ключа свой? Как хочешь. Оба варианта имеют право на жизнь. >Откуда "Оракул" возьмёт значение первичного ключа?! Тригер на вставку писать? Да или обязать это делать клиента. >Вопрос: как организовать ключи (включая и foreign key), чтоб сохранилась целостность данных? А в чем проблема? >может есть какой нибудь AUTOINCREMENT?! Нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.09.2002, 12:34 |
|
Перечислители (SEQUENCE) в Oracle 8i...
|
|||
---|---|---|---|
#18+
Значит без тригера не обойтись... :( жаль, что такая морока... как-то неудобно и непривычно с "мелкософта" на серьёзные вещи переходить :). Значит будет всё писать с нуля и ручками... не хочу я с "ервин"-ом мучатся :). ... |
|||
:
Нравится:
Не нравится:
|
|||
03.09.2002, 12:47 |
|
Перечислители (SEQUENCE) в Oracle 8i...
|
|||
---|---|---|---|
#18+
Триггер писать прийдется, или insert ручками писать А лучше всего найти такой компанент для Delphi DOA(Direct Oracle Access) и все твои проблемы пропадут ... |
|||
:
Нравится:
Не нравится:
|
|||
03.09.2002, 13:14 |
|
Перечислители (SEQUENCE) в Oracle 8i...
|
|||
---|---|---|---|
#18+
Знаю такое дело... вот только мне посоветовали пользоваться ODAC, а совсем не DOA :)... говорят, что ODAC круче и удобнее :). Кстати, я не понял... получается, что компонент будет сам ворочить ключами?! Это не есть хорошо!!! Я не люблю, когда клиенту так открыта БД!!! Так не должно быть!!! Это уже называется распределённая логика! Всё должно выполняться и формироваться на сервере, а не на клиенте!!! Вот от этого БД и падают, потому что клиенты пытаются одновременно одинаковые клюси в уникальное поле запихать!!! Я прихожу к мнению, что DOA мне неподходит :). ... |
|||
:
Нравится:
Не нравится:
|
|||
03.09.2002, 13:43 |
|
Перечислители (SEQUENCE) в Oracle 8i...
|
|||
---|---|---|---|
#18+
>вот только мне посоветовали пользоваться ODAC, а совсем не DOA :)... говорят, что ODAC круче и удобнее :). Это вопрос религии. Я использую и то и другое, в зависимости от положения звёзд :). >Кстати, я не понял... получается, что компонент будет сам ворочить ключами?! Нет там такого. Просто многие веши сделаны более прямо чем у ADO, BDE и др. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.09.2002, 14:10 |
|
Перечислители (SEQUENCE) в Oracle 8i...
|
|||
---|---|---|---|
#18+
ODAC или DOA, вам решать Просто в DOA есть такое свойство у Query SequenceField в котором можно указать, что для поля ID использовать такой-то sequence. А уж если вы перепутаете sequence, так его можно и в триггере запросто перепутать. Тогда и редактировать таблицы на клиенте не хорошо, пускай этим процедуры на сервере занимаются. Все это довольно спрорные вопросы, я считаю что sequence Oracle значительно удобнее identity MS SQL, другие может быть со мной будут не согласны ... |
|||
:
Нравится:
Не нравится:
|
|||
03.09.2002, 14:37 |
|
Перечислители (SEQUENCE) в Oracle 8i...
|
|||
---|---|---|---|
#18+
Вернее не у Query а у TOracleDataSet ... |
|||
:
Нравится:
Не нравится:
|
|||
03.09.2002, 14:38 |
|
Перечислители (SEQUENCE) в Oracle 8i...
|
|||
---|---|---|---|
#18+
Так! Теперь понял! А что, у ODAC нет перечислений :). Я всё равно уже тригером реализовал генерацию уникального значения первичного ключа. Я думаю так будет лучше :). Вот такой получился тригер: CREATE OR REPLACE TRIGGER c_tr_bi_clients BEFORE INSERT ON c_t_clients FOR EACH ROW BEGIN SELECT MAX(id)+1 INTO :new.id FROM c_t_clients; END c_tr_bi_clients; ... |
|||
:
Нравится:
Не нравится:
|
|||
03.09.2002, 15:38 |
|
Перечислители (SEQUENCE) в Oracle 8i...
|
|||
---|---|---|---|
#18+
Есть у ODAC поддержка перечислений. в свойстве KeySequence для TOraQuery надо указать имя перечисления для ключевого поля. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.09.2002, 15:52 |
|
Перечислители (SEQUENCE) в Oracle 8i...
|
|||
---|---|---|---|
#18+
>CREATE OR REPLACE TRIGGER c_tr_bi_clients >BEFORE INSERT ON c_t_clients >FOR EACH ROW >BEGIN >SELECT MAX(id)+1 >INTO :new.id >FROM c_t_clients; >END c_tr_bi_clients; А где тут гарантия уникальности? Только в возвращении опоздавшему с коммитом сообщения об ошибке про дупликацию первичного ключа? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.09.2002, 15:57 |
|
Перечислители (SEQUENCE) в Oracle 8i...
|
|||
---|---|---|---|
#18+
Да ладно уж... ну извратился я :)... уже исправился :). Воспользовался функцией NEXTVAL в тригере на генерацию ключа :). Спасибо всем за просвещение :). Большое спасибо! ... |
|||
:
Нравится:
Не нравится:
|
|||
03.09.2002, 16:25 |
|
Перечислители (SEQUENCE) в Oracle 8i...
|
|||
---|---|---|---|
#18+
2 Alex Zemlyansky и что триггер с SELECT MAX(id)+1 у тебя работал??? Вроде как должно было ORA-04091 вылезти... ... |
|||
:
Нравится:
Не нравится:
|
|||
04.09.2002, 12:57 |
|
Перечислители (SEQUENCE) в Oracle 8i...
|
|||
---|---|---|---|
#18+
> alvako С точки зрения 8 Оракула все нормально и все работает. Другой вопрос об эффективности... ... |
|||
:
Нравится:
Не нравится:
|
|||
04.09.2002, 13:08 |
|
Перечислители (SEQUENCE) в Oracle 8i...
|
|||
---|---|---|---|
#18+
2 Alvako У меня вариации с MAX работали. Ошибок TABLE IS MUTATING не было. Я предпочитаю чуть-чуть другую конструкцию триггера на автоинкремент: create or replace trigger my_trigger before insert on my_table for each row begin if :new.my_autoencriment is null then select my_sequence.NEXTVAL from dual; end if; end; Проверка на пустое значение автоинкрементального поля расширяет мои возможности. Хочу значение подставляю сам, а не хочу, пусть об этом Oracle заботится :) ... |
|||
:
Нравится:
Не нравится:
|
|||
04.09.2002, 21:22 |
|
Перечислители (SEQUENCE) в Oracle 8i...
|
|||
---|---|---|---|
#18+
to SAA_ вот тогда ты точно на проблемы с уникальностью значения в поле нарвешься :) ... |
|||
:
Нравится:
Не нравится:
|
|||
05.09.2002, 11:28 |
|
Перечислители (SEQUENCE) в Oracle 8i...
|
|||
---|---|---|---|
#18+
Неа... скорее я просто защищаюсь от собственной забывчивости. В своих программах я предпочитаю использовать ту же последовательность, ну а если забыл, то в этом мне поможет триггер. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.09.2002, 12:21 |
|
Перечислители (SEQUENCE) в Oracle 8i...
|
|||
---|---|---|---|
#18+
Из-за аналогичной идеи "защищаться от собственной забывчивости" (использовали аналогичный подход на триггере) мы недавно поплатились данными. Дело в том, что продвинутые и ленивые пользователи нашли в Forms (6i) такую дивную функцию - Дублировать запись. А прикол в том, что эта функция дублирует данный блок полностью в том числе и поля с ключами. В итоге получились записи с дублирующимися ключами. Так что если вы имеете дело с формс и поле у Вас не primary key, лучше убрать проверку на null. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.09.2002, 15:15 |
|
Перечислители (SEQUENCE) в Oracle 8i...
|
|||
---|---|---|---|
#18+
Поясню немного за месье SAA_, так как знаю специфику его приложений :) Так вот, в этих приложениях последовательности используются только на полях, которые являются primary key. А пользователь в формах этот ID даже не видит. Плюс триггеры получаются универсальные на before insert on update: Код: plaintext 1. 2. 3. 4. 5.
2SAA_ А почему при аналогичном триггере, но вместо MAX(amt) стояло SUM(amt) вылезал TABLE IS MUTATING TABLE ??? Или я чего-то про то, как работает MAX не понимаю? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.09.2002, 01:05 |
|
Перечислители (SEQUENCE) в Oracle 8i...
|
|||
---|---|---|---|
#18+
Я упомянул, что этот косячек вылезет если это поле не primary key. А насчет того, что "это поле пользователи даже не видят" так в этом как раз таки и загвоздка, что пользователи этого поля не видят, но оно все равно дублируется (т.к. оно есть в блоке данных). А в блоке данных оно должно быть, чтобы Вы могли ему присвоить вручную ключ. А насчет универсальности триггера - в данном случае он также универсален: Код: plaintext 1. 2. 3. 4. 5. 6.
... |
|||
:
Нравится:
Не нравится:
|
|||
06.09.2002, 09:09 |
|
Перечислители (SEQUENCE) в Oracle 8i...
|
|||
---|---|---|---|
#18+
Я упомянул, что этот косячек вылезет если это поле не primary key. А насчет того, что "это поле пользователи даже не видят" так в этом как раз таки и загвоздка, что пользователи этого поля не видят, но оно все равно дублируется (т.к. оно есть в блоке данных). А в блоке данных оно должно быть, чтобы Вы могли ему присвоить вручную ключ. А насчет универсальности триггера - в данном случае он также универсален: Код: plaintext 1. 2. 3. 4. 5. 6.
... |
|||
:
Нравится:
Не нравится:
|
|||
06.09.2002, 09:09 |
|
Перечислители (SEQUENCE) в Oracle 8i...
|
|||
---|---|---|---|
#18+
Ljublju kogda umnie ljudi kritikujut metodi... no esli uchest escho odnu specifiku moih prilozenij na Developer 6i, to ja bi skazal tak: Est u nas odin proizvditel softa blagodarja kotoromu ja nauchilsja delat sledujuschie triggeri na forme s prostenkim tekstom NULL; Narpimer triggeri KEY-CLRBLK, KEY-DELREC, KEY-DUPREC chto privodit k odnoznachnomu ignoru vot etih zabavnih kombinacij Ctrl+F4, Shift-F6 i prochee. A est escho odin prikol u moego ljubimogo proizvoditelja... nazimaesh elementarnuju F7 (ENTER_QUERY) i gljadish kak s kazdim F7 u tebja SEQUENCE rastet na edenichku. Ili skazem nazimaesh strelku vniz v forme gde principialno na bloke dolzen bit trigger WHEN-NEW-RECORD-INSTANCE s tekstom FIRST_RECORD; i zabavljaeshsja tem, kak medljeno krushitsja idealogija softa (to vSkv call 2 me by phone) o kotoroj mne vtirali polchasa :) ... |
|||
:
Нравится:
Не нравится:
|
|||
09.09.2002, 23:13 |
|
Перечислители (SEQUENCE) в Oracle 8i...
|
|||
---|---|---|---|
#18+
А вот такой триггер без SEQUENCE обеспечит уникальность?: create or replace trigger proba before insert on proba for each row begin lock table proba in exclusive mode; select decode(max(n1),null,0,max(n1))+1 into :new.n1 from proba; end; ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2002, 16:23 |
|
Перечислители (SEQUENCE) в Oracle 8i...
|
|||
---|---|---|---|
#18+
>А вот такой триггер без SEQUENCE обеспечит >уникальность?: > >create or replace trigger proba before insert on proba >for each row >begin >lock table proba in exclusive mode; >select decode(max(n1),null,0,max(n1))+1 into :new.n1 from >proba; >end; Вывалится в ошибку ORA-04091 про мутирующую таблицу. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2002, 16:41 |
|
|
start [/forum/topic.php?fid=52&msg=32049436&tid=1992646]: |
0ms |
get settings: |
7ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
33ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
50ms |
get tp. blocked users: |
1ms |
others: | 11ms |
total: | 130ms |
0 / 0 |