Ćwiczenia > Perspektywy w MS SQL Server 2000 > Modyfikowanie danych przy użyciu perspektyw

7.2 Modyfikowanie danych przy użyciu perspektyw



Utworzenie widoku nie powoduje utworzenia kopii danych. Widok jest "szablonem", za pomocą którego wyświetlamy dane. Modyfikacja danych widoku polega więc w rzeczywistości na modyfikacji danych w tabelach będących źródłem danych dla widoku.

Istnieje kilka ograniczeń co do modyfikacji danych przy użyciu widoków:
- widok używany do modyfikacji danych nie może zawierać funkcji grupujących,
- jednym poleceniem można modyfikować w widoku tylko kolumny pochodzące z jednej tabeli (lub dodawać dane do jednej tabeli),
- modyfikowane dane nie mogą być wartościami obliczonymi na podstawie wartości innych kolumn,
- wstawienie nie może naruszać warunków narzuconych w tabelach źródłowych (dotyczy to także, a może w szczególności, pól tabeli, które nie wchodzą w skład widoku - jeśli mają one ustawione opcję NOT NULL, to przy pomocy widoku nie można do tej tabeli wstawić nowych danych),
- wstawiane dane muszą być zgodne z warunkiem WITH CHECK OPTION w definicji widoku.

Zobaczmy przykłady wstawiania i modyfikacji danych przy użyciu widoków.

Do przeprowadzenia niniejszego ćwiczenia niezbędne jest przeprowadzenie ćwiczenia z lekcji poprzedniej (musisz musisz w bazie danych Biblioteka utworzyć widok widok_ksiazki_wydawnictwa). Ponadto niezbędne jest wcześniejsze przeprowadzenie ćwiczenia z lekcji 3.10 Import i eksport danych (musisz zaimportować dane do bazy danych Biblioteka).


Krok 1 - Modyfikuj dane przy użyciu widoku używając polecenia UPDATE

1. Uruchom program Query Analyzer.
2. Zaloguj się używając uwierzytelnienia systemu Windows.
3. W menu głównym programu wybierz File - Open.
4. W oknie Open Query File wybierz plik demo_7_2_1.sql.
5. Zaznacz i uruchom (klawisz F5) fragmenty kodu oznaczone w komentarzach jako (1) i (2).


-- (1) ustawmy Biblioteke jako baze robocza 
USE Biblioteka
GO

-- (2) sprawdzmy, jakie dane zawiera widok
SELECT * FROM widok_ksiazki_wydawnictwa
GO


Sprawdzamy w ten sposób, jakie dane zawiera widok widok_ksiazki_wydawnictwa.

tytul                                          rok_wydania wydawnictwo
---------------------------------------------- ----------- ----------- 
SQL Server 2000. Vademecum Administratora      2001        MS Press
Windows Server 2003. Vademecum Administratora  2003        MS Press
UML w kropelce                                 2002        LTP
MS Access wersja 2002 dla ekspertów            2003        MS Press
XML na poważnie                                2002        Helion

(5 row(s) affected)
6. Zaznacz i uruchom (F5) fragment kodu oznaczony w komentarzu jako (3).


-- (3) dokonajmy modyfikacji danych
-- przy uzyciu widoku
UPDATE widok_ksiazki_wydawnictwa
SET wydawnictwo = 'Promise'
WHERE wydawnictwo = 'MS Press'
GO


Wynikiem wykonania powyższego kodu jest zmodyfikowanie nazwy wydawnictwa "MS Press" na "Promise".

7. Zaznacz i uruchom (F5) ponownie fragment kodu oznaczony w komentarzu jako (2) i sprawdź, czy rzeczywiście nazwa wydawnictwa uległa zmianie.
8. Zaznacz i uruchom (F5) fragment kodu oznaczony w komentarzu jako (4).


-- (4) zobaczmy, jak zmienila sie
-- zawartosc tabeli Wydawnictwa
SELECT * FROM Wydawnictwa
GO


Wynikiem wykonania powyższego kodu jest wyświetlenie zawartości tabeli Wydawnictwa.

ID_wydawnictwa wydawnictwo
-------------- -----------
1              Promise
2              LTP
3              Helion

(3 row(s) affected)
Jak widać na pozycji pierwszej w kolumnie wydawnictwo mamy wartość "Promise" zamiast dotychczasowej "MS Press". Czyli tak naprawdę modyfikacji nie ulegają dane w widoku, ale w jednej z tabel wykorzystywanych w definicji widoku.

Krok 2 - Dodawaj nowe dane przy użyciu widoku używając polecenia INSERT

1. Zaznacz i uruchom (F5) fragment kodu oznaczony w komentarzu jako (4).


-- (5) sprobujmy wstawic dane uzywajac
-- widoku widok_ksiazki_wydawnictwa
INSERT INTO widok_ksiazki_wydawnictwa(tytul,rok_wydania,wydawnictwo)
VALUES ('SQL Server','2000','Promise')
GO


