Поделиться через


Использование пользовательских типов в нескольких базах данных

После создания пользовательский тип можно использовать в локальной базе данных. Таким образом, пользовательский тип, созданный в одной базе данных, нельзя использовать в определении столбца другой базы данных. Тем не менее если один и тот же пользовательский тип зарегистрирован и доступен в двух базах данных, значение этого типа из одной базы данных можно преобразовать и использовать в другой базе данных. Эта возможность полезна, когда требуется:

  • Вызвать хранимую процедуру, определенную в другой базе данных.

  • Выполнить запрос к таблицам в двух разных базах данных.

  • Выбрать данные в одной базе данных и вставить в другую.

Допустим, пользовательский тип u1 создан в базах данных db1 и db2. Хранимая процедура p2 создана только в базе данных db2 и имеет параметр типа u1. Процедуру p2 с параметром типа u1 можно вызвать из базы данных db1.

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

Еще одним примером является заполнение временной таблицы в базе данных tempdb результатами запроса. Чтобы такая операция была выполнена успешно, пользовательский тип должен быть зарегистрирован в базе данных tempdb.

INSERT INTO #t SELECT * FROM T 

Регистрация пользовательского типа в базе данных tempdb не требуется, если он используется для табличной переменной или курсор использует его в рабочей таблице.

При использовании пользовательского типа в нескольких таблицах необходимо помнить о следующем:

  • Имена типов должны совпадать, включая имена CLR. Они должны быть реализованы в одной и той же сборке в обеих базах данных. Сборки в обеих базах данных идентичны, если имеют одинаковое имя, строгое имя, диалект, версию, набор разрешений доступа к коду и двоичное содержимое.

  • Необходимо иметь разрешения SELECT и EXECUTE для каждого столбца пользовательского типа, на которые ссылается запрос. Эти разрешения проверяются в каждой базе данных, которые содержат указанные столбцы.

  • Если тип, определенный в одной сборке, вызывает метод другой сборки, такой вызов проверяется так же, как если бы запрос пользовательского типа не ссылался на другую базу данных.