蒙在股里 发表于 2015-1-16 22:51:55

MYSQL网页设计怎样利用触发器完成数据库级保卫,避免D...

用户时常会发现其实自己并不是第一个选用MySQL数据库的先驱者。”触发器|数据|数据库

怎样利用触发器完成数据库级保卫,避免DDL操纵

--关于主要工具,实行DDL回绝,避免create,drop,truncate,alter等主要操纵

LastUpdated:Sunday,2004-10-3112:06Eygle




不论是成心仍是偶然的,你大概会碰到数据库中主要的数据表等工具被drop失落的情形,这大概会给我们带来伟大的丧失.

经由过程触发器,我们能够完成关于表等工具的数据库级保卫,克制用户drop操纵.

以下是一个复杂的典范,供参考:

REMthisscriptcanbeusedtomonitoraobjectREMdenyanydropoperationonit.CREATEORREPLACETRIGGERtrg_dropdenyBEFOREDROPONDATABASEBEGINIFLOWER(ora_dict_obj_name())=testTHENraise_application_error(num=>-20000,msg=>你疯了,想删除表||ora_dict_obj_name()||?!!!!!||你完了,差人已在途中.....);ENDIF;END;/

测试效果:



SQL>connectscott/tigerConnected.SQL>createtabletestasselect*fromdba_users;Tablecreated.SQL>connect/assysdbaConnected.SQL>createorreplacetriggertrg_dropdeny2beforedropondatabase3begin4iflower(ora_dict_obj_name())=test5then6raise_application_error(7num=>-20000,8msg=>你疯了,想删除表||ora_dict_obj_name()||?!!!!!||你完了,差人已在途中.....);9endif;10end;11/Triggercreated.SQL>connectscott/tigerConnected.SQL>droptabletest;droptabletest*ERRORatline1:ORA-00604:erroroccurredatrecursiveSQLlevel1ORA-20000:你疯了,想删除表TEST?!!!!!你完了,差人已在途中.....ORA-06512:atline4



Oracle从Oracle8i入手下手,同意实行DDL事务trigger,但是完成关于DDL的监督及把持,以下是一个进一步的例子:

createorreplacetriggerddl_denybeforecreateoralterordroportruncateondatabasedeclarel_errmsgvarchar2(100):=Youhavenopermissiontothisoperation;beginifora_sysevent=CREATEthenraise_application_error(-20001,ora_dict_obj_owner||.||ora_dict_obj_name||||l_errmsg);elsifora_sysevent=ALTERthenraise_application_error(-20001,ora_dict_obj_owner||.||ora_dict_obj_name||||l_errmsg);elsifora_sysevent=DROPthenraise_application_error(-20001,ora_dict_obj_owner||.||ora_dict_obj_name||||l_errmsg);elsifora_sysevent=TRUNCATEthenraise_application_error(-20001,ora_dict_obj_owner||.||ora_dict_obj_name||||l_errmsg);endif;exceptionwhenno_data_foundthennull;end;/



我们看一下效果:

$sqlplus"/assysdba"

SQL*Plus:Release9.2.0.4.0-ProductiononSunOct3111:38:252004

Copyright(c)1982,2002,OracleCorporation.Allrightsreserved.


Connectedto:
Oracle9iEnterpriseEditionRelease9.2.0.4.0-Production
WiththePartitioningoption
JServerRelease9.2.0.4.0-Production

SQL>setechoon
SQL>@ddlt
SQL>createorreplacetriggerddl_deny
2beforecreateoralterordroportruncateondatabase
3declare
4l_errmsgvarchar2(100):=Youhavenopermissiontothisoperation;
5begin
6ifora_sysevent=CREATEthen
7raise_application_error(-20001,ora_dict_obj_owner||.||ora_dict_obj_name||||l_errmsg);
8elsifora_sysevent=ALTERthen
9raise_application_error(-20001,ora_dict_obj_owner||.||ora_dict_obj_name||||l_errmsg);
10elsifora_sysevent=DROPthen
11raise_application_error(-20001,ora_dict_obj_owner||.||ora_dict_obj_name||||l_errmsg);
12elsifora_sysevent=TRUNCATEthen
13raise_application_error(-20001,ora_dict_obj_owner||.||ora_dict_obj_name||||l_errmsg);
14endif;
15
16exception
17whenno_data_foundthen
18null;
19end;
20/

