数据库“tempdb”中的 CREATE TABLE 权限被拒绝

Posted

技术标签:

【中文标题】数据库“tempdb”中的 CREATE TABLE 权限被拒绝【英文标题】:CREATE TABLE permission denied in database 'tempdb' 【发布时间】:2011-09-27 15:49:49 【问题描述】:

我第一次在我的系统上安装了 SQL Server Management Studio Express 和 Visual Studio 2005。现在我正在尝试使用以下脚本创建表。但是,如果一旦我执行,我就会面临像

这样的错误

CREATE TABLE 权限被拒绝 数据库“tempdb”。

为什么会这样?谁能帮我解决这个问题?

USE [tempdb]
GO

SET ANSI_NULLS ON
SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[Employee]
([FirstName] [nvarchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
 [LastName] [nvarchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL
) ON [PRIMARY]

谢谢 拉朱

【问题讨论】:

【参考方案1】:

我进入数据库,安全,用户,右击用户,属性。 成员资格,已检查 db_owner。

【讨论】:

这是一个更好的答案,因为我正在寻找比系统管理员少的角色(其他人在其他问题上的建议)。我有 dbcreator,但我忘记了 db_owner。 完美!会员资格中有很多选择来控制访问。谢谢!【参考方案2】:

我最初的猜测是您在此服务器上没有 CREATE 表权限。你能在下面运行这组查询吗?


-- get login first 
select suser_name() 
--or 
SELECT SYSTEM_USER

-- Now get the permissions assigned to you by the server administrator 
use tempDB 
GO 

;with getPermissions as ( SELECT * FROM fn_my_permissions (NULL, 'DATABASE') ) 
select permission_name from getPermissions 
where permission_name like 'create%' 
GO

如果 permission_name 列返回 0 行,则表示您没有此数据库的 CREATE 权限。请联系您的 DBA 为 tempDB 授予 db_ddladmin。然而,正如 Andomar 所指出的,临时表是在预先附加 # 时在 tempDB 中自动创建的。

【讨论】:

亲爱的 Ram,非常感谢您的回复。我在我的系统上运行你的命令。正如你所说,它返回 o 行。这意味着没有权限。 我找到了这样的解决方案。实际上我使用的是 Windows vista,所以我通过右键单击该图标以管理员身份启动 SQL SEVER MANAGEMENT STUDIO EXPRESS。所以效果很好。【参考方案3】:
Use tempdb
GO
Create User MyUserName For Login MyUserName with Default_Schema= [dbo];
go
use tempdb
go
EXEC sp_addrolemember 'db_ddladmin', N'MyUserName'
go

您需要 db_ddladmin 角色为目标用户创建新表。所以 db_datawriter 角色还不够。

【讨论】:

【参考方案4】:

您正尝试在tempdb 中创建一个永久表。这很不寻常,只要 SQL Server 服务重新启动,tempdb 就会完全消失。

创建临时表的正常方式是:

create table #TempTable (...

# 使其成为本地(特定于连接)临时表。全局临时表以## 开头。以这种方式创建临时表不需要特殊权限。

【讨论】:

【参考方案5】:

我也遇到过这个问题。搜索它,大多数答案都是关于 db_owner 的,在 Security 菜单项中也检查过,但没有显示。在搜索时,我去了this 博客。 Ivan Dimitrov 的回答给了我一点提示。我的创建表查询是:

CREATE TABLE [dbo].[Album](
[Id] [int] IDENTITY(1,1) NOT NULL,
[Name] [nvarchar](150) NULL,
[Description] [nvarchar](500) NULL,
[TrackCount] [int] NULL,
[ReleaseYear] [int] NULL,
[Distributor] [nvarchar](500) NULL,
[ImageUrl] [nvarchar](max) NULL,
[CreatedDate] [datetime] NULL,
CONSTRAINT [PK_Album] PRIMARY KEY CLUSTERED 
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, 
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

我从查询中删除了 [dbo]. 然后运行它,成功执行。也许这不是一个完整的解决方案,但我设法以某种方式使用它。

【讨论】:

【参考方案6】:

我不确定这个答案是否会有所帮助,但我遇到了类似的问题,这就是我解决它的方法。我遇到的问题是由于我的“创建表”默认为 tempdb,我需要指定数据库名称。正如其他人所说,我检查了我的数据库访问操作员以确保我具有创建表权限。由于我已经拥有了必要的权限,所以我想出了下面的解决方案。

以下返回tempdb错误:

driver=SQL Server;server=YOUR_SERVER_NAME;trusted_connection=true

一旦我包含数据库名称,代码就可以正常工作。这是对我有用的代码:

driver=SQL Server;server=YOUR_SERVER_NAME;database=YOUR_DATABASE_NAME;trusted_connection=true'

希望这篇文章对你有帮助!

【讨论】:

以上是关于数据库“tempdb”中的 CREATE TABLE 权限被拒绝的主要内容,如果未能解决你的问题,请参考以下文章

如何收缩 SQL Server 中的 Tempdb 数据库

由于文件组“DEFAULT”中的磁盘空间不足,面临无法为数据库“TEMPDB”分配新页面

SQL Server中的Tempdb已满

如何快速定位TempDB产生问题

SQL Advantage中怎样登录tempdb数据库

sql server 临时库文件太大 迁移tempdb数据库