go backarticles

Articles of SQLschool.gr Team

Dynamic Management Functions for referencing and referenced entities

Fivi Panopoulou - Sotiris Karras


Στον 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 θα βρείτε εδώ.


Fivi Panopoulou

Fivi Panopoulou

System Engineer • Speaker

Το 2007 ξεκίνησα τις σπουδές μου στη σχολή Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών στο Εθνικό Μετσόβιο Πολυτεχνείο.Κατά την διάρκεια των σπουδών μου εκεί αγάπησα τον προγραμματισμό και τα συστήματα πληροφορικής, καθώς επίσης απέκτησα το ιδιαίτερο ενδιαφέρον μου για τις βάσεις δεδομένων. Κατά την διάρκεια της διπλωματικής μου ασχολήθηκα με ζητήματα ανωνυμοποίησης δεδομένων και την ανάπτυξη σχετικού εργαλείου. Τα τελευταία χρόνια των σπουδών μου, μου δόθηκε η ευκαιρία να ασχοληθώ περισσότερο και να διευρύνω τους ορίζοντές μου ως Microsoft Student Partner και μέσω της κοινότητας Student Guru. Στα πλαίσια των κοινοτήτων αυτών, ξεκίνησα να ασχολούμαι με παρουσιάσεις αλλά και να γνωρίζω τον SQL Server. Από την πρώτη στιγμή που ασχολήθηκα μαζί του, συνειδητοποίησα πόσο ήθελα να εμβαθύνω τις γνώσεις μου σχετικά με αυτόν και τα συστήματα διαχείρισης βάσεων δεδομένων γενικότερα, πράγμα που προσπαθώ να κάνω έκτοτε. Πριν χρόνια είχα την τύχη να συμμετέχω στο πρόγραμμα mentoring, μέσω του οποίου γνώρισα τον κ. Χατζηπαυλή. Από τότε συμμετέχω στην ομάδα του SQLschool.gr.


Sotiris Karras

Sotiris Karras

System Engineer • Speaker

Είμαι απόφοιτος της σχολής Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών του Εθνικού Μετσόβιου Πολυτεχνείου και στα ενδιαφέροντά μου συμπεριλαμβάνεται o τομέας του Knowledge and Data Engineering. Πιο συγκεκριμένα, έχω ασχοληθεί ακαδημαϊκά και ερευνητικά με τον τομέα του data privacy και data anonymity, ενώ πάθος μου είναι ό,τι έχει να κάνει με relational databases και data management. Στο παρελθόν, έχω συνεργαστεί με την Microsoft Hellas ως Microsoft Student Partner για ακαδημαϊκές δραστηριότητες και ήμουν μέρος του MVP mentoring προγράμματός της, στο οποίο είχα την τύχη να γνωρίσω τον κ. Χατζηπαυλή.


Leave your comment

COMMENT

FULL NAME

EMAIL ADDRESS

We use Gravatar

WEB SITE



captcha


 

Newsletter

If you want to receive updates from us subscribe below with your email.
Follow us in
PASS chapter logo

The Official PASS Local Group for Greece

About us Contact us Terms of Use Privacy Sing in Register
sql school greece logo
© 2010-2020 All rights reserved

This site uses cookies for operational and analytics purposes only. By continuing to browse this site, you agree to their use.