Triggercreated.

SQL>
SQL>
SQL>connectscott/tiger
Connected.
SQL>createtabletasselect*fromtest;
createtabletasselect*fromtest
*
ERRORatline1:
ORA-00604:erroroccurredatrecursiveSQLlevel1
ORA-20001:SCOTT.TYouhavenopermissiontothisoperation
ORA-06512:atline5


SQL>altertabletestadd(idnumber);
altertabletestadd(idnumber)
*
ERRORatline1:
ORA-00604:erroroccurredatrecursiveSQLlevel1
ORA-20001:SCOTT.TESTYouhavenopermissiontothisoperation
ORA-06512:atline7


SQL>droptabletest;
droptabletest
*
ERRORatline1:
ORA-00604:erroroccurredatrecursiveSQLlevel1
ORA-20001:SCOTT.TESTYouhavenopermissiontothisoperation
ORA-06512:atline9


SQL>truncatetabletest;
truncatetabletest
*
ERRORatline1:
ORA-00604:erroroccurredatrecursiveSQLlevel1
ORA-20001:SCOTT.TESTYouhavenopermissiontothisoperation
ORA-06512:atline11





我们能够看到,ddl语句都被克制了,假如你不是克制,能够选择把实行这些操纵的用户实时间纪录到别的的一时表中.以备查询.







本文作者:
eygle,Oracle手艺存眷者,来自中国最年夜的Oracle手艺论坛itpub.
www.eygle.com是作者的团体站点.你可经由过程Guoqiang.Gai@gmail.com来接洽作者.接待手艺切磋交换和链接互换.

原文出处:

http://www.eygle.com/faq/Use.Trigger.To.implement.ddl.deny.htm



如欲转载,请说明作者与出处.并请保存本文的毗连.


回想页


首先我们要知道,或许有一项技术存在很多理由让我们可以选择使用MySQL学习教程,但是让我们不使用它往往只要有一个理由就足够了。

谁可相欹 发表于 2015-1-17 16:37:21

习惯敲命令行的朋友可能会爽一些。但是功能有限。适合机器跑不动SQLServerManagementStudio的朋友使用。

变相怪杰 发表于 2015-1-20 20:45:51

一个百万级别的基本信息表A,一个百万级别的详细记录表B,A中有个身份证id,B中也有身份id;先要找出A中在B的详细记录。

活着的死人 发表于 2015-1-29 22:46:15

连做梦都在想页面结构是怎么样的,绝非虚言

若天明 发表于 2015-2-6 05:53:47

对递归类的树遍历很有帮助。个人感觉这个真是太棒了!阅读清晰,非常有时代感。

灵魂腐蚀 发表于 2015-2-15 14:12:37

是要和操作系统进行Socket通讯的场景。否则建议慎重!

仓酷云 发表于 2015-3-4 11:35:37

我是新手,正在学习数据库和操作系统,深感理论的泛广,唯有一步一步来,但是又感觉时间不够,收集了很多资料却总是没能认真的看完,希望有一个讨论板块,大家共同解决,共同分享,共同努力

老尸 发表于 2015-3-11 19:18:51

多加的系统视图和实时系统信息这些东西对DBA挑优非常有帮助,但是感觉粒度还是不太细。

海妖 发表于 2015-3-19 09:25:17

大家注意一点。如下面的例子:

若相依 发表于 2015-3-27 17:10:52

大侠们有推荐的书籍和学习方法写下吧。
页: [1]
查看完整版本: MYSQL网页设计怎样利用触发器完成数据库级保卫,避免D...