1

我有一个在 SQL Server 2005 上运行的数据库,它具有用户定义的数据类型。用户定义的数据类型也在模型数据库中实现,所以当我创建一个临时表时,我可以使用相同的用户定义的数据类型。

例如,在 AppDB 中我定义了这个数据类型:

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

和模型中的完全相同:

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

我发现,如果我的数据库实例上的安全登录具有 sysadmin 服务器角色,那么用户调用使用 product_code 数据类型在 tempdb 中创建表的存储过程没有问题——但是如果我从应用程序安全登录中删除 sysadmin,那么存储过程调用失败。

如果我始终将用户定义的数据类型替换为 varchar 系统数据类型,则相同的存储过程调用会成功。

出于安全原因,我不想将 sysadmin 服务器角色添加到应用程序安全登录——如果我想继续使用用户定义的数据类型,我有哪些选择?这些选项会随着 SQL Server 2008 的变化而改变吗?

具体来说,除了授予公共角色的权限之外,还需要哪些权限?需要编辑所有存储过程的答案将被视为无响应。

4

2 回答 2

2

用户定义的数据类型(又名别名)和tempdb的问题首先是必须在模型数据库中定义用户定义的数据类型,这在此处已正确完成。但是,必须授予操作这些对象的权限——这样做的合理方法是将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固定用户角色不需要添加到应用程序db,只需要添加到模型中。

于 2012-03-07T05:32:17.193 回答
-1

应该不需要在 tempdb 中创建 uddt。如果要匹配临时表的数据类型,请使用:

select fieldx, fieldy into #temptable from sourcetable

或使用:

declare @fieldx product_code

select @fieldx into #temptable

这样字段大小匹配并且没有权限问题。

如果您希望在 tempdb 中创建永久表...我的建议是为这些表创建一个特定的数据库。

于 2012-03-04T22:17:17.437 回答