Implementazione di tipi definiti dall'utente

Data aggiornamento: 14 aprile 2006

In questo argomento viene descritto come creare ed eliminare tipi CLR (Common Language Runtime) definiti dall'utente in SQL Server.

Creazione di tipi definiti dall'utente

Per creare un tipo definito dall'utente in SQL Server, è necessario eseguire i passaggi seguenti nell'ordine in cui sono indicati:

  • Definire il tipo definito dall'utente come classe o struttura in un linguaggio Microsoft .NET Framework. Per ulteriori informazioni sulla programmazione di tipi in CLR, vedere CLR User-Defined Types. Compilare quindi la classe o la struttura per generare un assembly in .NET Framework utilizzando il compilatore appropriato.
  • Registrare l'assembly in SQL Server utilizzando l'istruzione CREATE ASSEMBLY. Per ulteriori informazioni sugli assembly in SQL Server, vedere Assembly (Motore di database).
  • Creare il tipo che fa riferimento all'assembly registrato.

[!NOTA] Con la distribuzione di un progetto SQL Server in Microsoft Visual Studio viene registrato un assembly nel database specificato per il progetto. La distribuzione del progetto crea inoltre tipi CLR definiti dall'utente nel database per tutte le definizioni di classe annotate con l'attributo SqlUserDefinedType. Per ulteriori informazioni, vedere Deploying CLR Database Objects.

[!NOTA] Per impostazione predefinita, in SQL Server non è possibile eseguire codice CLR. È possibile creare, modificare ed eliminare oggetti di database che fanno riferimento a moduli di codice gestito, ma tali riferimenti non verranno eseguiti in SQL Server a meno che non si attivi l'opzione clr enabled tramitesp_configure.

Per creare, modificare o eliminare un assembly

Per creare un tipo definito dall'utente

Eliminazione di tipi definiti dall'utente

Per eliminare un tipo definito dall'utente

[!NOTA] Non è possibile modificare i tipi definiti dall'utente dopo averli creati, in quanto le modifiche potrebbero rendere non validi i dati di tabelle o indici. Per modificare un tipo, è necessario eliminarlo e quindi ricrearlo, oppure eseguire un'istruzione ALTER ASSEMBLY utilizzando la clausola WITH UNCHECKED DATA.

Non è possibile eliminare un tipo definito dall'utente finché non sono stati eliminati tutti i riferimenti a esso. Di seguito vengono descritti alcuni di questi riferimenti:

  • Colonne definite sul tipo.
  • Colonne calcolate e vincoli CHECK le cui espressioni fanno riferimento al tipo.
  • Funzioni e viste associate a schema con espressioni nelle relative definizioni che fanno riferimento al tipo.
  • Parametri di funzioni e stored procedure.

Per trovare le colonne che dipendono da un tipo definito dall'utente

Nell'esempio seguente vengono recuperati metadati relativi a colonne definite in un ComplexNumber di un tipo definito dall'utente.

SELECT * FROM sys.columns 
WHERE user_type_id = TYPE_ID('ComplexNumber');

Nell'esempio seguente vengono recuperati metadati limitati per utenti con privilegi minimi relativi a colonne definite in un ComplexNumber di un tipo definito dall'utente.

SELECT * FROM sys.column_type_usages 
WHERE user_type_id = TYPE_ID('ComplexNumber');

Per trovare espressioni di colonne calcolate, espressioni di vincolo CHECK ed espressioni di funzioni e viste associate a schema che dipendono da un tipo definito dall'utente

Nell'esempio seguente vengono recuperati i nomi di colonne calcolate, con relative tabelle, che presentano una dipendenza da un ComplexNumber di un tipo definito dall'utente.

SELECT OBJECT_NAME(object_id) AS object_name,
    COL_NAME(object_id, column_id) AS column_name
FROM sys.sql_dependencies
WHERE referenced_major_id = TYPE_ID('ComplexNumber')
    AND class = 2 
    AND OBJECTPROPERTY(object_id, 'IsTable')=1; 

Nell'esempio seguente vengono recuperati i nomi dei vincoli CHECK, con gli oggetti in cui sono definiti, che presentano una dipendenza da un ComplexNumber di un tipo definito dall'utente.

SELECT SCHEMA_NAME(o.schema_id) AS schema_name,
    OBJECT_NAME(o.parent_object_id) AS table_name,
    OBJECT_NAME(o.object_id) AS constraint_name
FROM sys.sql_dependencies AS d
JOIN sys.objects AS o
ON o.object_id = d.object_id
WHERE referenced_major_id = TYPE_ID('ComplexNumber')
AND class = 2 
AND OBJECTPROPERTY(o.object_id, 'IsCheckCnst')=1;

Nell'esempio seguente vengono recuperati i nomi delle funzioni e delle viste associate a schema le cui definizioni fanno riferimento a un ComplexNumber di un tipo definito dall'utente.

[!NOTA] In SQL Server non vengono mantenuti metadati relativi alle dipendenze tra tipi definiti dall'utente e il relativo utilizzo nel corpo di stored procedure, trigger, funzioni non associate a schema o viste non associate a schema.

SELECT SCHEMA_NAME(o.schema_id) AS dependent_object_schema,
    OBJECT_NAME(o.object_id) AS dependent_object_name,
    o.type_desc AS dependent_object_type,
    d.class_desc AS kind_of_dependency,
    d.referenced_major_id AS referenced_object
FROM sys.sql_dependencies AS d 
JOIN sys.objects AS o
    ON d.object_id = o.object_id
        AND o.type IN ('FN','IF','TF', 'V')
WHERE  d.class = 2
    AND d.referenced_major_id IN (TYPE_ID('ComplexNumber'))
ORDER BY dependent_object_schema, dependent_object_name;

Per trovare i parametri che dipendono da un tipo definito dall'utente

Nell'esempio seguente vengono recuperati i nomi dei parametri, con gli oggetti a cui appartengono, definiti in un ComplexNumber di un tipo definito dall'utente.

SELECT OBJECT_NAME(object_id) AS object_name,
    NULL AS procedure_number,
    name AS param_name,
    parameter_id AS param_num,
    TYPE_NAME(p.user_type_id) AS type_name
FROM sys.parameters AS p
WHERE p.user_type_id = TYPE_ID('ComplexNumber')
ORDER BY object_name, procedure_number, param_num;

Nell'esempio seguente vengono recuperati i metadati limitati per utenti con privilegi minimi relativi a parametri definiti in un ComplexNumber di un tipo definito dall'utente.

SELECT * FROM sys.parameter_type_usages 
WHERE user_type_id = TYPE_ID('ComplexNumber');

Vedere anche

Concetti

Utilizzo di tipi CLR definiti dall'utente

Altre risorse

Esempi di programmabilità CLR

Guida in linea e informazioni

Assistenza su SQL Server 2005

Cronologia modifiche

Versione Cronologia

14 aprile 2006

Nuovo contenuto:
  • Aggiunta della sezione "Eliminazione di tipi definiti dall'utente" con informazioni relative all'individuazione delle dipendenze da tipi definiti dall'utente.