初めてシステムにSQL Server Management Studio ExpressとVisual Studio 2005をインストールしました。現在、以下のスクリプトを使用してテーブルを作成しようとしています。しかし、一度実行すると、次のようなエラーが発生します
データベース 'tempdb'でCREATE TABLE権限が拒否されました。
それはなぜですか?誰でもこれを解決する方法を手伝ってくれる?
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]
ありがとうRaju
私の最初の推測では、このサーバー上にCREATE TABLE権限がないと思います。以下の一連のクエリを実行できますか?
-- 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行を返す場合は、このDBに対するCREATE権限がないことを意味します。 tempDBにdb_ddladminを付与するには、DBAに連絡してください。ただし、Andomarが指摘したように、一時テーブルは、#を前に付加するとtempDBに自動的に作成されます。
私はデータベース、セキュリティ、ユーザーに行き、ユーザー、プロパティを右クリックしました。メンバーシップ、db_ownerを確認しました。
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ロールでは十分ではありません。
tempdb
に永続テーブルを作成しようとしています。これはかなり珍しいことです。tempdbは、SQL Serverサービスが再起動されるたびに完全に消去されます。
一時テーブルを作成する通常の方法は次のとおりです。
create table #TempTable (...
#
は、ローカル(接続固有)の一時テーブルにします。グローバル一時テーブルは##
で始まります。この方法で一時テーブルを作成するために特別な権限は必要ありません。
私もこの問題に直面しました。それを検索したところ、ほとんどの答えはdb_ownerであり、セキュリティメニュー項目でも確認されましたが、表示されませんでした。検索中に 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]。をクエリから削除して実行し、正常に実行しました。多分それは完全な解決策ではないかもしれませんが、どういうわけかそれを扱うことができました。
この回答が役立つかどうかはわかりませんが、同様の問題が発生したため、この方法で解決しました。私が経験していた問題は、「テーブルの作成」のデフォルトがtempdbであり、データベース名を指定する必要があったためです。他の人が述べたように、私は自分のDBアクセス演算子を調べて、テーブル作成権限があることを確認しました。私はすでに必要な権限を持っているので、以下の解決策を思いつきました。
次は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'
この投稿がお役に立てば幸いです。