[英]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.