各位大虾,最近我在学习数据库,有几个关于数据库的问题想问问大家:
1、SQL2000或是SQL2005,如何生成附加数据库所需的文件,是不是附加数据库只需要.mdf文件就可以了?
2、附加数据库和还原数据库的区别在哪里,分别应用于那些场合,请举个例子,谢谢?
3、附加数据库是不是在SQL没有创建该数据库时候可以完整的恢复一个数据库,相当于包括创建数据库+创建数据库结构(比如创建表单等)+恢复数据几项功能,还有没有其它的东东?
4、还原数据库是不是只有在SQL上已经创建数据库并创建数据库结构(表单等已建好)的情况下才可以恢复一个数据库,它相当于只有恢复数据这一项功能,不知道我理解得对不对?分数不多了,呵呵,请各位多多指教,非常感谢!

解决方案 »

  1.   

    1.在管理器中将数据分离后,只需要.mdf文件即可附加,如果只是将数据库进行了脱机或停止SQL 服务,那么.mdf和.ldf文件都需要才能附加(SQL不允许在使用的状态下复制数据库文件)
    2.没啥区别吧,都是新产生一个库,也就是对原来库的备份。
    3.附加和还原都可以在不创建一个新库的情况下进行附加或还原操作
    4.同上。
      

  2.   

    还原与备份对应,数据库经过备份,数据库变成.Bak的备份文件,而原有的库还在业务环境中运行,通过备份可以将数据库还原到历史状态.附加和分离对应,数据库文件从业务环节中分离出来,库文件处于停止使用时的状态,不在运行,附加是把原有的数据库重新装入服务. 
      

  3.   

    1、需要先分离数据库,这样你可以把.mdf文件复制,否则不让你复制的。附加数据库只需要.mdf文件,日志文件重新生成。
    2、没什么区别,都是还原数据库。前者日志文件重新生成,后者有以前的日志,可以根据时间点还原。
    3、基本差不多吧。
    4、不是,和附加数据库差不多吧。
      

  4.   

    比较形象合理的比喻是这样:
    如果数据库从北京那的数据库服务器上分离出来了,所有的当前运行数据文件存在USB中,拿到深圳这的数据库服务器上,然后使用sp_attach_db 系统存储过程可以把分离出来的数据库重新挂上去,重新工作;
    还原数据库是原来已经在某个时间被份过的,现在要还原到那个时候的状态;
      

  5.   

    1、首先你的有数据库,需.mdg文件即可,在附加数据库时,数据库必须是服务停止的,否则是允许复制数据库的。
    2、区别吗?附加和还原数据条件必须,你建立数据库的前提下,可通过附加和还原来新增一个数据库,只是两种增加数据库的途径。
    3、还原和备份是相对应的。
      

  6.   

    1、附加数据库有.mdf是就可以了 日志文件在附加数据库过程中会自动生成一个
    2、附加数据库与还原数据库只是元数据文件类型不一样而已 .mdf  .bak
    3、4都可以在不创建一个新库的情况下进行操作 
      

  7.   

    --楼主可以测试如下:
    新建数据库A-->完全备份成a.bak-->修改数据库A,添加表及字段-->完全备份成b.bak。
    新建数据库B—>还原备份a.bak-->再还原备份b.bak,分别查看数据库B和A不同。--use 数据库A(or B)
    --go
    --2005实现数据库表字段属性统计(2000里的系统表sysproperties描述表不存在,2005里用sys.extended_properties视图替代)
    select 
        [表名]=c.Name,
        [表说明]=isnull(f.[value],''),
        [列名]=a.Name,
        [列序号]=a.Column_id,
        [标识]=case when is_identity=1 then '√' else '' end,
        [主键]=case when exists(select 1 from sys.objects x join sys.indexes y on x.Type=N'PK' and x.Name=y.Name 
                            join sysindexkeys z on z.ID=a.Object_id and z.indid=y.index_id and z.Colid=a.Column_id)
                        then '√' else '' end,
        [类型]=b.Name,
        [字节数]=case when a.[max_length]=-1 and b.Name!='xml' then 'max/2G' 
                when b.Name='xml' then '2^31-1字节/2G'
                else rtrim(a.[max_length]) end,
        [长度]=case when ColumnProperty(a.object_id,a.Name,'Precision')=-1 then '2^31-1'
                    else rtrim(ColumnProperty(a.object_id,a.Name,'Precision')) end,
        [小数]=isnull(ColumnProperty(a.object_id,a.Name,'Scale'),0),
        [是否为空]=case when a.is_nullable=1 then '√' else '' end,
        [列说明]=isnull(e.[value],''),
        [默认值]=isnull(d.text,'')    
    from 
        sys.columns a
    left join
        sys.types b on a.user_type_id=b.user_type_id
    inner join
        sys.objects c on a.object_id=c.object_id and c.Type='U'
    left join
        syscomments d on a.default_object_id=d.ID
    left join
        sys.extended_properties e on e.major_id=c.object_id and e.minor_id=a.Column_id and e.class=1 
    left join
        sys.extended_properties f on f.major_id=c.object_id and f.minor_id=0 and f.class=1
    order by 1