Wynikiem próby wykonania powyższego kodu jest błąd mówiący o tym, że nie możemy zmodyfikować danych w widoku, ponieważ polecenie usiłuje modyfikować dane w więcej niż jednej tabeli bazowej widoku.

2. Zaznacz i uruchom (F5) fragment kodu oznaczony w komentarzu jako (6).


-- (6) utworzmy nieco zmodyfikowany widok
CREATE VIEW widok_ksiazki_wydawnictwa_2 
AS
SELECT Ksiazki.tytul, Ksiazki.rok_wydania, Ksiazki.ID_wydawnictwa, Wydawnictwa.wydawnictwo
FROM Ksiazki
INNER JOIN Wydawnictwa
ON Ksiazki.ID_wydawnictwa = Wydawnictwa.ID_wydawnictwa
GO


Wynikiem wykonania powyższego kodu jest utworzenie widoku o nazwie widok_ksiazki_wydawnictwa_2 podobnego do poprzednio utworzonego widoku widok_ksiazki_wydawnictwa. Jedyną zmianą w budowie widoku jest włączenie do widoku kolumny ID_wydawnictwa z tabeli Ksiazki.

3. Zaznacz i uruchom (F5) fragment kodu oznaczony w komentarzu jako (7).


-- (7) sprawdzmy, jakie dane zawiera widok
SELECT * FROM widok_ksiazki_wydawnictwa_2
GO


Wynikiem wykonania powyższego kodu jest wyświetlenie danych ze świeżo utworzonego widoku widok_ksiazki_wydawnictwa_2.

tytul                                          rok_wydania ID_wydawnictwa wydawnictwo
---------------------------------------------- ----------- -------------- ----------- 
SQL Server 2000. Vademecum Administratora      2001        1              Promise
Windows Server 2003. Vademecum Administratora  2003        1              Promise
UML w kropelce                                 2002        2              LTP
MS Access wersja 2002 dla ekspertów            2003        1              Promise
XML na poważnie                                2002        3              Helion

(5 row(s) affected)
4. Zaznacz i uruchom (F5) fragment kodu oznaczony w komentarzu jako (8).


-- (8) sprobujmy wstawic dane uzywajac
-- widoku widok_ksiazki_wydawnictwa
INSERT INTO widok_ksiazki_wydawnictwa_2(tytul,rok_wydania,ID_wydawnictwa)
VALUES ('SQL Server','2000',1)
GO


Wynikiem wykonania powyższego kodu jest wstawienie nowego wiersza do tabeli Ksiazki (mimo, że wstawiamy dane w widok). Powyższą operację możemy wykonać, ponieważ w tabeli Wydawnictwa istnieje wiersz mający w kolumnie ID_wydawnictwa wartość 1 (tabela Ksiazki korzysta z tej kolumny na potrzeby własnej kolumny - klucza obcego - ID_wydawnictwa). Gdybyśmy usiłowali jednocześnie wstawić nieistniejące wydawnictwo, polecenie INSERT zwróciłoby błąd.

5. Zaznacz i uruchom (F5) ponownie fragment kodu oznaczony w komentarzu jako (7).

Tym razem wynikiem wykonania zapytania SELECT jest wyświetlenie danych z widoku widok_ksiazki_wydawnictwa_2 z nowo dodanym wierszem (zaznaczyliśmy go na czerwono).

tytul                                          rok_wydania ID_wydawnictwa wydawnictwo
---------------------------------------------- ----------- -------------- ----------- 
SQL Server 2000. Vademecum Administratora      2001        1              Promise
Windows Server 2003. Vademecum Administratora  2003        1              Promise
UML w kropelce                                 2002        2              LTP
MS Access wersja 2002 dla ekspertów            2003        1              Promise
XML na poważnie                                2002        3              Helion
SQL Server                                     2000        1              Promise

(5 row(s) affected)
Jak widzisz, nie zawsze należy unikać umieszczania w widokach kluczy, które nie są interesujące dla użytkownika. Jeśli zamierzasz używać widoku do modyfikacji danych, musisz zaplanować tak strukturę widoku, by serwer mógł bez trudu poruszać się przy modyfikacjach po tabelach bazowych widoku (modyfikując jedną tabelę za każdym razem).

Pamiętaj, że zawarcie w widoku kolumny nie oznacza, że użytkownik będzie ją oglądał. Przy wykonywaniu polecenia SELECT na widokach także możesz użyć ograniczenia ilości wyświetlanych kolumn (i rekordów).


Wybierz jeden lub dwa widoki z projektu Prace dyplomowe i w dokumentacji w punkcie poświęconym widokom skomentuj możliwość modyfikacji i dodawania danych przy użyciu tych widoków. Utwórz co najmniej jeden widok (złożony z kolumn wziętych z wielu tabel), za pomocą którego można edytować dane w tabelach bazowych (w przynajmniej jednej tabeli). Definicję tego widoku umieść w skrypcie o nazwie widoki_mod.sql i dołącz do projektu.


Przejdź dalej



Ćwiczenia > Perspektywy w MS SQL Server 2000 > Modyfikowanie danych przy użyciu perspektyw