【问题标题】:CREATE TABLE permission denied in database 'tempdb'数据库“tempdb”中的 CREATE TABLE 权限被拒绝
【发布时间】: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]

谢谢 拉朱

【问题讨论】:

    标签: sql-server create-table


    【解决方案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'
          

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-01-21
            • 2014-04-30
            • 1970-01-01
            • 2020-09-08
            • 2014-11-14
            • 1970-01-01
            相关资源
            最近更新 更多