Database
 sql >> Datenbank >  >> RDS >> Database

So prüfen Sie, ob eine T-SQL-UDF schemagebunden ist (selbst wenn sie verschlüsselt ist)

Die Schemabindung eines Objekts wie einer benutzerdefinierten Funktion (UDF) gilt als bewährte Methode, da sie verhindert, dass Änderungen an Objekten vorgenommen werden, auf die sie verweist, die die Funktion versehentlich beschädigen könnten.

Sie können eine benutzerdefinierte Funktion beim Erstellen an ein Schema binden oder später ändern.

Normalerweise können Sie überprüfen, ob eine UDF in SQL Server schemagebunden ist, indem Sie ihre Definition anzeigen. Sie können dies normalerweise über die GUI tun, indem Sie „Script as Create“ oder ähnliches auswählen.

Sie können dies auch mit T-SQL tun, indem Sie die definition auswählen Spalte der sys.sql_modules Systemkatalogansicht.

Dies funktioniert jedoch nur, wenn die UDF nicht verschlüsselt ist.

Es gibt jedoch eine weitere Spalte in sys.sql_modules Ansicht, die unserem Zweck dient, unabhängig davon, ob die UDF verschlüsselt ist oder nicht:is_schema_bound

Beispiel 1 – Verschlüsseltes UDF

Hier ist ein Beispiel, wie Sie herausfinden, ob eine verschlüsselte benutzerdefinierte Funktion namens udf_CatsByName_ITVF schemagebunden ist oder nicht.

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

Ergebnis:

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

In diesem Fall ist die UDF schemagebunden.

Beachten Sie auch, dass die definition -Spalte gibt NULL zurück, da auf die Funktion Verschlüsselung angewendet wurde.

Beispiel 2 – UDF ohne Verschlüsselung

Wenn keine Verschlüsselung angewendet worden wäre, hätten wir die vollständige Definition in dieser Spalte sehen können, und wir hätten das Argument WITH SCHEMABINDING gesehen in der Definition.

Hier nochmal die Abfrage, wenn die Funktion nicht verschlüsselt ist.

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

Ergebnis:

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

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

Ich habe is_schema_bound entfernt Spalte aus der Abfrage, um sie leichter lesbar zu machen.

In jedem Fall ist is_schema_bound Spalte kann unabhängig davon verwendet werden, ob die UDF verschlüsselt ist oder nicht.