Пользовательский тип данных SQL Server 2005, база данных tempdb и разрешения - PullRequest
1 голос
/ 04 марта 2012

У меня есть база данных, работающая на SQL Server 2005, которая имеет определенный пользователем тип данных. Определяемый пользователем тип данных также реализован в базе данных модели, поэтому при создании временной таблицы я могу использовать тот же определяемый пользователем тип данных.

Например, в AppDB я определил этот тип данных:

CREATE TYPE [dbo].[ product_code] FROM [varchar](8) NULL

И то же самое в модели:

CREATE TYPE [dbo].[ product_code] FROM [varchar](8) NULL

Я обнаружил, что если логин безопасности в моем экземпляре базы данных имеет роль сервера sysadmin, то у пользователя нет проблем с вызовом хранимых процедур, которые создают таблицы в базе данных tempdb с использованием типа данных product_code, но если я удаляю sysadmin из безопасности приложения войти в систему, то вызов хранимой процедуры завершится неудачей.

Тот же самый вызов хранимой процедуры завершается успешно, если я заменяю определенный пользователем тип данных системным типом данных varchar.

По соображениям безопасности я не хочу добавлять роль сервера sysadmin к входу в систему безопасности приложения - какие варианты у меня есть, если я хочу продолжать использовать пользовательские типы данных? Меняются ли эти параметры в SQL Server 2008?

В частности, какие разрешения помимо тех, которые предоставлены для public роли, требуются? Ответы, требующие редактирования всех хранимых процедур, будут считаться неотвечающими.

Ответы [ 2 ]

1 голос
/ 07 марта 2012

Проблема с определяемыми пользователем типами данных (или псевдонимами) и tempdb заключается в том, что пользовательские типы данных должны быть определены в модели * 1006. * база данных, как это было сделано правильно здесь. Тем не менее, разрешение на манипулирование этими объектами должно быть предоставлено - разумный способ сделать это - предоставить модели роль с ролью db_ddladmin . При перезапуске службы SQL Server созданная tempdb будет «наследовать» членство в роли db_ddladmin . Если перезапуск SQL Server нежелателен, продолжайте и предоставьте членство в роли db_ddladmin непосредственно для tempdb для пользователя приложения.

Чтобы программно добавить роль db_ddladmin в модель для пользователя с именем «MyAppUser»:

USE [model]
GO
EXEC sp_addrolemember N'db_ddladmin', N'MyAppUser'
GO

Для ясности, фиксированную роль пользователя db_ddladmin не нужно добавлять в базу данных приложения, только в модель.

0 голосов
/ 05 марта 2012

Не должно быть необходимости создавать uddt в базе данных tempdb.Если вы хотите соответствовать вашим типам данных ваших временных таблиц, используйте:

select fieldx, fieldy into #temptable from sourcetable

или используйте:

declare @fieldx product_code

select @fieldx into #temptable

Таким образом, размеры полей совпадают и проблем с разрешениями нет.

Если вы хотите создать постоянные таблицы в базе данных tempdb ... Мой совет - создать специальную базу данных для этих таблиц.

...