SQLのテーブルのスキーマ名を変更する


175

Employeesデータベースのテーブルのスキーマ名を変更したい。現在のテーブルEmployeesデータベーススキーマ名はdboに変更しexeます。どうすればできますか?

例:

から

dbo.Employees

exe.Employees

私はこのクエリで試しました:

ALTER SCHEMA exe TRANSFER dbo.Employees

しかし、これは私にエラーを与えます:

スキーマ 'exe'は存在しないか、権限がないため、変更できません。

私は何を取りこぼしたか?



1
スキーマexeは存在しますか?
James Culshaw 2013年

いいえ、作成しませんでした。それを作成するにはどうすればよいですか?
theChampion 2013年


私はこの記事を見ましたが、それは少し混乱しています。私の状況でスキーマを作成する方法を教えてもらえますか?
theChampion 2013年

回答:


271

スキーマを作成:

IF (NOT EXISTS (SELECT * FROM sys.schemas WHERE name = 'exe')) 
BEGIN
    EXEC ('CREATE SCHEMA [exe] AUTHORIZATION [dbo]')
END

ALTERスキーマ:

ALTER SCHEMA exe 
    TRANSFER dbo.Employees

3
sys.scemasとEXEC(...)関数とは何ですか?
theChampion 2013年

10
sys.schemasデータベースのすべてのスキーマを含むテーブルです。Exec( '...')は動的SQL呼び出しを実行するだけです。この場合は、CREATE SCHEMAコマンドがクエリバッチの最初のステートメントでなければならず、動的SQLがこれを取得するときに実行する必要があるためです。
Eric J. Price

以下のためにすべての表、チェックこれこれを一つの文でそれを行うには、希望はいくつかのいずれかに役立ちます。
shaijut 2016

スキーマの変更は非常に遅いようです。(300行の小さなテーブルを転送するために3分後に停止しました。)その代わりに、select * into exe.Employees from dbo.Employees
fivelements

29

以下をお試しください

declare @sql varchar(8000), @table varchar(1000), @oldschema varchar(1000), @newschema   varchar(1000)

  set @oldschema = 'dbo'
  set @newschema = 'exe'

 while exists(select * from sys.tables where schema_name(schema_id) = @oldschema)

  begin
      select @table = name from sys.tables 
      where object_id in(select min(object_id) from sys.tables where  schema_name(schema_id)  = @oldschema)

    set @sql = 'alter schema ' + @newschema + ' transfer ' + @oldschema + '.' + @table

   exec(@sql)
 end

set @sql = 'alter schema [' + @newschema + '] transfer [' + @oldschema + '].' + @tableいくつかの特別な単語/文字がエラーを引き起こさないことを確認するために使用する必要がありました。
Stoinov 2018年

21
ALTER SCHEMA NewSchema TRANSFER [OldSchema].[TableName]

ALTER SCHEMASQLでクエリを使用するときは常に角かっこを使用する必要があります。そうしないと、エラーメッセージが表示されます。


5

SSMSを使用して、次の方法で新しいスキーマを作成しました。

  • サーバー内のオブジェクトエクスプローラーで[セキュリティ]フォルダーをクリックします。
  • 右クリックしたスキーマ
  • 「新しいスキーマ...」を選択しました
  • 新しいスキーマに名前を付けました(あなたの場合はexe)
  • OKを押します

この投稿でスキーマを変更することがわかりましたが、新しいスキーマに変更しようとすると、同じ権限エラーが発生していました。SSMSにいくつかのデータベースがリストされているので、データベースを指定してみましたが、うまくいきました。

USE (yourservername)  
ALTER SCHEMA exe TRANSFER dbo.Employees 

3

あなたのコードは:

FROM
 dbo.Employees
TO
 exe.Employees

このクエリを試してみました。

ALTER SCHEMA exe TRANSFER dbo.Employees

書いcreate schema exeて実行するだけ




0

SQLでオブジェクトの名前を変更する場合は、十分に注意してください。自分がやっていることを完全に離れていないと、依存関係が失敗する可能性があります。これは、環境に適切なアクセス権があれば、物事の名前を変更するのは簡単です(多すぎる)。

exec sp_rename 'Nameofobject', 'ReNameofobject'

1
残念ながら、これはこのシナリオでは機能しません。sp_renameは、オブジェクトの[name]値を変更する場合にのみ機能します。スキーマを変更することはできません。試したexec sp_rename 'dbo.Employees', 'exe.Employees'場合、名前は[dbo]。[exe.Employees]になります
Eric J. Price

ALTER SCHEMA(スキーマの名前)TRANSFER(schemaName)。(ObjectName);
djangojazz 2013年

また、テーブルのスキーマを変更すると、そのテーブルを使用するビューは更新されないことに注意してください。これらのビューのテキスト(スキーマ名)を手動で更新する必要があります。(ため息...)
Mike Gledhill 2017

0

SSMSで適切なデータベースコンテキストにいることを確認してください。あなたと同じエラーが発生しましたが、スキーマがすでに存在していることがわかっていました。私が「マスター」のコンテキストにいることに気づかなかった。データベースにコンテキストを変更した後、ALTERは機能しました。


0

場合は、より低いバージョンを探している誰か-

SQL Server 2000の場合:

sp_changeobjectowner @objname = 'dbo.Employess'、@ newowner = 'exe'

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.