Raportowanie zależności SQL
Zależności SQL są odwołaniami by-name, które są używane w wyrażeniach SQL składających się opierający się na inny obiekt jedną jednostkę zdefiniowaną przez użytkownika.Na przykład widoków i procedur przechowywanych będzie zależała od istnienia tabele zawierające dane zwrócone przez widok lub procedura.Sprawozdawczość w sprawie informacji o zależnościach jest przydatne w następujących scenariuszach:
Przeniesienie modułu, takich jak procedura składowana z jednej aplikacji do innej.
Przed przeniesieniem modułu, można określić, jeśli istnieją bazy danych lub podmioty między bazami danych przez moduł, który również musi być przenoszone wraz z modułu.
Modyfikacja definicji obiekt, takie jak dodanie lub usunięcie kolumna w tabela.
Przed rozpoczęciem modyfikowania obiekt, można określić, jeśli istnieją inne podmioty zależne od bieżącej definicji encji.Te podmioty zależne mogą dawać nieoczekiwane wyniki, gdy kwerenda lub wywoływane po modyfikacji i mogą wymagać operację odświeżania metadane lub modyfikacji do ich definicji.
Przenoszenie jednego lub kilku baz danych z jednego serwera do drugiego.
Przed przeniesieniem baz danych do innego serwera, można określić, czy podmioty w jednej bazie danych mają zależności na podmioty w innej bazie danych.W ten sposób wiadomo przenoszenia tych baz danych na tym samym serwerze.
Konfigurowanie pracy awaryjnej dla aplikacji, które obejmują wiele baz danych.
Aby zapewnić, że aplikacja jest dostępna w wszystkich czasów i użyj dublowanie bazy danych w ramach strategii pracy awaryjnej.Stosowanie zależy od kilku baz danych i chcesz upewnić się, że aplikacja mogą pomyślnie uruchamiać go Jeśli awaryjna serwer duplikatu.Ponieważ dublowania prac poziom bazy danych, trzeba określić, które bazy danych są krytycznych aplikacji, dzięki czemu dublowanie jest zestaw up dla nich indywidualnie.Następnie upewnić, że wszystkie bazy danych praca awaryjna łącznie, zapewnić w ten sposób, że aplikacja działa w serwer duplikatu.
Wyszukiwanie obiektów w aplikacji wykonać przy użyciu nazw czteroczęściowym kwerendami rozproszonymi.
Chcesz wiedzieć, które serwery połączone są używane w kwerendach rozproszonych.
Wyszukiwanie obiektów używane w aplikacji, zawierających odniesienia zależne od wywołującego lub nazwę jednej części odniesienia.
Przed wdrożeniem aplikacji, można określić, czy jednostki używanych przez aplikację zawierać zależne od rozmówcy odwołania lub odwołań do obiektów przy użyciu tylko jednej części nazwy.Takie odniesienia wskazują słabej bezpiecznego programowania i może spowodować nieoczekiwane zachowanie, gdy aplikacja jest rozmieszczana.To dlatego rozdzielczość (powiązanie) Encja — odwołanie zależy od schematu wywołującego, informacja ta nie jest ustalona, do momentu uruchomienia czas.Po znalezieniu tych odwołań, można skorygować kwerend określając odpowiednie wieloczęściową, takich jak schema_name.object_name.
Aby uzyskać więcej informacji o zależnościach SQL, zobacz Opis zależności SQL.
Raportowanie zależności za pomocą systemu widoki i funkcje
Aby wyświetlić zależności SQL SQL Server 2008 zawiera sys.sql_expression_dependencies wykazu widoku i sys.dm_sql_referenced_entities i sys.dm_sql_referencing_entities funkcji dynamicznego zarządzania.Kwerendy można zwrócić na podmioty zdefiniowane przez użytkownika informacji o zależnościach tych obiektów.
Można również wyświetlać zależności SQL za pomocą Wyświetlanie zależności w SQL Server Management Studio.Aby uzyskać więcej informacji, zobacz Jak Wyświetlanie zależności SQL (SQL Server Management Studio).
Za pomocą wykazu widoku sys.sql_expression_dependencies
Sys.sql_expression_dependencies wykazu widok udostępnia właściciel bazy danych lub administrator bazy danych z możliwością raport informacji o zależnościach dla danej bazy danych.W tym widoku można odpowiedzieć globalnego pytania, takie jak:
Jakie zależności między serwerem lub między bazami danych mają się w bazie danych?
Zależności, jaki istnieje w bazie danych?
Podmioty, które w bazie danych mają zależne od rozmówcy odwołania?
Jakie server -poziom lub bazy danych -poziom Wyzwalacze DDL ma zależności obiektów w bazie danych?
Które moduły w bazie danych używają typ zdefiniowany przez użytkownika (UDT)?
sys.sql_expression_dependencies ma następujące ograniczenia:
Zależności między serwerem i między bazami danych podmiotów zwracane są tylko wtedy, gdy określono prawidłową nazwę czteroczęściowym lub trzech części.Identyfikatory odwołanie podmioty nie są zwracane.
Zależności poziom kolumny są zgłaszane tylko dla obiektów związanych ze schematem.
Za pomocą funkcji dynamicznego zarządzania sys.dm_sql_referenced_entities
Sys.dm_sql_referenced_entities funkcja zwraca jeden wiersz dla każdego obiekt użytkownika odwołuje się nazwa definicji określonej obiekt odwołujący się.Odwołujący się obiekt może być zdefiniowane przez użytkownika obiekt, poziom serwera wyzwalacz DLL, lub poziom bazy danych wyzwalacz DLL.Jest to informacje, które są zwracane przez sys.sql_expression_dependencies, jednak zestaw wyników jest ograniczony do podmiotów, które odwołuje się określonego obiekt odwołujący się.Ta funkcja jest przydatna dla deweloperów, którzy chcą śledzenia zależności na moduły właścicielem lub w którym mają uprawnienia w definicji WIDOKU.
Za pomocą funkcji dynamicznego zarządzania sys.dm_sql_referencing_entities
Sys.dm_sql_referencing_entities funkcja zwraca jeden wiersz dla każdego obiekt użytkownika w bieżącej bazie danych odwołuje się do innej jednostce zdefiniowanej przez użytkownika za pomocą nazwy.Odwołujący się podmiot może być obiekt użytkownika, typ (alias lub CLR UDT), kolekcja schematu XML lub funkcja partycji.Ta funkcja jest przydatna dla deweloperów, którzy chcą śledzenia zależności na ich własnych jednostek.Na przykład przed modyfikacją typ zdefiniowany przez użytkownika, deweloper można użyć tej funkcja do określenia wszystkich podmiotów w bazie danych, które zależą od typu.Uwaga odwołania do typ zdefiniowany przez użytkownika w tabela nie są przekazywane w definicji nie określono typu kolumna obliczana, ograniczenia CHECK lub ograniczenia domyślnego.
Przykłady
Następujące przykłady zwrotu zależności SQL za pomocą sys.sql_expression_dependencies wykazu widoku i sys.dm_sql_referenced_entities i sys.dm_sql_referencing_entities funkcji dynamicznego zarządzania.
Zgłoszenie podmiotów, od których zależy określonej jednostki
Kwerendy można sys.sql_expression_dependencies wykazu widoku lub sys.dm_sql_referenced_entities funkcja dynamicznego zarządzania, aby powrócić do listy podmiotów, od których zależy określonej obiekt.Na przykład można powrócić do listy podmiotów, wskazanych przez moduł, takie jak procedura składowana lub wyzwalacza.
Poniższy przykład tworzy tabela, widok i trzech procedur przechowywanych.Obiekty te są używane w kwerendach później do demonstrowania sposobu raport informacji o zależnościach.Że MyView i MyProc3 zarówno odwołanie Mytable.MyProcodwołania 1 MyView, i MyProc2 odniesienia MyProc1.
USE AdventureWorks2008R2;
GO
-- Create entities
CREATE TABLE dbo.MyTable (c1 int, c2 varchar(32));
GO
CREATE VIEW dbo.MyView
AS SELECT c1, c2 FROM dbo.MyTable;
GO
CREATE PROC dbo.MyProc1
AS SELECT c1 FROM dbo.MyView;
GO
CREATE PROC dbo.MyProc2
AS EXEC dbo.MyProc1;
GO
CREATE PROC dbo.MyProc3
AS SELECT * FROM AdventureWorks2008R2.dbo.MyTable;
EXEC dbo.MyProc2;
GO
W następujących przykładowych kwerendach sys.sql_expression_dependencies Widok wykazu zwrócić podmioty, które są wywoływane przez MyProc3.
USE AdventureWorks2008R2;
GO
SELECT OBJECT_NAME(referencing_id) AS referencing_entity_name
,referenced_server_name AS server_name
,referenced_database_name AS database_name
,referenced_schema_name AS schema_name
, referenced_entity_name
FROM sys.sql_expression_dependencies
WHERE referencing_id = OBJECT_ID(N'dbo.MyProc3');
GO
Oto zestaw wyników.
referencing_entity server_name database_name schema_name referenced_entity
------------------ ----------- -------------------- ----------- -----------------
MyProc3 NULL NULL dbo MyProc2
MyProc3 NULL AdventureWorks2008R2 dbo MyTable
(2 row(s) affected)
Dwa podmioty odwołuje się do by-name w definicji MyProc3 są zwracane.Nazwa serwera jest NULL, ponieważ odwołanie podmioty nie są określone przy użyciu prawidłowej nazwy czteroczęściowym identyfikatorem.Nazwa bazy danych jest wyświetlana dla MyTable , ponieważ obiekt został zdefiniowany w procedurze przy użyciu prawidłową nazwę trzech części.
Podobne informacje mogą być zwracane przy użyciu sys.dm_sql_referenced_entities.Oprócz zgłoszenie nazw obiektów, ta funkcja może służyć do zwrotu kolumna poziom zależności obiektów związanych ze schematem i powiązania schematu.Poniższy przykład zwraca podmiotów, którym MyProc3 zależy od tym kolumna -poziom zależności.
USE AdventureWorks2008R2;
GO
SELECT referenced_server_name AS server
, referenced_database_name AS database_name
, referenced_schema_name AS schema_name
, referenced_entity_name AS referenced_entity
, referenced_minor_name AS column_name
FROM sys.dm_sql_referenced_entities ('dbo.MyProc3', 'OBJECT');
GO
Oto zestaw wyników.
server_name database_name schema_name referenced_entity column_name
----------- -------------------- ----------- ----------------- -----------
NULL NULL dbo MyProc2 NULL
NULL AdventureWorks2008R2 dbo MyTable NULL
NULL AdventureWorks2008R2 dbo MyTable c1
NULL AdventureWorks2008R2 dbo MyTable c2
(4 row(s) affected)
W tym zestaw wyników, zwracane są te same dwa podmioty, jednak dwa dodatkowe wiersze są zwracane, przedstawiający zależność kolumn c1 i c2 w MyTable.Należy zauważyć, że w definicji MyProc3, SELECT * użyto instrukcja, aby odwoływać się do kolumn w MyTable.Nie jest zalecane praktyki kodowania; jednak kolumna -poziom zależności nadal są śledzone przez Aparat baz danych.
Do tego momentu przykłady zostały zilustrowane jak zwrócić podmiotów, którym obiekt zależy bezpośrednio.W poniższym przykładzie użyto cykliczne wspólnej tabela wyrażenie (CTE) do zwrotu wszystkie zależności bezpośrednie i pośrednie obiekt.
DECLARE @referencing_entity AS sysname;
SET @referencing_entity = N'MyProc3';
WITH ObjectDepends(entity_name,referenced_schema, referenced_entity, referenced_id,level)
AS (
SELECT entity_name =
CASE referencing_class
WHEN 1 THEN OBJECT_NAME(referencing_id)
WHEN 12 THEN (SELECT t.name FROM sys.triggers AS t
WHERE t.object_id = sed.referencing_id)
WHEN 13 THEN (SELECT st.name FROM sys.server_triggers AS st
WHERE st.object_id = sed.referencing_id) COLLATE database_default
END
,referenced_schema_name
,referenced_entity_name
,referenced_id
,0 AS level
FROM sys.sql_expression_dependencies AS sed
WHERE OBJECT_NAME(referencing_id) = @referencing_entity
UNION ALL
SELECT entity_name =
CASE sed.referencing_class
WHEN 1 THEN OBJECT_NAME(sed.referencing_id)
WHEN 12 THEN (SELECT t.name FROM sys.triggers AS t
WHERE t.object_id = sed.referencing_id)
WHEN 13 THEN (SELECT st.name FROM sys.server_triggers AS st
WHERE st.object_id = sed.referencing_id) COLLATE database_default
END
,sed.referenced_schema_name
,sed.referenced_entity_name
,sed.referenced_id
,level + 1
FROM ObjectDepends AS o
JOIN sys.sql_expression_dependencies AS sed ON sed.referencing_id = o.referenced_id
)
SELECT entity_name,referenced_schema, referenced_entity, level
FROM ObjectDepends
ORDER BY level;
GO
Oto zestaw wyników.
entity_name referenced_schema referenced_entity level
----------- ----------------- ----------------- -----
MyProc3 dbo MyProc2 0
MyProc3 dbo MyTable 0
MyProc2 dbo MyProc1 1
MyProc1 dbo MyView 2
MyView dbo MyTable 3
(5 row(s) affected)
W tym zestaw wyników, MyProc2 i MyTable są zwracane jako bezpośrednich zależności wskazywane przez wartość poziom 0.Trzeci wiersz pokazuje zależność pośrednich na MyProc1, która odwołuje się do definicji MyProc2.Czwarty wiersz pokazuje zależności na MyView, która odwołuje się do definicji MyProc1 i wreszcie zależność od MyTable, która odwołuje się do definicji MyView.
Przez zwrócenie informacji o zależnościach hierarchiczne, można określić pełną listę zależności bezpośrednich i pośrednich na danym obiekt i rozpoznać kolejność, w której obiekty te powinny zostać wdrożone, jeśli muszą być przenoszone do innej bazy danych.
Poniższy przykład zwraca te same hierarchiczne zależności informacji za pomocą sys.dm_sql_referenced_entities funkcja.Podmioty, którym MyProc3 zależy od są zwracane w tym kolumna -poziom zależności.
USE AdventureWorks2008R2;
GO
DECLARE @entity AS sysname , @type AS sysname;
SET @entity = N'dbo.MyProc3';
SET @type = N'OBJECT';
WITH ObjectDepends(referenced_schema_name, referenced_entity_name, referenced_column,
referenced_id,level)
AS (
SELECT
referenced_schema_name
,referenced_entity_name
,referenced_minor_name AS referenced_column
,referenced_id
,0 AS level
FROM sys.dm_sql_referenced_entities (@entity, @type)
UNION ALL
SELECT
re.referenced_schema_name
,re.referenced_entity_name
,re.referenced_minor_name AS referenced_column
,re.referenced_id
,level + 1
FROM ObjectDepends AS o
CROSS APPLY sys.dm_sql_referenced_entities (o.referenced_schema_name + N'.' + o.referenced_entity_name, @type) AS re
)
SELECT referenced_schema_name, referenced_entity_name, referenced_column, level
FROM ObjectDepends
ORDER BY level;
GO
Zgłoszenie na podmioty, które zależą od określonej jednostki
Kwerendy można sys.sql_expression_dependencies wykazu widoku lub sys.dm_sql_referencing_entities funkcja dynamicznego zarządzania, aby powrócić do listy podmiotów zależnych od określonej obiekt.Na przykład jeśli określony obiekt jest tabelą, zwracane są wszystkie podmioty, które odwołują się do tabela według nazwy w swojej definicji.
Poniższy przykład zwraca podmioty, które odwołują się do obiekt dbo.MyTable.
USE AdventureWorks2008R2;
GO
SELECT OBJECT_SCHEMA_NAME ( referencing_id ) AS referencing_schema_name,
OBJECT_NAME(referencing_id) AS referencing_entity_name,
COALESCE(COL_NAME(referencing_id, referencing_minor_id), '(n/a)') AS referencing_column,
referencing_class_desc, referenced_class_desc,
referenced_server_name, referenced_database_name, referenced_schema_name,
referenced_entity_name,
COALESCE(COL_NAME(referenced_id, referenced_minor_id), '(n/a)') AS referenced_column,
is_caller_dependent, is_ambiguous
FROM sys.sql_expression_dependencies AS sed
WHERE referenced_id = OBJECT_ID(N'dbo.MyTable');
GO
Podobne informacje mogą być zwracane przy użyciu sys.dm_sql_referenced_entities funkcja dynamicznego zarządzania.
USE AdventureWorks2008R2;
GO
SELECT referencing_schema_name, referencing_entity_name, referencing_id, referencing_class_desc, is_caller_dependent
FROM sys.dm_sql_referencing_entities ('dbo.MyTable', 'OBJECT');
GO
Raportowanie zależności na poziomie kolumny
Zależności poziom kolumny mogą być zgłaszane przy użyciu sys.dm_sql_referenced_entities dla obiektów związanych ze schematem i powiązania schematu.Kolumna poziom zależności obiektów związanych ze schematem mogą być również przedstawione za pomocą sys.sql_expression_dependencies.
W następujących przykładowych kwerendach sys.dm_sql_referenced_entities do kolumna raportu -poziom zależności obiektów-powiązania schematu.Przykład najpierw tworzy Table1 i Table 2 i procedura składowana Proc1.The procedure references kolumnas b and c in Table1 and kolumna c2 in Table2.Widok sys.dm_sql_referenced_entities jest uruchamiany przy użyciu procedura składowana, określony jako odwołujący się obiekt.Zestaw wyników zawiera wiersze dla jednostek odwołanie Table1 i Table2 i kolumn, które są wywoływane w definicji procedura składowana.Należy zauważyć, że zwracana jest wartość NULL w column_name kolumna w wierszach, które odwołują się do tabel.
USE AdventureWorks2008R2;
GO
CREATE TABLE dbo.Table1 (a int, b int, c int);
GO
CREATE TABLE dbo.Table2 (c1 int, c2 int);
GO
CREATE PROCEDURE dbo.Proc1 AS
SELECT b, c FROM dbo.Table1;
SELECT c2 FROM dbo.Table2;
GO
SELECT referenced_id, referenced_entity_name AS table_name, referenced_minor_name AS column_name
FROM sys.dm_sql_referenced_entities ('dbo.Proc1', 'OBJECT');
GO
Oto zestaw wyników.
referenced_id, table_name, column_name
------------- ----------- -------------
151671588 Table1 NULL
151671588 Table1 b
151671588 Table1 c
2707154552 Table2 NULL
2707154552 Table2 c2
Zależności między bazami danych i serwera raportowania krzyżowe
Kiedy jednostka tworzy odwołanie do innego obiekt przy użyciu prawidłowej nazwy trzech części, powstaje zależność między bazami danych.Odwołanie krzyżowe serwera jest tworzony, gdy jednostka tworzy odwołanie do innego obiekt przy użyciu prawidłowej nazwy czteroczęściowym identyfikatorem.Nazwa serwera i bazy danych są rejestrowane tylko wtedy, gdy nazwa jest jawnie określony.Na przykład, gdy określony jako MyServer.MyDB.MySchema.MyTable, nazwy serwera i bazy danych są rejestrowane; Jednakże gdy określony jako MyServer..MySchema.MyTable, rejestrowana jest nazwa serwera.Aby uzyskać więcej informacji na temat zależności między serwerem i między bazami danych są śledzone, zobacz Opis zależności SQL.
Zależności między bazami danych i krzyżowych serwera mogą być zgłaszane przy użyciu sys.sql_expression_dependencies or sys.dm_sql_referenced_entitites.
Poniższy przykład zwraca wszystkie zależności między bazami danych.Przykład najpierw tworzy bazę danych db1 i dwóch procedur przechowywanych, które odwołują się do tabel w bazach danych db2 i db3.sys.sql_expression_dependencies tabela jest następnie proszeni o bazie - raport zależności między procedurami i tabel.Należy zauważyć, że zwracana jest wartość NULL w referenced_schema_name kolumna Encja — odwołanie t3 , ponieważ nie określono nazwy schematu dla danej obiekt w definicji procedury.
CREATE DATABASE db1;
GO
USE db1;
GO
CREATE PROCEDURE p1 AS SELECT * FROM db2.s1.t1;
GO
CREATE PROCEDURE p2 AS
UPDATE db3..t3
SET c1 = c1 + 1;
GO
SELECT OBJECT_NAME (referencing_id),referenced_database_name,
referenced_schema_name, referenced_entity_name
FROM sys.sql_expression_dependencies
WHERE referenced_database_name IS NOT NULL;
GO
USE master;
GO
DROP DATABASE db1;
GO
Zgłoszenie odwołania zależne od rozmówcy
Odwołanie zależne od rozmówcy oznacza, że powiązanie schematu odwołania encji występuje przy uruchomieniu czas; Dlatego rozdzielczość ID obiekt zależy od domyślnego schematu wywołującego.Nazywa się to powszechnie powiązanie schematu dynamiczne i występuje, gdy procedura przechowywana Encja — odwołanie rozszerzona procedura składowana, lub -powiązanie schematu zdefiniowanej przez użytkownika funkcja o nazwie w instrukcja EXECUTE bez określania nazwy schematu.Na przykład, odwołanie do obiekt w formacie EXECUTE MySchema.MyProc jest nie wywołującego zależnych; Jednak odwołanie w formacie EXECUTE MyProc jest zależne od rozmówcy.
Odwołania zależne od wywołującego może spowodować nieoczekiwane zachowanie podczas wykonywania moduł, w której istnieje odwołanie.Na przykład rozważmy następującą procedura składowana odwołuje się przy użyciu nazwy części jednej procedury.
CREATE PROCEDURE dbo.Proc1
AS EXECUTE dbo.Proc2;
GO
Gdy Proc1 jest wykonywany, Proc2 wiąże schemat wywołującego.Zakładać, że Proc1 wykonywane przez User1, kto ma domyślny schemat z S1 i wykonywane przez User2, kto ma domyślny schemat z S2.Gdy Proc1 wykonywane przez User1, odwołanie obiekt jest rozpoznawana jako S1.Proc2.Gdy Proc1 wykonywane przez User2, odwołanie obiekt jest rozpoznawana jako S2.Proc2.Ze względu na zachowanie identyfikator Proc2 nie mogą być rozpoznane aż do Proc1 jest wykonywana; Dlatego is_caller_dependent kolumna jest zestaw 1 w sys.sql_expression_dependencies Widok i sys.dm_sql_referenced_entities funkcja.Po Proc1 jest wykonywany, Aparat baz danych będzie szukał Encja — odwołanie Proc2 w schemacie domyślnego obiekt wywołującego.Jeśli nie zostanie znaleziony, dbo schematu jest sprawdzany.Jeśli Proc2 nie można znaleźć w dbo schematu identyfikator Proc2 nie można rozpoznać i instrukcja nie powiedzie się.Zaleca się określenie nazwy dwóch części, przy odwoływaniu się do podmiotów bazy danych, aby wyeliminować potencjalne błędy aplikacji.
Poniższy przykład zwraca każdy obiekt z bieżącej bazy danych zawierającej odwołanie zależne od rozmówcy.
SELECT OBJECT_NAME(referencing_id) AS referencing_entity, referenced_database_name,
referenced_schema_name, referenced_entity_name, referenced_id
FROM sys.sql_expression_dependencies
WHERE is_caller_dependent = 1;
Raportowanie na podmioty korzystające z określonego UDT
Poniższy przykład zwraca każdy obiekt z bieżącej bazy danych, odwołujący się do określonego typu w jego definicję.Zestaw wyników zawiera tego typu użyć dwóch procedur przechowywanych.Typ jest również używana w definicji kilka kolumn w HumanResources.Employee tabela; Jednakże ponieważ typ nie jest w definicji kolumna obliczana, ograniczenia CHECK lub domyślne ograniczenie w tabela, nie są zwracane żadne wiersze w tabela.
USE AdventureWorks2008R2;
GO
SELECT referencing_schema_name, referencing_entity_name, referencing_id, referencing_class_desc, is_caller_dependent
FROM sys.dm_sql_referencing_entities ('dbo.Flag', 'TYPE');
GO
Zależności wyzwalacza DDL poziom serwera raportowania
Możesz zgłosić o zależnościach Wyzwalacze DDL poziom serwera za pomocą sys.sql_expression_dependencies i sys.dm_sql_referencing_entities tylko wtedy, gdy kontekst jest zestaw do master bazy danych.Podczas korzystania z sys.dm_sql_referenced_entities funkcja kontekst może być dowolnym bazy danych.
The following example queries the sys.sql_expression_dependenciesview to report on server-level DDL trigger dependencies.
USE master;
GO
SELECT OBJECT_NAME(referencing_id) AS referencing_entity, referencing_class_desc, referenced_server_name, referenced_database_name, referenced_schema_name, referenced_entity_name, referenced_id
FROM sys.sql_expression_dependencies
WHERE referencing_class = 13;
Zobacz także