mysql防住表被删除_防止mysql表被清空的方法详解

为阻止用户删除或清空表以及数据,可以直接从权限下手,给他少量的权限即可。

比如,防止用户进行truncate 操作, 可以给如下权限:

复制代码 代码示例:

t_girl=# create role ytt3 with login connection limit 1 password 'ytt3';

create role

t_girl=# alter schema ytt owner to ytt3;

alter schema

t_girl=# grant select on all tables in schema ytt to ytt3;

grant

现在用新用户ytt3登陆并且执行truncate,发现被禁止。

复制代码 代码示例:

bash-4.1$ psql -u ytt3 t_girl

psql (9.3.4)

type "help" for help.

t_girl=> truncate table j2;

error: permission denied for relation j2

当测试时,一般来说,管理员为了方便懒得去分配各种各样细的权限。

那么,在创建表时,就得给这张表来做对应的限制。

当然了,生产环境不建议这么做。

创建一个基于语句的触发器就可以:

复制代码 代码示例:

t_girl=# \sf prevent_truncate

create or replace function public.prevent_truncate()

returns trigger

language plpgsql

as $functio$

begin

raise exception 'prevent "%" to be truncated!', tg_table_schema||tg_table_name;

return new;

end;

$function$

t_girl=# \d j2

table "ytt.j2"

column | type | modifiers

--------+---------+-----------

id | integer |

str2 | text |

triggers:

trigger_truncate_before before truncate on j2 for each statement execute procedure ytt.prevent_truncate()

t_girl=#

t_girl=# truncate table j2;

error: prevent "ytt.j2" to be truncated!

这种方法也只是对于提供了这项功能的数据库才ok。 比如mysql的触发器只提供了基于行的操作,那么语句的操作就不能触发了。

所以,如果在mysql上来实现这点,就比较麻烦。

要么,就从权限入手,

复制代码 代码示例:

mysql> truncate table j2;

error 1142 (42000): drop command denied to user 'ytt3'@'localhost' for table 'j2'

要么,就对数据库的操作用sproc封装起来,

复制代码 代码示例:

+------------------------------------+

| error |

+------------------------------------+

| prevent t_girl.j2 to be truncated! |

+------------------------------------+

1 row in set (0.00 sec)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值