【问题标题】:Change table's schema name but cannot transfer a schema bound object更改表的模式名称,但无法传输模式绑定对象
【发布时间】:2019-05-15 12:08:35
【问题描述】:

架构名称 menu 和表 dbo.Dinner 已存在于数据库中。

我想改变

来自

dbo.Dinner

menu.Dinner

使用这个查询:

ALTER SCHEMA menu TRANSFER dbo.Dinner

我收到错误消息:

cannot transfer a schema bound object

我该如何解决这个问题?

【问题讨论】:

  • 您使用的是哪个 dbms?
  • 微软 sql 服务器
  • 假设您有另一个对象在ALTER/CREATE 中使用WITH SCHEMABINDING 子句引用dbo.Dinner?是这样,您需要DROP 这些对象,移动架构,然后重新创建它们(更新对象名称)
  • 餐桌是否被外键引用?

标签: sql sql-server schema


【解决方案1】:

我们也遇到了这个错误,这正是因为我们使用了带有模式绑定的物化视图。

我们最终在新架构中重新创建对象,并使用 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

【讨论】:

    【解决方案2】:

    正如我评论的那样,我怀疑您至少有一个对象在其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';
    

    【讨论】:

    • 是否以视图作为模式绑定对象为例?我不确定与表 Dinner 相关的模式绑定对象是什么。但是我可以使用您提供的查询在依赖项列表中找到它?
    • 是的,@Erick
    • 感谢您的快速回复!!目前我无法测试它。我会在假期后立即测试它。
    猜你喜欢
    • 2019-12-07
    • 1970-01-01
    • 2014-04-25
    • 1970-01-01
    • 2013-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多