‘壹’ 有个字段被不小心改了类型,该字段下原来的数据都没有了,有没方法恢复
没有办法恢复的。。。
‘贰’ SQL数据库已经建立一个表,忘记了定义主键
alter table b_news add CONSTRAINT PK primary key (b_id)
‘叁’ 查询表修改记录
修改项目时,涉及到了Oracle中许多旦罩态表的修改(包括:增加、删除字段,修改注释等)。由于开始没有进行记录,造成在上测试机时,忘记了具体修改过哪些表了。后来在网上查找了一些资料,例如: www.2cto.com 1、select uat.table_name from user_all_tables uat 该SQL可以获得所有用户表的名称 2、select object_name, created,last_ddl_time from user_objects 该SQL可以获得所有用户对象(包括表)的创建和最后修改时间 综合以上SQL,总结了如下语句模源: select uat.table_name as 表名,(select last_ddl_time from user_objects where object_name = uat.table_name ) as 最后修改日期 from user_all_tables uat 通过该语句,可以得到所有表的最后修改时间。(大家可以根据闷禅实际情况在该SQL后面加上相应的条件表达式) 通过对查询结果中最后修改时间的降序排列,就可以知道那些表的结构修改过了。
由于应用的bug导致部分数据字段被更新为空,发现时已经有两个月了,这些字段内容挺重要的,如何才能找回这些数据呢? rman只能恢复某个点的数据,因为在此期间不断有insert,这些新增数据也会被update,因此任何一点的数据都不全,备份也是每天晚上备份,当天插入当天update的数据同样无法恢复。 方法:不完全的恢复的就一个rman,一个是logminer,感觉logminer不现实,时间太长了,使用rman进行基于时间点的不完全恢复后,使用read only打开数据库,将需要的表,导出,然后在使用rman进行数据库的完全恢复,思路是这样的,务必进行测试
ORACLE 中查询某个表中某条记录的修改记录方法如下: select * from v$sql where sql_text like 'update tableName%'
‘肆’ 数据库字段值修改问题
需要用到函数Mid(string, start[, length]) ,与函数len(string)函数,
其中的length长度使用 len(2008-09-29 08:36:20)取得即可,这样就可以纳稿了,
具体的SQL语租租句为:
update 表 set 字段=mid(字段,1,len(2008-09-29 08:36:20))
呵呵洞型孝,应该将问题解决了,^_^
‘伍’ 如何保证数据库结构的合理性(一、调整字段)
(一)调整字段 数据库中字段是表的基本结构部分,所以在调整整个表闷没之前必须使得字段都是处于最好状态。很多情况下,字段的选择确定会减少很多给定表的已有问题,也能避免一些潜在的问题的产生。 1)字段名称的调整 字段描述的是表所描述的物体的特征。如果给字段一个合适的名称,就可以标识这个打算要描述的特征。一个有歧义的含糊不清的名称是一个麻烦的征兆,暗含这个字段的代表含义还没有真正明确下来。可以利用下面清单中的内容检查每一个字段名称。1.对整个组织来说,这个名称是否具有一定的说明意义? 要确保对于访问这个字段的每个人来说这个名称都是有描述意义的。语义有时候是非规则的,如果字段所用的词对于不同的人群来说语义不同,那就麻烦了。就好象在大部分地区,摇头表示的是“No”,而在印度,摇头则表示“Yes”。2.这个字段是否清楚没有歧义? 比如PhoneNumber就很容易让人误会。描述的是哪种电话号码?为了明确起见,如果需要记录每一种电话号码,那么应创建HomePhone、WorkPhone、CellPhone这样的字段。 另外还需要确保不会在不同的表中使用相同的字段名。如有必要,建议在相同的字段名称前面加上一个短短的前缀。比如,Vendors表中用VendCity,Customers表中用CustCity,Employees表中用EmpCity这样的名称。 总之,确保数据库中的每一个字段都有唯一的名称,在整个数据库结构中仅出现一次。除非这一字段被用来建立两个表之间的关联关系。3.是否使用首字母的缩写或者其他缩写形式作为字段名称? 如果有,请修改它!首字母的缩写很难解释,易被误解。使用缩写要非常谨慎,处理的时候也小心。如果对字段名称有一个信息的正向补充增强作用的情况下才使用缩写,缩写不能损害字段本身所表示的意义。4.是否使用了暗含或者明确标识多个特性的字段名称? 这种字段一般很容易发现,因为有类似于“and”或“or”这样的代表性字词。包含反斜线符号(\)、连字符(-)、与的记号(&)的字段同样也属于这一类型。如果发现这样的字段,检查所存储的数据,看是否需要将它们拆开成为更小的单独字段。5.确保字段名称的单数形式 字段所描述的是表所代表的物体的单一的特征,所以字段名应该是单数。而另一方面,表的名称之所以是复数,是因为它所描述的是同类对象或事件的集合。使用这一命名规则后,区分表的名称和字段名称就是一件很容易的事了。 2)消除粗糙的边 修正了字段名,现在就应该转而注意字段本身的结构了。虽然对字段的合理性已经有了相当的把握,但还是有几点需要继续努力来使字段结构尽可能更加合理高效。1.确保字段描述的是表所表示的物体某一特性。 这一步可确定字段是否真的属于这个表。如果它和这个表的关系并不密切,那就删除它。这个规则也有一个例外情况:这个字段是用来建立这个表和数据库中另一个表之间的关联关系,或为了完成数据库应用的某些任务而专门添加到表中。2.确保字段中仅包含一个单一的值。 一个字段可能会潜在地保存相同值的几个具体实例,这称为多值字段。同样地,一个字段也可能潜在地保存两个或多个各自不同的值,这称为多型字段。多值字段和多型字段会给数据库管理带来混乱,尤其是在对这些数据进行编辑、删除和排序时。当每一个字段存储的是单一值时,会对保证数据完整性和信息正确性有很大的帮助。3.确保字段所存储的内容不是计算结果或者一连串事件的结果。 一个设计良好的表中不允许出现计算列。主要原因是因为计算列的值本身。这里的字段,不像电子数据表格中的一个单元,不能保存一个具体的计算值。当计算表达式中的任何一部分改变,存储在字段中的计算值不会随之更新。唯一方式是手工修改或者编写代码年进行自动修改。然而,使用计算列的首选是在SELECT语句中结合使用。4.确保在整个数据库中一个字段仅出现一次。 一个普遍错误是向数据库中的好几个表插入了相同的字段,那就会面临数据不一致的问题。此时,改变了一个表中的这个字段而忘记了对其他表中的相同字段进行相同的修改,就会出现数据的不一致。避免这个问题的方法微十时毫 确保整个数据库结构中一个字段仅出现一次。(此规则的例散祥外情况是用某一个字段来建立两个表之间的关联关系。) 3)多型字段的处理 识别多型字段可以先回答一个简单问冲罩搏题:是否能将当前字段的值分解成更小的独立的几部分?如果回答“是”,那么这就是一个多型字段。 比如Customers表中有这个一个字段StreetAddress,里面的记录为“15127 NE 24th ,#383 ,Redmond ,WA 98052”。这个字段就可以拆分为CustAddress、CustCity、CustState和CustZipcode,分别存储15127 NE 24th 、Redmond、WA和98052。下面是书中调整前和调整后的表:调整后: 有时候可能识别一个多型字段是比较困难的,比如Instruments表中有这么一个字段IstrumentID,里面存储了GUIT2201、MFX3349、AMP1001、AMP5590、SFX2227和AMP2766。乍看好象不是多型字段,仔细查看就会发现,此字段的值中包含了两个不同的信息:设备所属的类别——如AMP(amplifier,扩音器)、GUIT(guitar,吉他)和MFX(multieffects unit,音效组合)——以及这些设备的标识号码。这两个值应该分开保存在各自的字段中,以保证数据完整性。下图是Instruments表: 4)多值字段的处理 多值字段的处理比多型字段相对困难一些,但是值得庆幸的是,多值字段一眼就能识别出来。几乎毫无例外的,这一类型字段存储的值包含许多逗号,逗号用来分隔字段中值的不同部分。 在对多值字段进行处理之前,要先明白最初想要赋予的多值字段和表之间的关系。多值字段的值和其父表中的记录是M:M的关系:一个多值字段中的某一个确定的值和父表中的多个记录相关,父表中的一个记录和多值字段中的多个值相关联。处理这种多对多关系和其他多对多关系的方法一样——用一个关联表。 要创建关联表,使用多值字段并复制原来表中的主关键字作为建立新表的基础部分。给这个新的关联表一个合适的名字,并指定这两个字段为其组合主关键字。(这种情况下,组合两个字段中的值就能惟一标识新表中的每一个记录。)然后就可以在一对一的基础上对新表中的两个字段关联了。 比如现在有Pilots表,表中有三个字段PilotID、PilotName、Certifications,有两个记录分别为:25100、John、727,737,757,MD80;25101、David、737,747,757。很注意到Certifications是一个多值字段(存储的值包含了逗号),先将Certifications从Pilots表中删除,然后将根据Certifications的内容新建Certifications表,Certifications表中有如下字段CertificationID和TypeofAircraft,包含记录如下:8102、Boeing 727;8103、Boeing 737;8104、Boeing 747;8105、 Boeing 757;8106、 McDonnell Douglas MD80。接着,在创建一关联表,比如Pliot Certifications表,表中的字段分别为Pilots表的主键PilotID和Certifications表的主键CertificationID。 为了方便,上面的例子是我简化过的,下面是书中的例子: 调整前的表:调整后的表:
‘陆’ 用户提交修改后表单,我想知道哪些信息被修改了,以方便我在数据库中更新特定字段
老实说,意义不大
要知道哪些信息被陆凯修改,那就得先把字段信息从数据库中读出来,然后再与表单数据想匹配比对,然后再对有修改的数据更新到数据库,这个过程所写的代码,所花的时间更多歼嫌。早改唤
还不如提交表单后,直接对提交的数据更新到数据库,达成数据更新的目的。
‘柒’ 数据库如何避免错误的字段值
在数据库中避免错误的字段值是一个很重要的问题,这涉及到数据库设计的规范性和数据的准确性问题。以下是一些常见的方法可以帮助避免错误的字段值。
1. 数据库约束:数据库约束是一种强制性规则,它可以在数据库层面上强制保证数据的完整性和正确性。通过定义不同类型的约束,例如主键、漏拦唯一性约束、非空约束、默认值约束等可以限制字段取值范围,从而避免错误的字段值。
2. 枚举类型:如果一个字段只能取一定范围内的值,可以考虑使用枚举类型,将所有合法的值列出来。这样就可以避免非法的值插入到该字段中。
3. 触发器:触发器是一种特殊的存储过程,它可以在数据被插入、修改或删除时自动执行一些代码。可以使用触发器检查新插入或修改的数据是否符合要求,如果不符合,则拒绝该数据的修改或插入。
4. 应用程序层面的控制:在应用程序中可以加入相应的业务逻辑控制,进行数据校验,薯渣从而避免错误的字段值。例如在后台应用程序中对用户提交的数据进行校验,如果发现数据不符合要求,则提示用户修改,并禁止提交数据。
5. 数据库设计规范:在数据库设计阶段,应该建立规范返手胡的设计标准和流程,从而确保数据库的稳定性和可靠性。通过建立数据库设计文档,明确字段定义和规范,对于数据字典进行维护和更新,可以有效地减少错误的字段值的问题。
需要注意的是,以上方法可以在一定程度上减少错误的字段值,但无法完全避免。因此,在数据库的日常维护和管理中,还需要定期进行数据的备份、恢复和验证,以确保数据安全和可靠性。
‘捌’ SQL问题:本想执行update修改一条数据的,结果忘记写where条件了。结果那个表的那一列都改了。能改回来么
修改之前没进行备份数据? 可怜的娃。。。
方法一:
数据还原到指定时间点的处理示例:
--创建测试数据库
CREATE DATABASE Db
GO
--对数据库进行备份
BACKUP DATABASE Db TO DISK='c:\db.bak' WITH FORMAT
GO
--创建测试表
CREATE TABLE Db.dbo.TB_test(ID int)
--延时1秒钟,再进行后面的操作(这是由于SQL Server的时间精度最大为百分之三秒,不延时的话,可能会导致还原到时间点的操作失败)
WAITFOR DELAY '00:00:01'
GO
--假设我坦渗们现在误操作删除了 Db.dbo.TB_test 这个表
DROP TABLE Db.dbo.TB_test
--保存删除表的时间
SELECT dt=GETDATE() INTO #
GO
--在删除操作后,发现不应该删除表 Db.dbo.TB_test
--下面演示了如何恢复这个误删除的表 Db.dbo.TB_test
--首先,备份事务日志(使用事务岩棚日志才能还原到指定的时间点)
BACKUP LOG Db TO DISK='c:\db_log.bak' WITH FORMAT
GO
--接下来,我们要先还原完全备份(还原日志必须在还原完全备份的基础上进行)
RESTORE DATABASE Db FROM DISK='c:\db.bak' WITH REPLACE,NORECOVERY
GO
--将事务日志还原到删除操作前(这里的时间对应上面的删除时间,并比删除时间略早
DECLARE @dt datetime
SELECT @dt=DATEADD(ms,-20,dt) FROM # --获取比表被删除的时间略早的时间
RESTORE LOG Db FROM DISK='c:\db_log.bak' WITH RECOVERY,STOPAT=@dt
GO
--查询一下,看表是否恢复
SELECT * FROM Db.dbo.TB_test
/*--结果:
ID
-----------
(所影响的行数为 0 行)
--*/
--测试成功
GO
--最后删除我们做的测试环境
DROP DATABASE Db
DROP TABLE #
方法二:
用日志工具Log Explorer
步骤:
1、查看日志
a、打开log explorer,选择菜单File--> attach log file
b、在Log File Selection窗口中,填写连接到要恢复数据的数据库服务器机器名、数据库登录ID及密码,然后点击 "Connect "按钮。
c、若连接成功,则窗口左边树将显示命令菜单,这时我们点击Browser下的View Log命令,此时窗粗信则口右边则出现该数据库的Log。
2、恢复数据库
这时您只要选择您要恢复对事件点,右键点击选择 "undo transation "命令,保存T-SQL代码,然后在查询分析器中执行该T-SQL代码
‘玖’ mysql update 更新数据时部分字段修改了部分字段没有修改
UPDATE member_fields SET province = '$city', city = '$city' WHERE mid = 4007
这伍侍种修改的时候,province 能保证每次得到最新的$city值?而city不可以?尝试查看提交页面,看city相对应的代码,是否袭橘纤和province 完全一致?还是有其他不同?
将提交页面覆写,将city改名,进行尝试
代码问题往往就是一个极小的疏忽导致拍仿的。仔细,再仔细。
‘拾’ 没带条件修改了某字段值怎么还原
没带条件修改了某字段值利用数据库还原功能恢复到你更新之带孙前的数据库时间。
新建一个数据库,毕哗把备份还原到新建库上,然后关连两个库的这个表,把备份上的手行行这个字段update回来。
备份之后加的数据就没有办法了。