前言

在对数据库进行操作时,尤其是管理权限(一般是sa账户)操作数据,在操作过程中可能会有于没有注意条件而造成全表操作,如:

1、删除

delete from tablename 

2、更新

update tablename set columnname = value

以上的sql语句没有where子句,会造成全表数据删除和更新;这样的结果通常是灾难性的,只能通过备份来恢复数据(日志貌似也能做恢复,但是需要做全日志备份),从备份来还原数据是需要非常长的时间的,企业的备份通常也不是时时备份的,所以即便是通过备份来恢复数据也还是有数据时间差的,如果此时删除的数据是核心数据或者是热点数据可能造成生产库需要停止服务。

如何防止呢?

1、收回授权,降低用户的权限,这种方式不能根治,因为管理员也有可能造成全表更新和删除;

2、备份,这个太耗时了,并且有数据时间差,数据时时备份可以解决数据时间差的问题,比如:双机热备;

3、禁止做全表的数据删除和更新;

目前,能想到的就这些,或者还有其他的方式,欢迎大家指点拍砖。

触发器禁止全表数据删除和更新

1、禁止全表删除触发器

ALTER TRIGGER 触发器名称
ON 表名
for DELETE
AS 
BEGIN
declare @rows int
select @rows=count(*) from 表名
if(@rows = 0)
begin
rollback transaction
end
END

2、禁止全表更新触发器

ALTER TRIGGER 触发器名称
ON 表名
for update
AS 
BEGIN
declare @rows0 int
declare @rows1 int
select @rows0 =count(*) from 表名
select @rows1 = count(*) from deleted
if(@rows0 = @rows1)
begin
rollback transaction
end
END

设置这两个触发器之后,没有where子句的sql语句就不会被执行了。

后话

这样每个针对这个表的删除和更新的sql语句在执行的时都会触发这两个触发器,由此带来的数据库服务器的性能问题是否能够接受也是需要权衡的。

posted on 2013-12-11 10:15  tatuzero  阅读(1555)  评论(0)    收藏  举报