繁体   English   中英

更改表的架构名称但无法传输架构绑定对象

[英]Change table's schema name but cannot transfer a schema bound object

数据库中已存在模式名称菜单和表dbo.Dinner

我想改

dbo.Dinner

menu.Dinner

使用此查询:

ALTER SCHEMA menu TRANSFER dbo.Dinner

我收到错误消息:

cannot transfer a schema bound object

我怎么解决这个问题?

正如我所评论的,我怀疑您至少有一个对象在其CREATE / ALTER中使用了WITH SCHEMABINDING子句,因此您无法更改表对象。 您需要DROP并重新创建这些对象。 举个例子:

USE Sandbox;
GO

CREATE TABLE dbo.Dinner (ID int, Meal varchar(20));
GO

CREATE VIEW dbo.Dinners WITH SCHEMABINDING AS
    SELECT DISTINCT Meal
    FROM dbo.Dinner;
GO

CREATE SCHEMA menu;
GO
ALTER SCHEMA menu TRANSFER dbo.Dinner; --Fails
GO
DROP VIEW dbo.Dinners;
GO
ALTER SCHEMA menu TRANSFER dbo.Dinner; --Succeeds
GO
CREATE VIEW dbo.Dinners WITH SCHEMABINDING AS
    SELECT DISTINCT Meal
    FROM menu.Dinner;
GO
--Ceal up
DROP VIEW dbo.Dinners;
DROP TABLE menu.Dinner;
DROP SCHEMA menu;

您可以使用以下命令获取依赖项列表:

SELECT DISTINCT
       o.[name],
       o.[type_desc]
FROM sys.sql_expression_dependencies sed
     JOIN sys.objects o ON sed.referencing_id = o.object_id
WHERE sed.referenced_schema_name = N'dbo'
  AND sed.referenced_entity_name = N'Dinner';

我们也收到此错误,正是因为我们使用了具有模式绑定的物化视图。

我们最终在新模式中重新创建对象,并使用insert select语句将数据复制到新模式。

每个表的步骤是:

  • 在目标模式中删除表
  • 在目标模式中创建表
  • 从源模式插入到目标模式

这是一个示例脚本:

drop table if exists [target_schema].[dim_forexchange]
go

CREATE TABLE [target_schema].[dim_forexchange](
    [time_year] [int] NOT NULL,
    [local_acct_curr] [nvarchar](50) NOT NULL,
    [DivisorFXtoGBP] [float] NOT NULL,
    [id] [uniqueidentifier] NULL
) ON [PRIMARY]
GO

ALTER TABLE [target_schema].[dim_forexchange] ADD  DEFAULT (newid()) FOR [id]
GO

insert into [target_schema].[dim_forexchange] select * from [dbo].[dim_forexchange];
go

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM