我有一表 table1其中有一字段是sName varchar(10)现在我想通过SQL语句将其修改为 varchar(20)alter table1 alter column sName varchar(20)总要报错,提示有依赖于此列的对象,可我检查了一下除了有个默认值之外就没有了啊,我把默认值删除了。也不能修改。请问:
有没有什么语句可以忽略依赖于此字段的所以对象,直接修改呢?如果没有,请问用什么办法修改?
有没有什么语句可以忽略依赖于此字段的所以对象,直接修改呢?如果没有,请问用什么办法修改?
,外键表名称=object_name(b.fkeyid)
,外键列ID=b.fkey
,外键列名=(SELECT name FROM syscolumns WHERE colid=b.fkey AND id=b.fkeyid)
,主键表ID=b.rkeyid
,主键表名=object_name(b.rkeyid)
,主键列ID=b.rkey
,主键列名=(SELECT name FROM syscolumns WHERE colid=b.rkey AND id=b.rkeyid)
,级联更新=ObjectProperty(a.id,'CnstIsUpdateCascade')
,级联删除=ObjectProperty(a.id,'CnstIsDeleteCascade')
FROM sysobjects a
join sysforeignkeys b on a.id=b.constid
join sysobjects c on a.parent_obj=c.id
where a.xtype='f' AND c.xtype='U'
--查询一个表的所有外键:SELECT 主键列ID=b.rkey
,主键列名=(SELECT name FROM syscolumns WHERE colid=b.rkey AND id=b.rkeyid)
,外键表ID=b.fkeyid
,外键表名称=object_name(b.fkeyid)
,外键列ID=b.fkey
,外键列名=(SELECT name FROM syscolumns WHERE colid=b.fkey AND id=b.fkeyid)
,级联更新=ObjectProperty(a.id,'CnstIsUpdateCascade')
,级联删除=ObjectProperty(a.id,'CnstIsDeleteCascade')
FROM sysobjects a
join sysforeignkeys b on a.id=b.constid
join sysobjects c on a.parent_obj=c.id
where a.xtype='f' AND c.xtype='U'
and object_name(b.rkeyid)='titles'
那又怎么实现SQL语句修改呢?
to:kk19840210 可以在企业管理器中修改。但我们是做产品,且产品已发布,所以只能以脚本方式修改。to:allen_cn 报的错就是:有一个或多个对象依赖于该列。
在企业管理器里看看有没有外键 或者存在触发器
看看是否设置了约束(check,defult默认值,Fk外键,Pk主键),或者是否在这个字段上面有触发器
sp_help tablename
查看一下:
看看是否设置了约束(check,defult默认值,Fk外键,Pk主键),
如果有,则取消约束再运行脚本:
alter table table1 alter column [sName] varchar(20)
再添加约束
select
convert(varchar(20),(select name from dbo.sysobjects where id = a.constid)) as 外键名称,
convert(varchar(20), (select name from dbo.sysobjects where id = a.fkeyid)) as 引用表,
convert(varchar(20), (select name from dbo.sysobjects where id = a.rkeyid)) as 主表
from dbo.sysforeignkeys a
where rkeyid in(select id from dbo.sysobjects where name = '主表名称')
--直接执行报错
alter table mas alter column ida varchar(20)
go
/*
服务器: 消息 5074,级别 16,状态 8,行 5
对象 'PK_mas' 依赖于 列 'ida'。
服务器: 消息 4922,级别 16,状态 1,行 5ALTER TABLE ALTER COLUMN ida 失败,因为有一个或多个对象访问此列。
*/
--删除所有外键引用
ALTER TABLE [dbo].[sub] DROP CONSTRAINT [FK_sub_mas]
--删除主键
ALTER TABLE [dbo].[mas] DROP CONSTRAINT [PK_mas]--修改主表
alter table mas alter column ida varchar(20) not null--注意主键要加 not null
--修改所有引用表
alter table sub alter column ida varchar(20)
--恢复主键
ALTER TABLE [dbo].[mas] ADD CONSTRAINT [PK_mas] PRIMARY KEY CLUSTERED ([ida]) ON [PRIMARY]
--恢复所有外键
ALTER TABLE [dbo].[sub] ADD CONSTRAINT [FK_sub_mas] FOREIGN KEY([ida]) REFERENCES [mas] ([ida])
create table tb(a text)
insert into tb values ('aaaaaa')
go
alter table tb alter column a char(255)
go
select * from tb
drop table tb
---结果集
(1 row(s) affected)
a
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
aaaaaa (1 row(s) affected)
至少要考虑如下东西:
1. 约束, 包括字段默认值/CHECK约束
2. 索引, 包括主键/唯一键/索引/统计
3. 外键约束
改的时候要把与要修改的列相关的上述东西删除, 改完后还要加回来所以你即要找到查找上述对象的方法, 还要想办法查出这些对象的所有信息, 以便能生成重建的脚本
当然这个肯定是写得出来的啦
统计 'hind_1724077428_21A_7A_8A_16A_19A_24A_27A_35A_43A_51A' 依赖于 列 'salemoney'。
服务器: 消息 4922,级别 16,状态 1,行 1
ALTER TABLE ALTER COLUMN salemoney 失败,因为有一个或多个对象访问此列
邹大侠的方法是可以,但不足处在于,由于是产品,所以每个客户的数据库经历版本的升级等,版本不同的原因,并不能将我生成的SQL语句通用于所有用户。请各位大侠再想想办法!