最初做一个数据库,里边一些表、存储过程、视图等等。用户也开始用了,输入了很多数据,慢慢的,由于需求提的不一样,经常要修改数据库。比如改某个字段,修改一下存储过程之类的。每次是给他们一个修改数据库文件的。只要每次按这个文件改,肯定得到的数据库是和我这边开的数据库属性保持一致的(数据库数据可以不一样)。但现在客户提出来了,有可能某些次没有进行数据库修改,导致我开发那边的数据库和他们实际用的数据库不一致,有什么办法看一不一致吗?

解决方案 »

  1.   

    /**
    * 名称:两个SQLServer数据库比较
    * 用途:比较数据库内对象(表、视图、函数、存储过程、触发器、约束等)、字段(数据类型及长度)
    * 假设:库TABLE_A与TABLE_B是一个项目不同时期的版本数据库,由于整合的需要,那么下面的功能可能有用
    * 使用:将TABLE_A、TABLE_B库的名称替换成你需要对比的两个即可F5
    * 作者:黄顺龙
    * 联系:[email protected]
    */create table #type(type nvarchar(50)  collate Latin1_General_CI_AS_KS_WS,info nvarchar(50))
    insert #type values('AF','聚合函数(CLR)');
    insert #type values('C','CHECK约束');
    insert #type values('D','DEFAULT(约束或独立)');
    insert #type values('F','FOREIGNKEY约束');
    insert #type values('PK','PRIMARYKEY约束');
    insert #type values('P','SQL存储过程');
    insert #type values('PC','程序集(CLR)存储过程');
    insert #type values('FN','SQL标量函数');
    insert #type values('FS','程序集(CLR)标量函数');
    insert #type values('FT','程序集(CLR)表值函数');
    insert #type values('R','规则(旧式,独立)');
    insert #type values('RF','复制筛选过程');
    insert #type values('SN','同义词');
    insert #type values('SQ','服务队列');
    insert #type values('TA','程序集(CLR)DML触发器');
    insert #type values('TR','SQLDML触发器');
    insert #type values('IF','SQL内联表值函数');
    insert #type values('TF','SQL表值函数');
    insert #type values('U','表(用户定义类型)');
    insert #type values('UQ','UNIQUE约束');
    insert #type values('V','视图');
    insert #type values('X','扩展存储过程');
    insert #type values('IT','内部表');--找出缺失对象(表、视图、函数、存储过程、触发器、约束等)
    select 'TABLE_B缺少对象【'+b.info+'】:'+a.name from TABLE_B.sys.objects a,#type b where cast(a.type as nvarchar(50))=cast(b.type as nvarchar(50)) and a.name not in(
    select c.name from TABLE_A.sys.objects c
    )
    union all
    select 'TABLE_A缺少对象【'+b.info+'】:'+a.name from TABLE_A.sys.objects a,#type b where cast(a.type as nvarchar(50))=cast(b.type as nvarchar(50)) and a.name not in(
    select c.name from TABLE_B.sys.objects c
    )
    --找出缺失表
    --select 'TABLE_A无表:'+name from TABLE_B.sys.tables where type='U' and name not in (
    -- select name from TABLE_A.sys.tables
    --)
    --union all
    --select 'TABLE_B无表:'+name from TABLE_A.sys.tables where type='U' and name not in (
    -- select name from TABLE_B.sys.tables
    --)union all
    --找出缺失字段
    select 'TABLE_B..'+a.name+'表中缺少字段:'+b.name 
    from TABLE_B.sys.columns b,TABLE_B.sys.tables a
    where a.object_id= b.object_id
    and a.name in(
    select e.name from TABLE_A.sys.tables e
    )
    and b.name not in (
    select name from TABLE_A.sys.columns c where c.object_id=(select top 1 d.object_id from TABLE_A.sys.tables d where d.name=a.name)
    )
    union all
    select 'TABLE_A..'+a.name+'表中缺少字段:'+b.name 
    from TABLE_A.sys.columns b,TABLE_A.sys.tables a
    where a.object_id= b.object_id
    and a.name in(
    select e.name from TABLE_B.sys.tables e
    )
    and b.name not in (
    select name from TABLE_B.sys.columns c where c.object_id=(select top 1 d.object_id from TABLE_B.sys.tables d where d.name=a.name)
    )

    union all
    --找出差异字段(数据类型及长度不一致的情况)
    select 'TABLE_B.dbo.'+a.name+'.'+b.name+'字段的数据类型或长度与TABLE_A库中的描述不一致' from TABLE_B.sys.tables a,TABLE_B.sys.columns b 
    where a.object_id= b.object_id 
    and a.name in(
    select c.name from TABLE_B.sys.tables c
    )
    and b.name in(
    select d.name from TABLE_B.sys.columns d where d.object_id in(
    select e.object_id from TABLE_B.sys.tables e where e.name=a.name
    )
    )
    and (
    b.user_type_id !=(select top 1 f.user_type_id from TABLE_A.sys.columns f where f.name=b.name and f.object_id = (select top 1 g.object_id  from TABLE_A.sys.tables g where g.name=a.name))
    or b.max_length !=(select top 1 f.max_length from TABLE_A.sys.columns f where f.name=b.name and f.object_id = (select top 1 g.object_id  from TABLE_A.sys.tables g where g.name=a.name))
    )
    union all
    select 'TABLE_A.dbo.'+a.name+'.'+b.name+'字段的数据类型或长度与TABLE_B库中的描述不一致' 
    from TABLE_A.sys.tables a,TABLE_A.sys.columns b 
    where a.object_id= b.object_id 
    and a.name in(
    select c.name from TABLE_A.sys.tables c
    )
    and b.name in(
    select d.name from TABLE_A.sys.columns d where d.object_id in(
    select e.object_id from TABLE_A.sys.tables e where e.name=a.name
    )
    )
    and (
    b.user_type_id !=(select top 1 f.user_type_id from TABLE_B.sys.columns f where f.name=b.name and f.object_id = (select top 1 g.object_id  from TABLE_B.sys.tables g where g.name=a.name))
    or b.max_length !=(select top 1 f.max_length from TABLE_B.sys.columns f where f.name=b.name and f.object_id = (select top 1 g.object_id  from TABLE_B.sys.tables g where g.name=a.name))
    )
    drop table #type--sys.objects.type 类型枚举值如下:
    --AF  =   聚合函数   (CLR) 
    --C   =   CHECK   约束 
    --D   =   DEFAULT(约束或独立) 
    --F   =   FOREIGN   KEY   约束 
    --PK   =   PRIMARY   KEY   约束 
    --P   =   SQL   存储过程 
    --PC   =   程序集   (CLR)   存储过程 
    --FN   =   SQL   标量函数 
    --FS   =   程序集   (CLR)   标量函数 
    --FT   =   程序集   (CLR)   表值函数 
    --R   =   规则(旧式,独立) 
    --RF   =   复制筛选过程 
    --SN   =   同义词 
    --SQ   =   服务队列 
    --TA   =   程序集   (CLR)   DML   触发器 
    --TR   =   SQL   DML   触发器 
    --IF   =   SQL   内联表值函数 
    --TF   =   SQL   表值函数 
    --U   =   表(用户定义类型) 
    --UQ   =   UNIQUE   约束 
    --V   =   视图 
    --X   =   扩展存储过程 
    --IT   =   内部表
      

  2.   

    我们公司是用tfs作为源代码管理,然后所有对结构的增删改都通过tfs生成变更脚本。或者使用一个工具来比对差异,这个工具免费,而且可以批量生成差异脚本,到客户数据库一次性执行即可:AdeptSQL Diff
      

  3.   

    AdeptSQL Diff 可以的,有试用版
      

  4.   

    当然有免费版本的:
    DbDiff: Database Diff and Database Scripting  http://dbdiff.codeplex.com/