本帖最后由 buptdream 于 2013-8-28 13:33 编辑
在生产环境中需要严格控制研发人员的DDL权限,这种情况下,需要限制用户对数据库进行DDL,DML某些操作。如果单纯的进行限制,可以通过触发器来进行控制,语句如下: CREATEORREPLACETRIGGERDDL_RESTRICT BEFOREDROPORCREATEORTRUNCATEORALTERONDATABASE DECLARE BEGIN IFORA_SYSEVENT()IN('DROP','CREATE','ALTER','TRUNCATE') ANDORA_DICT_OBJ_OWNER()IN('BUPTDREAM'AND ORA_DICT_OBJ_TYPEIN('TABLE') AND ORA_DICT_OBJ_NAME()NOTLIKE'%a%'AND ORA_DICT_OBJ_NAME()NOTLIKE'%b%'AND ORA_DICT_OBJ_NAME()NOTLIKE'%c%'THEN RAISE_APPLICATION_ERROR(NUM => -20000, MSG =>'禁止'|| ORA_SYSEVENT() ||' '|| ORA_DICT_OBJ_OWNER() ||'用户下的'|| ORA_DICT_OBJ_NAME() ||'表,请与DBA联系'); ENDIF; END; 通过触发器可以实现控制开发人员对生产库的DDL操作,如果想要禁止delete的DML操作,也可以用触发器来实现。 在Oracle中对用户的管理是使用权限的方式来管理的,也就是说,如果直接将生产库的权限给某个用户,但是我们必须要已授权的表的名称前键入该表所有者的名称,所以这比较麻烦。 Oracle数据库中同义词是数据库方案对象的一个别名,经常用于简化对象访问和提高对象访问的安全性。在使用同义词时,Oracle数据库将它翻译成对应方案对象的名字。与视图类似,同义词并不占用实际存储空间,只有在数据字典中保存了同义词的定义。在Oracle数据库中的大部分数据库对象,如表、视图、同义词、序列、存储过程、包等等,数据库管理员都可以根据实际情况为他们定义同义词。 批量建立同义词的语句如下: select' create public synonym '|| OBJECT_NAME || ' for CMAPP_PRODUCTION.'|| OBJECT_NAME ||';' fromuser_objects whereobject_typein ('TABLE','VIEW','PROCEDURE','TRIGGER','FUNCTION','PACKAGE'); 同义词赋权的语句如下:
SELECT'grant select,insert,update,delete on '|| OBJECT_NAME ||' to buptdream;' FROMUSER_OBJECTS WHEREOBJECT_TYPE ='TABLE'; SELECT'grant select,insert,update,delete on '|| OBJECT_NAME || ' to buptdream;' FROMUSER_OBJECTS WHEREOBJECT_TYPE ='VIEW';
SELECT'grant EXECUTE on '|| OBJECT_NAME ||' to buptdream;' FROMUSER_OBJECTS WHEREOBJECT_TYPE ='PROCEDURE';
SELECT'grant EXECUTE on '|| OBJECT_NAME ||' to buptdream;' FROMUSER_OBJECTS WHEREOBJECT_TYPE ='FUNCTION';
SELECT'grant select on '|| OBJECT_NAME ||' to buptdream;' FROMUSER_OBJECTS WHEREOBJECT_TYPE ='SEQUENCE'; 通过上述方法,我们可以控制研发人员对生产库的操作,在这个过程中,我们可以采用审计方式记录下每个操作,一旦权限被控制,很多数据库的风险被大大降低。 在数据库开发过程中,如果研发人员很多,进行相关的权限管理是非常重要的事情,可以大大减少数据库误操作的安全问题,触发器是一个方法,另外通过同义词,可以为每个用户单独建立用户,提高研发人员操作数据库时的专心程度,防止误操作的发生。
|