Στον SQL Server υπάρχουν διάφορα dynamic management objects, από τα οποία μπορεί κανείς να πάρει πληροφορίες για την δομή της βάσης και τις εξαρτήσεις που υπάρχουν ανάμεσα στους διάφορους πίνακες. Παρόλα αυτά πολλές φορές χρειαζόμαστε να μάθουμε και εξαρτήσεις που αφορούν SQL expressions. Την πληροφορία αυτή μπορούμε να πάρουμε από δύο dynamic management functions, την sys.dm_sql_referenced_entities και την sys.dm_sql_referencing_entities, τις οποίες θα δούμε σε αυτό το post.
Προτού αναλύσουμε κάθε μια από αυτές ξεχωριστά, ας δούμε μερικά κοινά χαρακτηριστικά τους. Αρχικά, οι functions αυτές δείχνουν εξαρτήσεις που δημιουργούνται όταν στον ορισμό ενός user-defined entity, υπάρχει persisted SQL Expression το οποίο αναφέρεται σε ένα άλλο user-defines entity. Στο πρώτο αναφερόμαστε ως “referencing entity” και στο δεύτερο ως “referenced entity”. Όπως αναφέρεται χαρακτηριστικά στο msdn, ένα SQL Expression ορίζεται ως: “a combination of symbols and operators that the SQL Server Database Engine evaluates to obtain a single data value”. Και οι δύο functions, παίρνουν δύο ορίσματα. Το πρώτο είναι το referenced ή referencing entity αντίστοιχα και το δεύτερο είναι το class του συγκεκριμένου entity.
sys.dm_sql_referencing_entities
H sys.dm_sql_referencing_entities μας επιστρέφει όλα τα entities που αναφέρονται στο entity που δίνεται ως ορισμα και βρίσκονται στην ίδια βάση με αυτό.
Για παράδειγμα, αν θέλουμε να δούμε όλα τα objects που περιέχουν sql expressions τα οποία αφορούν τον πίνακα των προιόντων της Adventureworks, μπορούμε να το πετύχουμε με το παρακάτω statement.
SELECT *
FROM sys.dm_sql_referencing_entities('Production.Product', 'OBJECT');
GO
Το αποτέλεσμα αυτού είναι:
Στο αποτέλεσμα αυτή η function περιλαμβάνονται entities όπως user defined functions, stored procedures, check constraints, ενδεχομένως και triggers, που περιλαμβάνουν expressions τα οποία αναφέρονται στο δεδομένο object (στην περίπτωσή μας τον πίνακα Products).
Αναλυτικότερες πληροφορίες για αυτή την function θα βρείτε εδώ.
sys.dm_sql_referenced_entities
H sys.dm_sql_referenced_entities μας επιστρέφει όλα τα entities στα οποία αναφέρεται το entity που δίνεται ως όρισμα και βρίσκονται στην ίδια βάση με αυτό.
Για παράδειγμα, ας δούμε τα entities τα οποία αναφέρονται στον ορισμό της user defined function ufnGetProductListPrice. Αυτή έχει τον παρακάτω ορισμό:
CREATE FUNCTION [dbo].[ufnGetProductListPrice](@ProductID [int], @OrderDate [datetime])
RETURNS [money]
AS
BEGIN
DECLARE @ListPrice money;
SELECT @ListPrice = plph.[ListPrice]
FROM [Production].[Product] p
INNER JOIN [Production].[ProductListPriceHistory] plph
ON p.[ProductID] = plph.[ProductID]
AND p.[ProductID] = @ProductID
AND @OrderDate BETWEEN plph.[StartDate] AND COALESCE(plph.[EndDate], CONVERT(datetime, '99991231', 112));
RETURN @ListPrice;
END;
GO
Τα referenced entities τα βλέπουμε με το παρακάτω statement, με το αντίστοιχο αποτέλεσμα:
SELECT referenced_schema_name, referenced_entity_name, referenced_id,
referenced_minor_name, referenced_minor_id,
is_ambiguous,is_selected,is_updated,is_select_all
FROM sys.dm_sql_referenced_entities('dbo.ufnGetProductListPrice', 'OBJECT');
GO
Άλλο ένα παράδειγμα για την χρήση αυτής της function, θα ήταν να δούμε τους πίνακες στους οποίους αναφέρεται ένα view. Το statement που θα μας δώσει την πληροφορία αυτή για τι view vSalesPerson είναι το παρακάτω:
SELECT referenced_schema_name, referenced_entity_name
FROM sys.dm_sql_referenced_entities('Sales.vSalesPerson', 'OBJECT')
WHERE referenced_minor_id = 0
ORDER BY referenced_schema_name, referenced_entity_name;
GO
Και το αποτέλεσμα είναι:
Τέλος, θα πρέπει να σημειωθεί ότι μπορούμε να χρησιμοποιήσουμε την function αυτή και πάνω σε πίνακες, όπως φαίνεται στο παρακάτω παράδειγμα για τον πίνακα SalesDetails.
SELECT referenced_schema_name, referenced_entity_name,referenced_minor_name
FROM sys.dm_sql_referenced_entities('Sales.SalesOrderDetail', 'OBJECT');
GO
Ο πίνακας αυτός το μόνο expression που περιέχει στον ορισμό του είναι αυτό που ορίζει μια computed column, την LineTotal. Η στήλη αυτή ορίζεται από το expression isnull(([UnitPrice]*((1.0)-[UnitPriceDiscount]))*[OrderQty],(0.0)) και επομένως αναφέρεται στις στήλες OrderQty, UnitPrice και UnitPriceDiscount του ίδιου πίνακα. Αυτό μας δείχνει και το αποτέλεσμα που παίρνουμε αν τρέξουμε το παραπάνω statement:
Αναλυτικότερες πληροφορίες για αυτή την function θα βρείτε εδώ.