zoukankan      html  css  js  c++  java
  • 问题:Default引起的问题

    问题:

      CREATE   TABLE   tablename(     columnname   VARCHAR(20)   not   NULL   Default   0)    
      GO  
      ALTER   TABLE   doc   DROP   COLUMN   columnname     
      GO  
      会出这样的错误提示  
      服务器:   消息   5074,级别   16,状态   1,行   1  
      对象   'DF__tablename__columnname__4865BE2A'   依赖于   列   'columnname'。  
      服务器:   消息   4922,级别   16,状态   1,行   1  
      ALTER   TABLE   DROP   COLUMN   columnname   失败,因为有一个或多个对象访问此列。  
      请问如何删除这样的列呀!!!

    原因: 

    在SQL Server 中,如果给表的一个字段设置了默认值,就会在系统表sysobjects中生成一个默认约束。

    这时如果强制去修改这个字段,当然就会出现错误。

     解决:

    如果你只想删除这个字段,只要先删除这个约束,在删除这个字段就可以:

    (1)

    declare   @sql   varchar(200)  
      set   @sql   =   'alter   table    tablename   drop   constraint   '+   (select   o.name     from   syscolumns   c,sysobjects   o   where   c.id     =   object_id('tablename')   and   c.name   =   'columnname'     and   c.cdefault   =   o.id)  
      exec(@sql)  
      alter   table   tablename   drop   column   columnname
      go

    (2)

    sql server 中删除默认约束的通用sql脚本
    在SQL Server 中,如果给表的一个字段设置了默认值,就会在系统表sysobjects中生成一个默认约束。
    如果想删除这个设置了默认值的字段(假设此字段名column1),
    执行“ALTER TABLE table1 DROP COLUMN column1”时就会报错:
    The object 'DF__xxxxxxxxxxx' is dependent on column 'column1'.
    ALTER TABLE DROP COLUMN column1failed because one or more objects access this column.

    所以在删除此字段时需要先将系统表中的对应默认约束删除, 可以使用下面的脚本进行删除:
    -- this script drops the default constraint which is generated by the setting of default value.
    DECLARE @tablename VARCHAR(100), @columnname VARCHAR(100), @tab VARCHAR(100)
    SET @tablename='CountryGroupEmailAndWaitAux'
    SET @columnname='actionOfHasNoValidEmail'

    declare @defname varchar(100)
    declare @cmd varchar(100)

    select @defname = name
    FROM sysobjects so
    JOIN sysconstraints sc
    ON so.id = sc.constid
    WHERE object_name(so.parent_obj) = @tablename
    AND so.xtype = 'D'
    AND sc.colid =
    (SELECT colid FROM syscolumns
    WHERE id = object_id(@tablename) AND
    name = @columnname)

    select @cmd='alter table '+ @tablename+ ' drop constraint '+ @defname
    if @cmd is null print 'No default constraint to drop'
    exec (@cmd)

    在删除对应的默认约束后,执行:
    ALTER TABLE table1 DROP COLUMN column1
    即可删除字段。

    (1)和(2)同理

    如果你不想删除这个字段,想修改这个字段的类型,可能采取以下方法:

    从错误提示我们可以看到这样一个字段“DF__tablename__columnname__4865BE2A”,这就是系统产生的一个约束名,我们可以将这个约束删除,以后在做我们想上的操作,同样适用于以上想删除字段的操作。

    这个约束名我们可以通过对表产生“Sql script”的脚本中查到,然后进行以下操作

    ALTER TABLE [dbo].[epcUser] DROP
       CONSTRAINT [DF__tablename__columnname__4865BE2A]
      
      Alter Table [dbo].[epcUser]
      Alter Column IsPasswordChangeRequired tinyint Not Null
      
      ALTER TABLE [dbo].[epcUser] ADD
       CONSTRAINT [DF__tablename__columnname__4865BE2A] DEFAULT (1) FOR [IsPasswordChangeRequired]

    OK,这样我们的问题解决了。

  • 相关阅读:
    转载个人认为原创很不错的分析 :ISCSI网络存储
    使用centos-vault作为停止支持的CentOS的yum源
    AngularJS 第四课(选择框,HTML DOM,HTML 事件)
    AngularJS第三课(控制器(续),过滤器,服务)
    AngularJS第二课(指令,作用域,控制器)
    Angular.js学习笔记——第一课 简介
    简单的响应式表格布局
    在windows sever2012安装web服务器时出现“无法打开运行空间池。服务器管理器 WinRM 插件可能已损坏或丢失”
    HTML5中的全局属性
    href="#"和href="javascript:void(0)"的区别
  • 原文地址:https://www.cnblogs.com/icebutterfly/p/1353775.html
Copyright © 2011-2022 走看看