vTiger 记录在回收站清空后仍然在数据库里面存在
来源:互联网 发布:c语言控制台好看界面 编辑:程序博客网 时间:2024/06/06 19:43
在Vtiger 的首页Dashbaod 中存在一个数据完整性的问题,主要存在的情况是对用户进行登录名的修改后的遗留问题。
具体情况是,查看当前首页中的 Dashboard 里面关于当前用户的日历有2项内容。
如果通过单击柱状图的链接,进入到事件日志中,我们发现实际上,当前用户只有一个事件。
如果我们尝试删除这个记录,不用清除回收站,我们会发现在首页里面仍然还有一个记录。
就算我们清除回收站,也还有同样的问题,这条记录不能完全删除。
这时候你可以打开SQL, 让Vtiger将执行的SQL给你打印到日志文件中。
在日志文件中有一个SQL,语句内容如下:
- SELECT count( * ) AS count
- FROM vtiger_crmentity se
- INNER JOIN
- vtiger_activity act
- ON act.activityid = se.crmid
- WHERE se.deleted = 0 AND se.smownerid = 6
- AND((act.status != 'Completed' AND act.status != 'Deferred')
- OR act.status IS NULL)
- AND((act.eventstatus != 'Held' AND act.eventstatus != 'Not Held')
- OR act.eventstatus IS NULL)
现在,你可以修改这个 SQL ,在这SQL 里面加一个输出项se.crmid ,这样你就可以知道是那个ID 导致的这问题。
新的SQL 如下:
- SELECT count( * ) AS count, se.crmid
- FROM vtiger_crmentity se
- INNER JOIN
- vtiger_activity act
- ON act.activityid = se.crmid
- WHERE se.deleted = 0 AND se.smownerid = 6
- AND((act.status != 'Completed' AND act.status != 'Deferred')
- OR act.status IS NULL)
- AND((act.eventstatus != 'Held' AND act.eventstatus != 'Not Held')
- OR act.eventstatus IS NULL)
下面就好了,直接看为什么是这条记录导致的这个重复
现在你可以分析下这个SQL 了,主要是看判断条件。
- se.deleted = 0 AND se.smownerid = 6
se.smownerid 是当前登录的用户ID 号。按照逻辑来说,如果数据被物理删掉了,这2个表里面是不应该有数据存在的,就是因为没有被物理删除掉,所以这2个表会有数据存在。
这时候可以尝试将 ID = 126 的记录的删除标记修改为 1 试试了。
首先你执行SQL
- select * from vtiger_crmentity se where se.deleted = 0 AND se.smownerid = 6
你再执行下面的SQL
- SELECT count( * ) AS count, se.crmid
- FROM vtiger_crmentity se
- INNER JOIN
- vtiger_activity act
- ON act.activityid = se.crmid
- WHERE se.deleted = 0 AND se.smownerid = 6
- AND((act.status != 'Completed' AND act.status != 'Deferred')
- OR act.status IS NULL)
- AND((act.eventstatus != 'Held' AND act.eventstatus != 'Not Held')
- OR act.eventstatus IS NULL)
这时候,你到前台刷新下首页的 Dashboard 看看,应该是显示没有任何记录了。
这个就是这个问题的原因。主要是数据库数据的逻辑错误,理论上,如果删掉了数据,这2个表里面的数据要不就打上了删除标记,要不就直接删了。
这种错误最难找也最隐蔽。
这时候只能依赖日志了。
还记得我们曾经删除掉一条事件记录吗?
这时候,你可以到回收站里面将这条记录恢复。
恢复后执行下面的语句
- select * from vtiger_crmentity se where se.deleted = 0 AND se.smownerid = 6
从这里我们可以知道,就算是数据被删除到回收站了,一旦数据被删除了,那应该会给这个数据打上删除标记的,这个表里面就不应该有相关这条记录的。
你可以使用下面的SQL
- select * from vtiger_crmentity se where se.deleted = 0 AND se.smownerid = 6
在进行清空回收站操作之前,这条记录是不会被物理删除掉的。
所有对于有逻辑错误的地方,你就将删除标记打上就可以了。
个人认为,这个问题主要是在我们曾经安装过数据的测试数据。
最开始,我们安装的时候,都会安装自带的Demo数据,这部分的数据有助于我们能更好的理解系统,同时也为数据的一致性带来了一些麻烦。
比如说,你习惯于用admin这个用户登录,忽然有一天你心里不舒服了,把这个admin用户改成别的用户了,新改的这个用户可能会继承admin这个用户的一些东西过来。有时候你就很奇怪了,明明我没有做这些东西,为什么我会看到这些记录呢?
这个就是系统数据完整性带来的麻烦。
这种问题没有办法完全克服,只要是系统,只要有人用,就会出现各种各样的问题。所以我的习惯是不轻易删除数据库里面的数据。一些系统的设计思路是将记录打上删除标志,这样只是控制显示,而不是控制物理删除。
从这个例子,我们也可以知道Vtiger是这样做的。这样的好处是一旦有问题了,我们可以根据删除标志恢复数据,不好的是造成了数据冗余。
在过去,计算机只有几百兆内存的时候,这种冗余会带来系统负担。现在数据库的理念已经有所变化了,保持必要的冗余是非常好的习惯。
同时,现在的系统单一硬盘都能做到1个TB了,存储早就不是问题,而且内存已经跨入了数十 GB的时代了。这时候你还担心有数据冗余吗?
比较数据损失和数据冗余,我宁愿要数据冗余。
可以供以后分析的时候参考, 这部分其实日志输出中有关SQL的部分。
可以放到你的客户端软件里面执行下,你就知道这个这个操作后,Vtiger 都干了些什么事情了,找问题也会容易些,因为范围缩小了。
转自:http://ip-64-15-152-108.static.privatedns.com/thread-576-1-1.html
- vTiger 记录在回收站清空后仍然在数据库里面存在
- 在linux设置回收站
- 仍然在写毕业论文
- 怎样在Oracle数据库里面建数据库
- 温州不锈钢阀门厂家解析真空蝶阀在使用过程中仍然存在以下几个问题
- 生产环境tomcat 在liunx系统中shutdown后进程仍然存在解决办法
- 帆软制作报表,让标题行在翻页时仍然存在
- 生产环境tomcat 在liunx系统中shutdown后进程仍然存在解决办法
- 生产环境tomcat 在liunx系统中shutdown后进程仍然存在解决办法
- 需求:查询某个字段在数据库中是否存在记录,如果存在,则更新这条记录;如果不存在,则增加这条记录
- 在SQLServer里面判断各种存在的条件
- oracle数据库之删除数据文件[物理地删除一个数据文件但它的信息仍然记录在数据字典v$datafile中]
- mysql在插入记录前先检查记录是否存在:
- 判断名称在数据库中是否存在
- 在Ubuntu桌面上显示回收站
- 在linux下建立回收站
- oracle在cmd里面备份oracle数据库
- 在fedora里面安装BerkeleyDB数据库
- 查看表空间使用情况
- Ubuntu VPN PPTP 配置
- Linux系统中/dev/mtd与/dev/mtdblock的区别
- xml 语法总结
- android四大组件之Activity
- vTiger 记录在回收站清空后仍然在数据库里面存在
- fusioncharts常用错误
- 在0~N(不包括N)范围内随机生成一个长度为M(M <= N)且内容不重复的数组
- C/C++中动态链接库的创建和调用
- Android四大组件之service
- Spring+Struts2+Hibernate搭建教程全解!
- Web Server Security Best Practices
- iOS 动画总结----UIView动画
- Android四大组件之Broadcast Receiver