sql >> Database >  >> RDS >> Database

Controleren of een T-SQL UDF schemagebonden is (zelfs als het versleuteld is)

Schema dat een object bindt, zoals een door de gebruiker gedefinieerde functie (UDF), wordt als een goede gewoonte beschouwd, omdat het voorkomt dat er wijzigingen worden aangebracht aan objecten waarnaar het verwijst en die de functie per ongeluk zouden kunnen verbreken.

U kunt een door de gebruiker gedefinieerde functie in een schema binden op het moment dat u deze maakt, of u kunt deze later wijzigen.

Normaal gesproken kunt u controleren of een UDF schemagebonden is in SQL Server door de definitie ervan te bekijken. U kunt dit meestal doen via de GUI door "Script as Create" of iets dergelijks te selecteren.

Je kunt het ook doen met T-SQL door de definition te selecteren kolom van de sys.sql_modules systeemcatalogusweergave.

Maar dit werkt alleen als de UDF niet is versleuteld.

Er is echter nog een kolom in de sys.sql_modules weergave die ons doel dient, of de UDF nu versleuteld is of niet:is_schema_bound

Voorbeeld 1 – Versleutelde UDF

Hier is een voorbeeld om erachter te komen of een gecodeerde, door de gebruiker gedefinieerde functie met de naam udf_CatsByName_ITVF is schema gebonden of niet.

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

Resultaat:

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

In dit geval is de UDF schemagebonden.

Merk ook op dat de definition kolom retourneert NULL omdat op de functie codering is toegepast.

Voorbeeld 2 – UDF zonder versleuteling

Als er geen versleuteling was toegepast, hadden we de volledige definitie in die kolom kunnen zien en hadden we het argument WITH SCHEMABINDING gezien. in de definitie.

Hier is de vraag opnieuw wanneer de functie niet is gecodeerd.

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

Resultaat:

+--------------+
| 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
    );

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

Ik heb de is_schema_bound . verwijderd kolom uit de zoekopdracht om het leesbaarder te maken.

Hoe dan ook, de is_schema_bound kolom kan worden gebruikt, ongeacht of de UDF is versleuteld of niet.


  1. SQL Server-transactielogboek — Deel 1

  2. CodeIgniter MSSQL-verbinding

  3. TRANSACTION_MUTEX en toegang tot transacties voor meerdere sessies

  4. dplyr left_join met kleiner dan, groter dan voorwaarde