sql >> Database teknologi >  >> RDS >> Database

Sådan kontrolleres, om en T-SQL UDF er skemabundet (selv når den er krypteret)

Skemabinding af et objekt såsom en brugerdefineret funktion (UDF) betragtes som god praksis, da det forhindrer ændringer i objekter, som det refererer til, og som utilsigtet kan bryde funktionen.

Du kan skemabinde en brugerdefineret funktion på det tidspunkt, du opretter den, eller du kan ændre senere.

Normalt kan du kontrollere, om en UDF er skemabundet i SQL Server ved at se dens definition. Du kan normalt gøre dette via GUI'en ved at vælge "Script as Create" eller lignende.

Du kan også gøre det ved at bruge T-SQL ved at vælge definition kolonne i sys.sql_modules systemkatalogvisning.

Men dette vil kun fungere, hvis UDF'en ikke er krypteret.

Der er dog en anden kolonne i sys.sql_modules visning, der tjener vores formål, uanset om UDF'en er krypteret eller ej:is_schema_bound

Eksempel 1 – Krypteret UDF

Her er et eksempel på at finde ud af, om en krypteret brugerdefineret funktion kaldet udf_CatsByName_ITVF er skemabundet eller ej.

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

Resultat:

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

I dette tilfælde er UDF'en skemabundet.

Bemærk også, at definition kolonne returnerer NULL, fordi funktionen har fået anvendt kryptering.

Eksempel 2 – UDF uden kryptering

Hvis kryptering ikke var blevet anvendt, kunne vi have set den fulde definition i den kolonne, og vi ville have set argumentet WITH SCHEMABINDING i definitionen.

Her er forespørgslen igen, når funktionen ikke er krypteret.

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

Resultat:

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

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

Jeg har fjernet is_schema_bound kolonne fra forespørgslen for at gøre det nemmere at læse.

Uanset hvad, er is_schema_bound kolonne kan bruges, uanset om UDF'en er krypteret eller ej.


  1. Sådan udføres en Accent Sensitive-søgning i MySql

  2. connect ECONNREFUSED - node js , sql

  3. Oracle 11g - Tjek begrænsning med RegEx

  4. Sådan finder du de databasesamlinger, der understøttes af din SQL Server-instans