在SQL中更改表的架构名称


173

我想更改Employees数据库中表的架构名称。在当前表中,Employees数据库架构名称是dbo我想要将其更改为exe。我该怎么做 ?

例:

dbo.Employees

exe.Employees

我尝试了以下查询:

ALTER SCHEMA exe TRANSFER dbo.Employees

但这给我一个错误:

无法更改架构“ exe”,因为它不存在或您没有权限。

我错过了什么?



1
架构exe是否存在?
James Culshaw

不,我没有创造。我应该怎么做才能创建它?
TheChampion


我看到了这篇文章,但一点也不令人困惑。您能告诉我如何在我的情况下创建模式吗?
TheChampion

Answers:


267

创建架构:

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

更改模式:

ALTER SCHEMA exe 
    TRANSFER dbo.Employees

3
您能解释一下sys.scemas和EXEC(...)函数吗?
TheChampion

10
sys.schemas是包含数据库所有架构的表。Exec('...')只是运行一个动态SQL调用,在这种情况下它是必需的,因为CREATE SCHEMA命令必须是查询批处理中的第一个语句,并且随着动态SQL的执行而执行此操作。
Eric J. Price

对于所有的表,检查这个这个做在单个语句,希望可以帮助一些之一。
shaijut

使用alter模式似乎非常慢。(我在3分钟后停止了它的操作,以转移具有300行的小表。)相反,我将select *应用于dbo.Employees的
exe.Employees

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

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

ALTER SCHEMA在SQL中使用查询时,我总是必须使用方括号,否则会收到错误消息。


5

通过SSMS,我通过以下方式创建了新的架构:

  • 单击服务器内对象浏览器中的“安全性”文件夹,
  • 右键单击架构
  • 选择“新架构...”
  • 命名我的新架构(在您的情况下为exe)
  • 点击确定

我发现这篇文章可以更改架构,但是在尝试更改为新架构时也遇到了相同的权限错误。我的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

还要注意,当您更改表的架构时,使用该表的所有视图都不会更新。您需要在这些视图中手动更新文本(架构名称)。(叹气)
Mike Gledhill

0

确保您在SSMS中处于正确的数据库环境中。遇到与您相同的错误,但是我知道该模式已经存在。没意识到我处于“主”环境中。在将上下文更改为数据库后,ALTER工作了。


0

万一有人在寻找较低版本-

对于SQL Server 2000:

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.