【问题标题】:SQL Server 2005 user-defined data type, tempdb and permissionsSQL Server 2005 用户定义的数据类型、tempdb 和权限
【发布时间】:2012-03-22 10:15:30
【问题描述】:

我有一个在 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 是否会更改这些选项?

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

【问题讨论】:

  • 用户在AppDB中有什么权限?例如他们可以创建具有该数据类型的 本地 表吗?
  • 另外,您可能会发现这篇博文很有用。从长远来看,与您的类型相关的文档将比尝试使用别名类型强制执行要少得多。 sqlblog.com/blogs/aaron_bertrand/archive/2009/10/14/…
  • 感谢您提供文章链接——我已将此转发给我们的系统架构师以供他们审核。我刚刚将用户添加到 db_ddladmin 固定用户角色,问题已解决——这是正确的做法吗?我认为这比将用户添加到 sysadmin 角色要好——但我承认我对这些东西知之甚少。
  • 嘿,也许 db_ddladmin 有点矫枉过正——我发现使用 EXECUTE AS OWNER 创建存储过程可能更有意义,根据这篇文章:stackoverflow.com/questions/429051/…
  • 我有一个程序可以让你改变用户定义的数据类型。不过,它应该是 SQL Server 的标准功能。

标签: sql-server-2005 user-defined-types database-permissions tempdb


【解决方案1】:

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

select fieldx, fieldy into #temptable from sourcetable

或使用:

declare @fieldx product_code

select @fieldx into #temptable

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

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

【讨论】:

    【解决方案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,只需要添加到模型中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多