Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Porównaj dwa schematy i zaktualizuj stary schemat o nowe kolumny nowego schematu

Dobrym pomysłem jest porównywanie schematów. Schemat bazy danych jest znacznie bardziej skomplikowany, niż większość ludzi przyznaje, a każda różnica między dwoma schematami bazy danych może powodować błędy.

Jeśli nadal chcesz zrobić to sam, najlepszym rozwiązaniem, jakie znalazłem, jest wyodrębnienie definicji schematu do tekstu, a następnie uruchomienie porównania tekstu. Dopóki wszystko jest posortowane alfabetycznie, możesz użyć funkcji Porównaj dokumenty w programie Microsoft Word (lub FC.EXE, DIFF lub odpowiedniku), aby podkreślić różnice.

Poniższy skrypt SQLPlus wyświetla definicję schematu w kolejności alfabetycznej, aby umożliwić porównanie. Istnieją dwie sekcje. Pierwsza sekcja zawiera listę każdej kolumny w formacie:

table_name.column_name:data_type =data_default  

Druga sekcja wymienia indeksy i ograniczenia w następujący sposób:

PK nazwa_ograniczenia w nazwie_tabeli (lista_kolumn_pk)FK nazwa_ograniczenia w nazwie_tabeli (lista_kolumn_fk)SPRAWDŹ nazwa_ograniczenia w nazwie_tabeli (definicja_ograniczenia) 

Skrypt służy jako przydatne odniesienie do wyodrębniania niektórych szczegółów schematu Oracle. Może to być dobra wiedza, gdy przebywasz w witrynach klientów i nie masz dostępnych zwykłych narzędzi lub gdy zasady bezpieczeństwa uniemożliwiają dostęp do bazy danych witryny klienta bezpośrednio z własnego komputera.

ustaw serwerwyjście na;ustaw serwerwyjście na rozmiar 1000000;deklaruj rowcnt pls_integer :=0; kursor c_column to select nazwa_tabeli, nazwa_kolumny, typ_danych, precyzja_danych, długość_danych, skala_danych, domyślna_danych, wartość null, decode(skala_danych, null, null, ',') przecinek_skala, decode(długość_domyślna, null, null, '=') default_equals from all_tab_columns właściciel =zamówienie 'BCC' według nazwa_tabeli, nazwa_kolumny; kursor c_constraint to wybierz c.table_name, c.constraint_name, decode (c.constraint_type, 'P','PK', 'R','FK', 'C','CHECK', c.constraint_type) bound_type, c. search_condition, cc.column_1||cc.comma_2||cc.column_2||cc.comma_3||cc.column_3||cc.comma_4||cc.column_4|| cc.comma_5||cc.column_5||cc.comma_6||cc.column_6||cc.comma_7||cc.column_7 r_columns z all_constraints c, ( wybierz właściciela, nazwa_tabeli, nazwa_ograniczenia, nvl(max(pozycja),0) max_pozycja, max( decode( pozycja, 1, nazwa_kolumny, null ) ) kolumna_1, max( decode( pozycja, 2, decode(nazwa_kolumny, null, null, ',' ), null ) ) comma_2, max( decode( pozycja, 2 , nazwa_kolumny, null ) ) column_2, max( decode( pozycja, 3, decode(nazwa_kolumny, null, null, ',' ), null ) ) comma_3, max( decode( pozycja, 3, nazwa_kolumny, null )) ) kolumna_3, max ( decode( pozycja, 4, decode(nazwa_kolumny, null, null, ',' ), null ) ) comma_4, max( decode( pozycja, 4, nazwa_kolumny, null ) ) column_4, max( decode( pozycja, 5, decode( nazwa_kolumny, null, null, ',' ), null ) ) comma_5, max( decode( pozycja, 5, nazwa_kolumny, null ) ) column_5, max( decode( pozycja, 6, decode(nazwa_kolumny, null, null, ',' ), null ) ) comma_6, max( decode( pozycja, 6, nazwa_kolumny, null ) ) column_6, max( decode( pozycja, 7, decode(nazwa_kolumny, null, null, ',' ), null ) ) przecinek_7, max( decode( pozycja, 7, nazwa_kolumny, null ) ) kolumna_7 z grupy all_cons_columns według właściciela, nazwa_tabeli, nazwa_ograniczenia ) cc gdzie c.właściciel ='UDW' i c.generated !='NAZWA WYGENEROWANA' i cc.właściciel =c.owner i cc.table_name =c.table_name i cc.constraint_name =kolejność c.constraint_name według c.table_name, decode(c.constraint_type, 'P','PK', 'R','FK', 'C ','CHECK', c.constraint_type) desc, c.constraint_name;rozpocznij od c_columnRow w pętli c_column dbms_output.put_line(substr(c_columnRow.table_name||'.'||c_columnRow.column_name|||':'| c_columnRow.data_type||'('|| nvl(c_columnRow.data_precision, c_columnRow.data_length)|| c_columnRow.scale_comma||c_columnRow.data_scale||') '|| c_columnRow.default_equals||c_columnRow.data_default|| ' <'||c_columnRow.nullable||'>',1,255)); wierszcnt :=wierszcnt + 1; pętla końcowa; dla c_constraintRow w pętli c_constraint dbms_output.put_line(substr(c_constraintRow.constraint_type||' '||c_constraintRow.constraint_name||' na '|| c_constraintRow.table_name||' ('|| c_r_constraintRow|lum. ') ',1255)); if length(c_constraintRow.constraint_type||' '||c_constraintRow.constraint_name||' na '|| c_constraintRow.nazwa_tabeli||' ('|| c_constraintRow.search_condition|| c_constraintRow.r_dbm||_255 następnie ') .put_line('... '||substr(c_constraintRow.constraint_type||' '||c_constraintRow.constraint_name||' na '|| c_constraintRow.table_name||' ('|| c_constraintRow.search_condition|| c_constraintRow|. |') ',256,251)); koniec jeśli; wierszcnt :=wierszcnt + 1; end loop;end;/ 

Niestety istnieje kilka ograniczeń:

  1. Osadzone znaki powrotu karetki i odstępy w data_defaults oraz sprawdzanie definicji ograniczeń mogą być wyróżnione jako różnice, nawet jeśli nie mają zerowego wpływu na schemat.
  2. Nie obejmuje kluczy alternatywnych, unikalnych indeksów ani wskaźników wydajności. Wymagałoby to trzeciej instrukcji SELECT w skrypcie, odwołującej się do widoków katalogu all_ind_columns i all_indexes.
  3. Nie zawiera szczegółów zabezpieczeń, synonimów, pakietów, wyzwalaczy itp. Pakiety i wyzwalacze najlepiej porównać przy użyciu podejścia podobnego do tego, które pierwotnie zaproponowałeś. Do powyższego skryptu można dodać inne aspekty definicji schematu.
  4. Powyższe definicje FK identyfikują odwołujące się kolumny klucza obcego, ale nie PK lub tabelę, do której się odwołuje. Jeszcze jeden szczegół, do którego nigdy nie dotarłem.

Nawet jeśli nie używasz skryptu. Jest pewna techniczna przyjemność grania z tym materiałem.;-)

Mateusz



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Efektywność kwartalnego naliczania stanu zatrudnienia

  2. Konwertuj ujemne liczby kolorów na HEX lub RGB

  3. Korzystanie z funkcji utrzymywania aktywności:ORA-00933:polecenie SQL nie zostało poprawnie zakończone

  4. Zrób skumulowaną sumę w widoku wyrocznia

  5. Uzyskiwanie dodatkowych rzędów - Po dołączeniu do 3 stołów za pomocą Left Join