Utilizzo di tipi definiti dall'utente tra database
Quando si crea un tipo definito dall'utente, tale tipo è locale rispetto a un singolo database. Un tipo definito dall'utente in un database non può pertanto essere utilizzato in una definizione di colonna di un altro database. Se, tuttavia, viene registrato lo stesso tipo definito dall'utente ed è possibile accedervi in due database, sarà possibile convertire un valore del tipo definito dall'utente di un database per l'utilizzo in un altro database. Questa funzione è utile quando si desidera eseguire le operazioni seguenti:
Chiamare una stored procedure definita in un database diverso.
Eseguire una query su tabelle definite in due database diversi.
Selezionare dati di un database e inserirli in un altro database.
Si supponga, ad esempio, di creare il tipo definito dall'utente u1 nei database db1 e db2. La stored procedure p2 viene creata solo nel database db2 e accetta un parametro di tipo u1. È possibile chiamare la procedura p2 con un'istanza del tipo u1 del database db1.
USE db1
DECLARE @u u1
EXEC db2.dbo.p2 @u
GO
Un altro esempio comporta il popolamento in una tabella temporanea nel database tempdb con i risultati di una query. Affinché l'operazione venga eseguita correttamente, il tipo definito dall'utente deve essere registrato in tempdb.
INSERT INTO #t SELECT * FROM T
La registrazione di un tipo definito dall'utente in tempdb non è necessaria quando si utilizza un tipo definito dall'utente in una variabile di tabella oppure quando un cursore utilizza un tipo definito dall'utente in una tabella di lavoro.
Quando si utilizzano tipi definiti dall'utente tra database, è consigliabile tenere presenti le considerazioni seguenti:
I tipi devono avere lo stesso nome, incluso lo stesso nome CLR, e devono essere implementati tramite lo stesso assembly in entrambi i database. Gli assembly in due database sono identici se hanno nome, nome sicuro, lingua, versione, set di autorizzazioni di accesso per il codice e contenuto binario identici.
È necessario disporre delle autorizzazioni SELECT ed EXECUTE in ogni colonna di tipo definito dall'utente a cui viene fatto riferimento nella query. Queste autorizzazioni vengono verificate rispetto al database in cui è stata definita ogni colonna.
Se un tipo implementato in un assembly chiama un metodo in un altro assembly, la chiamata tra assembly viene verificata allo stesso modo in cui verrebbe verificata se la query di tipo definito dall'utente non venisse eseguita tra database diversi.