我在SQL Server 2005上运行了一个具有用户定义数据类型的数据库。用户定义的数据类型也在model数据库中实现,因此当我创建临时表时,我可以使用相同的用户定义数据类型。
例如,在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而变化?
具体而言,除了授予公共角色的权限之外,还需要哪些权限?需要编辑所有存储过程的答案将被视为无响应。
答案 0 :(得分:1)
用户定义数据类型(又名别名)和 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中,只需添加到模型中。
答案 1 :(得分:-1)
不需要在tempdb中创建uddt。如果要匹配临时表的数据类型,请使用:
select fieldx, fieldy into #temptable from sourcetable
或使用:
declare @fieldx product_code
select @fieldx into #temptable
这样字段大小匹配,没有权限问题。
如果你想在tempdb中创建永久表...我的建议是为这些表创建一个特定的数据库。