Share via


Usando tipos definidos pelo usuário por Bancos de Dados

Ao criar um tipo definido pelo usuário, ele será local em um único banco de dados. Por isso, um tipo definido pelo usuário definido em um banco de dados não pode ser usado em uma definição de coluna de outro banco de dados. No entanto, se o mesmo tipo definido pelo usuário estiver registrado e puder ser acessado em dois bancos de dados, você poderá converter um valor de tipo definido pelo usuário de um banco de dados para uso em outro banco de dados. Esse recurso é útil quando você desejar fazer o seguinte:

  • Chamar um procedimento armazenado definido em um banco de dados diferente.

  • Fazer consultas em tabelas definidas em dois bancos de dados diferentes.

  • Selecionar dados de um banco de dados e inserir em outro.

Por exemplo, suponha que o tipo u1 definido pelo usuário seja criado no banco de dados db1 e no banco de dados db2. O procedimento armazenado P2 é criado somente no banco de dados db2 e leva um parâmetro do tipo u1. Você pode chamar o proc p2 com uma instância de tipo u1 do banco de dados db1.

USE db1
DECLARE @u u1
EXEC db2.dbo.p2 @u
GO

Um outro exemplo envolve popular uma tabela temporária em tempdb com os resultados de uma consulta. O tipo definido pelo usuário deve ser registrado em tempdb, para essa operação obter êxito.

INSERT INTO #t SELECT * FROM T 

O registro de um tipo definido pelo usuário no tempdb não é necessário, quando você usa um tipo definido pelo usuário em uma variável de tabela ou quando um cursor usa o um tipo definido pelo usuário, em uma tabela de trabalho.

Ao usar tipos definidos pelo usuário por bancos de dados, você deve se lembrar do seguinte:

  • Os tipos devem ter o mesmo nome, incluindo o mesmo nome CLR, e devem ser implementados por meio do mesmo assembly nos dois bancos de dados. Os assemblies em dois bancos de dados são idênticos se tiverem os mesmos nome, nome forte, cultura, versão, conjunto de permissões de acesso codificado e conteúdo binário.

  • Você deve ter permissões SELECT e EXECUTE em cada de coluna de tipo definido pelo usuário referenciada na consulta. Essas permissões são verificadas com relação ao banco de dados no qual cada coluna está definida.

  • Se um tipo implementado em um assembly chamar um método em outro assembly, a chamada de assembly cruzado é verificada da mesma maneira como se a consulta de tipo definido pelo usuário fosse emitida sem cruzar os bancos de dados.