Использование пользовательских типов в нескольких базах данных
После создания пользовательский тип можно использовать в локальной базе данных. Таким образом, пользовательский тип, созданный в одной базе данных, нельзя использовать в определении столбца другой базы данных. Тем не менее если один и тот же пользовательский тип зарегистрирован и доступен в двух базах данных, значение этого типа из одной базы данных можно преобразовать и использовать в другой базе данных. Эта возможность полезна, когда требуется:
Вызвать хранимую процедуру, определенную в другой базе данных.
Выполнить запрос к таблицам в двух разных базах данных.
Выбрать данные в одной базе данных и вставить в другую.
Допустим, пользовательский тип 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 для каждого столбца пользовательского типа, на которые ссылается запрос. Эти разрешения проверяются в каждой базе данных, которые содержат указанные столбцы.
Если тип, определенный в одной сборке, вызывает метод другой сборки, такой вызов проверяется так же, как если бы запрос пользовательского типа не ссылался на другую базу данных.
См. также