Mariusz
Śpiewakowski
Administrator baz
danych - technolog,
Poczta Polska
Temat: Rozszerzenie wyczerpującego się pola o jedną cyfrę
Opis sytuacji:Wyczerpujące się pole jednostkaid musimy rozszerzyć o jedną cyfrę.
create type tjednostka as object (
jednostkaid number(6),
jednostkanadrzedna ref tjednostka,
...
);
create table jednostka of tjednostka
( jednostkaid not null constraint pkjedn primary key using index,
jednostkanadrzedna not null constraint fkjedn references jednostka,
...
) object id primary key;
-- przykłady insertowania
insert into jednostka values( 1, make_ref( jednostka, 1 ) );
insert into jednostka values( 2, make_ref( jednostka, 1 ) );
...
insert into jednostka values( 999456, make_ref( jednostka, 23456 ) );
-- pole jednostkaid za chwilę się wyczerpie
Alterowanie typu, na którym oparta jest tablica przebiega bez zakłóceń.
Tablica widzi zmiany w polu jednostkaid. Inserty z rozszerzonym id przebiegają bez
zakłóceń.
-- ROZSZERZENIE POLA
alter type tjednostka modify attribute jednostkaid number(7)
cascade including table data;
-- nowa sesja
-- pole jednostkaid jest już number(7), a więc dodajemy jednostki ...
insert into jednostka values( 1000007, make_ref( jednostka, 123456 ) );
-- ten insert jest przyjęty, wydaje się że jest ok ...
Dzieje się tak, aż do momentu gdy w polu jednostkanadrzedna typu REF wskazującym na jednostkę
nadrzędną nie pojawi się odwołanie do rozszerzonego id. Zgłaszany jest wtedy błąd
ORA-01438: "wartość większa niż określona precyzja dozwolona dla tej kolumny".
insert into jednostka values( 1000008, make_ref( jednostka, 1000007 ) );
-- ten insert jest odrzucany, zwracany jest błąd:
-- "ORA-01438: wartość większa niż określona precyzja dozwolona dla tej kolumny".
Wygląda na to, że pole jednostkaid widzi dobrze rozszerzenie swojego atrybutu, ale referencja
do tego typu w jednostkanadrzedna, rozszerzenia swojego typu nie zauważyło.
Dodatkowe spostrzeżenia.
Gdy TOAD buduje skrypt dla typu tjednostka tworzy go z definicji pierwotnej
i listy alterów (lista zmian), co sugeruje, że definicja bieżąca jest wyliczana.
Wydaje się zatem, że w implementacji kontroli wprowadzanych danych
zapomniano o tym fakcie, ale to tylko gdybanie.
Jak wybrnąć z tego kłopotu nie przepisując tablicy ?
Paweł Grzegorz
Kwiatkowski
Senior Consultant,
Capgemini
Temat: Rozszerzenie wyczerpującego się pola o jedną cyfrę
Mariusz Śpiewakowski:...
Opis sytuacji:
Wyczerpujące się pole jednostkaid musimy rozszerzyć o jedną cyfrę.
create type tjednostka as object (
jednostkaid number(6),
jednostkanadrzedna ref tjednostka,
...
);
Dzieje się tak, aż do momentu gdy w polu jednostkanadrzedna typu REF wskazującym na jednostkę
nadrzędną nie pojawi się odwołanie do rozszerzonego id. Zgłaszany jest wtedy błąd
ORA-01438: "wartość większa niż określona precyzja dozwolona dla tej kolumny".
insert into jednostka values( 1000008, make_ref( jednostka, 1000007 ) );
-- ten insert jest odrzucany, zwracany jest błąd:
-- "ORA-01438: wartość większa niż określona precyzja dozwolona dla tej kolumny".
Zdaje się, że w definicji typu TJEDNOSTKA jest NUMBER(6), a nie NUMBER(7). Należałoby zmodyfikować definicję typu TJEDNOSTKA.
alter type TJEDNOSTKA modify attribute (<nazwa atrybutu> number(7));
Mariusz
Śpiewakowski
Administrator baz
danych - technolog,
Poczta Polska
Temat: Rozszerzenie wyczerpującego się pola o jedną cyfrę
No "niby" alter jest poprawnie przeprowadzany:alter type tjednostka modify attribute jednostkaid number(7)
cascade including table data;
Czy może o czymś innym mowa? ...dzięki za odpowiedź
Paweł Grzegorz
Kwiatkowski
Senior Consultant,
Capgemini
