Database
 sql >> Baza danych >  >> RDS >> Database

Jak sprawdzić, czy T-SQL UDF jest powiązany ze schematem (nawet jeśli jest zaszyfrowany)

Schemat powiązania obiektu, takiego jak funkcja zdefiniowana przez użytkownika (UDF), jest uważany za dobrą praktykę, ponieważ zapobiega wprowadzaniu zmian w obiektach, do których się odwołuje, które mogłyby przypadkowo przerwać funkcję.

Możesz schematycznie powiązać funkcję zdefiniowaną przez użytkownika w momencie jej tworzenia lub możesz zmienić później.

Zwykle można sprawdzić, czy UDF jest powiązany ze schematem w SQL Server, wyświetlając jego definicję. Zwykle możesz to zrobić za pomocą GUI, wybierając „Skrypt jako Utwórz” lub podobnie.

Możesz to również zrobić za pomocą T-SQL, wybierając definition kolumna sys.sql_modules widok katalogu systemowego.

Ale to zadziała tylko wtedy, gdy UDF nie jest zaszyfrowany.

Istnieje jednak inna kolumna w sys.sql_modules widok, który służy naszym celom, niezależnie od tego, czy UDF jest zaszyfrowany, czy nie:is_schema_bound

Przykład 1 – szyfrowany UDF

Oto przykład sprawdzenia, czy zaszyfrowana funkcja zdefiniowana przez użytkownika o nazwie udf_CatsByName_ITVF jest powiązany ze schematem, czy nie.

SELECT 
  definition,
  is_schema_bound
FROM sys.sql_modules
WHERE object_id = OBJECT_ID('udf_CatsByName_ITVF');

Wynik:

+--------------+-------------------+
| definition   | is_schema_bound   |
|--------------+-------------------|
| NULL         | 1                 |
+--------------+-------------------+

W takim przypadku UDF jest powiązany ze schematem.

Zauważ również, że definition kolumna zwraca NULL, ponieważ funkcja ma zastosowane szyfrowanie.

Przykład 2 – UDF bez szyfrowania

Gdyby szyfrowanie nie zostało zastosowane, moglibyśmy zobaczyć pełną definicję w tej kolumnie i zobaczylibyśmy argument WITH SCHEMABINDING w definicji.

Oto zapytanie ponownie, gdy funkcja nie jest zaszyfrowana.

SELECT 
  definition
FROM sys.sql_modules
WHERE object_id = OBJECT_ID('udf_CatsByName_ITVF');

Wynik:

+--------------+
| definition   |
|--------------|
| 
CREATE FUNCTION dbo.udf_CatsByName_ITVF( @CatName varchar(70) )
    RETURNS TABLE
WITH SCHEMABINDING
AS
RETURN (
    SELECT 
        CatId,
        CatName,
        Phone
    FROM dbo.Cats
    WHERE CatName = @CatName
    );

              |
+--------------+

Usunąłem is_schema_bound kolumny z zapytania, aby ułatwić czytanie.

Tak czy inaczej, is_schema_bound kolumna może być używana bez względu na to, czy UDF jest zaszyfrowany, czy nie.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Python:odpytywanie danych za pomocą dźwięku

  2. Typ danych SQL VARCHAR Zalecenia i zakazy dla szybszych baz danych

  3. Serializowalny poziom izolacji

  4. Naturalne połączenie SQL

  5. SQL WYBIERZ SUMA