ITPub博客

首页 > 数据库 > Oracle > Oracle10g实现只读表的N种方法

Oracle10g实现只读表的N种方法

Oracle 作者:rtt8387 时间:2015-11-19 09:51:21 0 删除 编辑
<p> &nbsp; &nbsp;&nbsp;有时为了提高数据的安全性,我们需要把一个或多个表设置为只读,即不允许对其执行任何<span> DML(Insert, Update, Delete) </span>操作。 </p> <p> &nbsp; &nbsp;&nbsp;在<span>Oracle11g</span>中实现只读表非常简单,只需要执行<span>alter table ... read only;</span>语句即可;但是在<span>11g</span>之前的版本,“只读”只对数据库和表空间有效,如果我们要实现一个只读表,只能通过其他办法。 </p> <p> &nbsp; &nbsp;&nbsp;下面就介绍在<span>Oracle10g</span>中实现只读表的几种常用方法。首先,我们先创建测试表<span>hoegh</span>。 </p> <h2> 测试环境 </h2> <p> &nbsp; &nbsp;&nbsp;我们在<span>Oracle 10g+Windows Server 2008 Standard R2</span>进行测试。 </p> <div> <div class="codeheads"> <p> 点击(<span style="cursor:pointer;color:red;" onclick="code_hide('code634')">此处</span>)折叠或打开 </p> </div> <div id="code634" class="codeText"> <ol style="margin:0 1px 0 0;padding:5px 0pt;" start="1" class="dp-css none_number"> <li> <span style="color:#000000;">SQL<span style="color:#0000CC;">&gt;</span><br /> </span> </li> <li> SQL<span style="color:#0000CC;">&gt;</span> <span style="color:#0000FF;">select</span> <span style="color:#0000CC;">*</span> <span style="color:#0000FF;">from</span> v$version<span style="color:#0000CC;">;</span><br /> </li> <li> &nbsp;<br /> </li> <li> BANNER<br /> </li> <li> <span style="color:#FF9900;">----------------------------------------------------------------</span><br /> </li> <li> Oracle <span style="color:#0000FF;">Database</span> 10g Enterprise Edition <span style="color:#FF0000;">Release</span> 10<span style="color:#0000CC;">.</span>2<span style="color:#0000CC;">.</span>0<span style="color:#0000CC;">.</span>4<span style="color:#0000CC;">.</span>0 <span style="color:#0000CC;">-</span> 64bi<br /> </li> <li> PL<span style="color:#0000CC;">/</span>SQL <span style="color:#FF0000;">Release</span> 10<span style="color:#0000CC;">.</span>2<span style="color:#0000CC;">.</span>0<span style="color:#0000CC;">.</span>4<span style="color:#0000CC;">.</span>0 <span style="color:#0000CC;">-</span> Production<br /> </li> <li> CORE 10<span style="color:#0000CC;">.</span>2<span style="color:#0000CC;">.</span>0<span style="color:#0000CC;">.</span>4<span style="color:#0000CC;">.</span>0 Production<br /> </li> <li> TNS <span style="color:#0000FF;">for</span> 64<span style="color:#0000CC;">-</span>bit Windows<span style="color:#0000CC;">:</span> Version 10<span style="color:#0000CC;">.</span>2<span style="color:#0000CC;">.</span>0<span style="color:#0000CC;">.</span>4<span style="color:#0000CC;">.</span>0 <span style="color:#0000CC;">-</span> Production<br /> </li> <li> NLSRTL Version 10<span style="color:#0000CC;">.</span>2<span style="color:#0000CC;">.</span>0<span style="color:#0000CC;">.</span>4<span style="color:#0000CC;">.</span>0 <span style="color:#0000CC;">-</span> Production<br /> </li> <li> &nbsp;<br /> </li> <li> SQL<span style="color:#0000CC;">&gt;</span> </li> </ol> </div> </div> <p> <br /> </p> <p> <span></span> </p> <h2> 创建测试用户及测试表 </h2> <p> &nbsp; &nbsp;&nbsp;我们创建一个测试用户<span>hoegh</span>,指定默认表空间为<span>users</span>;然后,在<span>hoegh</span>用户下创建测试表,同样命名为<span>hoegh</span>。 </p> <div> <div class="codeheads"> <p> 点击(<span style="cursor:pointer;color:red;" onclick="code_hide('code65')">此处</span>)折叠或打开 </p> </div> <div id="code65" class="codeText"> <ol style="margin:0 1px 0 0;padding:5px 0pt;" start="1" class="dp-css none_number"> <li> <span style="color:#000000;">SQL<span style="color:#0000CC;">&gt;</span><br /> </span> </li> <li> SQL<span style="color:#0000CC;">&gt;</span> <span style="color:#0000FF;">create</span> <span style="color:#0000FF;">user</span> hoegh <span style="color:#0000FF;">identified</span> <span style="color:#0000FF;">by</span> hoegh<br /> </li> <li> &nbsp;&nbsp;2 <span style="color:#0000FF;background-color:#FFE500;">default</span> <span style="color:#0000FF;background-color:#FFE500;">tablespace</span><span style="background-color:#FFE500;"> users</span><span style="color:#0000CC;background-color:#FFE500;">;</span><br /> </li> <li> &nbsp;<br /> </li> <li> 用户已创建。<br /> </li> <li> &nbsp;<br /> </li> <li> SQL<span style="color:#0000CC;">&gt;</span><br /> </li> <li> SQL<span style="color:#0000CC;">&gt;</span> <span style="color:#0000FF;">grant</span> <span style="color:#0000FF;">connect</span><span style="color:#0000CC;">,</span><span style="color:#0000FF;">resource</span> <span style="color:#0000FF;">to</span> hoegh<span style="color:#0000CC;">;</span><br /> </li> <li> &nbsp;<br /> </li> <li> 授权成功。<br /> </li> <li> &nbsp;<br /> </li> <li> SQL<span style="color:#0000CC;">&gt;</span><br /> </li> <li> SQL<span style="color:#0000CC;">&gt;</span> conn hoegh<span style="color:#0000CC;">/</span>hoegh<br /> </li> <li> 已连接。<br /> </li> <li> SQL<span style="color:#0000CC;">&gt;</span><br /> </li> <li> SQL<span style="color:#0000CC;">&gt;</span> <span style="color:#0000FF;">create</span> <span style="color:#0000FF;">table</span> hoegh<span style="color:#0000CC;">(</span>id <span style="color:#0000FF;">number</span><span style="color:#0000CC;">,</span>name <span style="color:#0000FF;">varchar2</span><span style="color:#0000CC;">(</span>20<span style="color:#0000CC;">)</span><span style="color:#0000CC;">)</span><span style="color:#0000CC;">;</span><br /> </li> <li> &nbsp;<br /> </li> <li> 表已创建。<br /> </li> <li> &nbsp;<br /> </li> <li> SQL<span style="color:#0000CC;">&gt;</span> <span style="color:#0000FF;">insert</span> <span style="color:#0000FF;">into</span> hoegh <span style="color:#0000FF;">values</span><span style="color:#0000CC;">(</span>1<span style="color:#0000CC;">,</span><span style="color:#FF00FF;">'hoegh'</span><span style="color:#0000CC;">)</span><span style="color:#0000CC;">;</span><br /> </li> <li> &nbsp;<br /> </li> <li> 已创建 1 行。<br /> </li> <li> &nbsp;<br /> </li> <li> SQL<span style="color:#0000CC;">&gt;</span> <span style="color:#0000FF;">insert</span> <span style="color:#0000FF;">into</span> hoegh <span style="color:#0000FF;">values</span><span style="color:#0000CC;">(</span>10<span style="color:#0000CC;">,</span><span style="color:#FF00FF;">'hoegh'</span><span style="color:#0000CC;">)</span><span style="color:#0000CC;">;</span><br /> </li> <li> &nbsp;<br /> </li> <li> 已创建 1 行。<br /> </li> <li> &nbsp;<br /> </li> <li> SQL<span style="color:#0000CC;">&gt;</span> commit<span style="color:#0000CC;">;</span><br /> </li> <li> &nbsp;<br /> </li> <li> 提交完成。<br /> </li> <li> &nbsp;<br /> </li> <li> SQL<span style="color:#0000CC;">&gt;</span> <span style="color:#0000FF;">select</span> <span style="color:#0000CC;">*</span> <span style="color:#0000FF;">from</span> hoegh<span style="color:#0000CC;">;</span><br /> </li> <li> &nbsp;<br /> </li> <li> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ID NAME<br /> </li> <li> <span style="color:#FF9900;">---------- --------------------</span><br /> </li> <li> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1 hoegh<br /> </li> <li> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;10 hoegh<br /> </li> <li> &nbsp;<br /> </li> <li> SQL<span style="color:#0000CC;">&gt;</span> </li> </ol> </div> </div> <p> <br /> </p> <p> <span></span> </p> <h2 style="margin-left:0cm;text-indent:0cm;"> 方法一:授予<span>Select</span>权限 </h2> <p> &nbsp; &nbsp;&nbsp;该方法仅针对非属主用户。以<span>hoegh</span>表为例,它的属主用户是<span>hoegh</span>,我们可以把<span>hoegh</span>表的<span>select</span>权限赋予其他用户,这样其他用户对<span>hoegh</span>表就是只读的。 </p> <div> <div class="codeheads"> <p> 点击(<span style="cursor:pointer;color:red;" onclick="code_hide('code419')">此处</span>)折叠或打开 </p> </div> <div id="code419" class="codeText"> <ol style="margin:0 1px 0 0;padding:5px 0pt;" start="1" class="dp-css none_number"> <li> <span style="color:#000000;">SQL<span style="color:#0000CC;">&gt;</span><br /> </span> </li> <li> SQL<span style="color:#0000CC;">&gt;</span> <span style="color:#0000FF;background-color:#FFE500;">grant</span> <span style="color:#0000FF;background-color:#FFE500;">select</span> <span style="color:#0000FF;background-color:#FFE500;">on</span><span style="background-color:#FFE500;"> hoegh </span><span style="color:#0000FF;background-color:#FFE500;">to</span><span style="background-color:#FFE500;"> scott</span><span style="color:#0000CC;background-color:#FFE500;">;</span><br /> </li> <li> &nbsp;<br /> </li> <li> 授权成功。<br /> </li> <li> &nbsp;<br /> </li> <li> SQL<span style="color:#0000CC;">&gt;</span> conn scott<span style="color:#0000CC;">/</span>tiger<br /> </li> <li> 已连接。<br /> </li> <li> SQL<span style="color:#0000CC;">&gt;</span> <span style="color:#0000FF;">select</span> <span style="color:#0000CC;">*</span> <span style="color:#0000FF;">from</span> hoegh<span style="color:#0000CC;">.</span>hoegh<span style="color:#0000CC;">;</span><br /> </li> <li> &nbsp;<br /> </li> <li> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ID NAME<br /> </li> <li> <span style="color:#FF9900;">---------- --------------------</span><br /> </li> <li> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1 hoegh<br /> </li> <li> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;10 hoegh<br /> </li> <li> &nbsp;<br /> </li> <li> SQL<span style="color:#0000CC;">&gt;</span> </li> </ol> </div> </div> <p> <br /> </p> <h3> <span>ORA-01031</span>报错 </h3> <p> <span style="white-space:normal;">&nbsp; &nbsp;&nbsp;<span style="white-space:normal;">此时,</span>如果我们对</span><span style="white-space:normal;">hoegh.hoegh</span><span style="white-space:normal;">表进行</span><span style="white-space:normal;">DML</span><span style="white-space:normal;">操作,系统就会报</span><span style="white-space:normal;">ORA-01031</span><span style="white-space:normal;">错误,提示权限不足。</span> </p> <div> <div class="codeheads"> <p> 点击(<span style="cursor:pointer;color:red;" onclick="code_hide('code207')">此处</span>)折叠或打开 </p> </div> <div id="code207" class="codeText"> <ol style="margin:0 1px 0 0;padding:5px 0pt;" start="1" class="dp-css none_number"> <li> <span style="color:#000000;">SQL<span style="color:#0000CC;">&gt;</span> <span style="color:#0000FF;">insert</span> <span style="color:#0000FF;">into</span> hoegh<span style="color:#0000CC;">.</span>hoegh <span style="color:#0000FF;">values</span><span style="color:#0000CC;">(</span>100<span style="color:#0000CC;">,</span><span style="color:#FF00FF;">'hoegh'</span><span style="color:#0000CC;">)</span><span style="color:#0000CC;">;</span><br /> </span> </li> <li> <span style="color:#0000FF;">insert</span> <span style="color:#0000FF;">into</span> hoegh<span style="color:#0000CC;">.</span>hoegh <span style="color:#0000FF;">values</span><span style="color:#0000CC;">(</span>100<span style="color:#0000CC;">,</span><span style="color:#FF00FF;">'hoegh'</span><span style="color:#0000CC;">)</span><br /> </li> <li> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000CC;">*</span><br /> </li> <li> 第 1 行出现错误<span style="color:#0000CC;">:</span><br /> </li> <li> ORA<span style="color:#0000CC;">-</span>01031<span style="color:#0000CC;">:</span> 权限不足<br /> </li> <li> &nbsp;<br /> </li> <li> &nbsp;<br /> </li> <li> SQL<span style="color:#0000CC;">&gt;</span> </li> </ol> </div> </div> <p> <br /> </p> <p> <span></span> </p> <h2> 方法二: 触发器 </h2> <p> &nbsp; &nbsp;&nbsp;我们可以在<span>hoegh</span>表上创建一个触发器,当对<span>hoegh</span>表执行<span>DML</span>操作时报错。如下所示。 </p> <h3> 创建触发器 </h3> <p> <br /> </p> <div> <div class="codeheads"> <p> 点击(<span style="cursor:pointer;color:red;" onclick="code_hide('code471')">此处</span>)折叠或打开 </p> </div> <div id="code471" class="codeText"> <ol style="margin:0 1px 0 0;padding:5px 0pt;" start="1" class="dp-css none_number"> <li> <span style="color:#000000;">SQL<span style="color:#0000CC;">&gt;</span> conn hoegh<span style="color:#0000CC;">/</span>hoegh<br /> </span> </li> <li> 已连接。<br /> </li> <li> SQL<span style="color:#0000CC;">&gt;</span><br /> </li> <li> SQL<span style="color:#0000CC;">&gt;</span> <span style="color:#0000FF;">CREATE</span> <span style="color:#0000FF;">OR</span> <span style="color:#0000FF;">REPLACE</span> <span style="color:#0000FF;">TRIGGER</span> HOEGH_TRG<br /> </li> <li> &nbsp;&nbsp;2 <span style="background-color:#FFE500;">BEFORE </span><span style="color:#0000FF;background-color:#FFE500;">DELETE</span> <span style="color:#0000FF;background-color:#FFE500;">OR</span> <span style="color:#0000FF;background-color:#FFE500;">INSERT</span> <span style="color:#0000FF;background-color:#FFE500;">OR</span> <span style="color:#0000FF;background-color:#FFE500;">UPDATE</span><br /> </li> <li> &nbsp;&nbsp;3 <span style="color:#0000FF;">ON</span> HOEGH<br /> </li> <li> &nbsp;&nbsp;4 REFERENCING NEW <span style="color:#0000FF;">AS</span> NEW OLD <span style="color:#0000FF;">AS</span> OLD<br /> </li> <li> &nbsp;&nbsp;5 <span style="color:#0000FF;">FOR</span> EACH <span style="color:#0000FF;">ROW</span><br /> </li> <li> &nbsp;&nbsp;6 DECLARE<br /> </li> <li> &nbsp;&nbsp;7 <span style="color:#0000FF;">BEGIN</span><br /> </li> <li> &nbsp;&nbsp;8 <span style="background-color:#FFE500;">RAISE_APPLICATION_ERROR </span><span style="color:#0000CC;background-color:#FFE500;">(</span><span style="color:#0000CC;background-color:#FFE500;">-</span><span style="background-color:#FFE500;">20001</span><span style="color:#0000CC;background-color:#FFE500;">,</span> <span style="color:#FF00FF;background-color:#FFE500;">'Table is read only table.'</span><span style="color:#0000CC;background-color:#FFE500;">)</span><span style="color:#0000CC;background-color:#FFE500;">;</span><br /> </li> <li> &nbsp;&nbsp;9 <span style="color:#0000FF;">END</span><span style="color:#0000CC;">;</span><br /> </li> <li> &nbsp;10 <span style="color:#0000CC;">/</span><br /> </li> <li> &nbsp;<br /> </li> <li> 触发器已创建 </li> </ol> </div> </div> <p> <br /> </p> <p> <span>&nbsp;</span> </p> <h3 style="margin-left:0cm;text-indent:0cm;"> <span>ORA-20001</span>报错 </h3> <div> <span style="white-space:normal;">&nbsp; &nbsp;&nbsp;<span style="white-space:normal;">此时,</span>如果我们对</span><span style="white-space:normal;">hoegh</span><span style="white-space:normal;">表进行</span><span style="white-space:normal;">DML</span><span style="white-space:normal;">操作,系统就会报</span><span style="white-space:normal;">ORA-20001</span><span style="white-space:normal;">错误,提示“<span style="white-space:normal;">Table is read only table</span>”。</span> </div> <p> <br /> </p> <div> <div class="codeheads"> <p> 点击(<span style="cursor:pointer;color:red;" onclick="code_hide('code235')">此处</span>)折叠或打开 </p> </div> <div id="code235" class="codeText"> <ol style="margin:0 1px 0 0;padding:5px 0pt;" start="1" class="dp-css none_number"> <li> <span style="color:#000000;">SQL<span style="color:#0000CC;">&gt;</span><br /> </span> </li> <li> SQL<span style="color:#0000CC;">&gt;</span> <span style="color:#0000FF;">insert</span> <span style="color:#0000FF;">into</span> hoegh <span style="color:#0000FF;">values</span><span style="color:#0000CC;">(</span>100<span style="color:#0000CC;">,</span><span style="color:#FF00FF;">'hoegh'</span><span style="color:#0000CC;">)</span><span style="color:#0000CC;">;</span><br /> </li> <li> <span style="color:#0000FF;">insert</span> <span style="color:#0000FF;">into</span> hoegh <span style="color:#0000FF;">values</span><span style="color:#0000CC;">(</span>100<span style="color:#0000CC;">,</span><span style="color:#FF00FF;">'hoegh'</span><span style="color:#0000CC;">)</span><br /> </li> <li> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000CC;">*</span><br /> </li> <li> 第 1 行出现错误<span style="color:#0000CC;">:</span><br /> </li> <li> ORA<span style="color:#0000CC;">-</span>20001<span style="color:#0000CC;">:</span> <span style="color:#0000FF;">Table</span> <span style="color:#0000FF;">is</span> read <span style="color:#FF0000;">only</span> <span style="color:#0000FF;">table</span><span style="color:#0000CC;">.</span><br /> </li> <li> ORA<span style="color:#0000CC;">-</span>06512<span style="color:#0000CC;">:</span> 在 <span style="color:#FF00FF;">"HOEGH.HOEGH_TRG"</span><span style="color:#0000CC;">,</span> line 3<br /> </li> <li> ORA<span style="color:#0000CC;">-</span>04088<span style="color:#0000CC;">:</span> 触发器 <span style="color:#FF00FF;">'HOEGH.HOEGH_TRG'</span> 执行过程中出错<br /> </li> <li> &nbsp;<br /> </li> <li> &nbsp;<br /> </li> <li> SQL<span style="color:#0000CC;">&gt;</span> </li> </ol> </div> </div> <p> <br /> </p> <h2> 方法三:检查约束 </h2> <p> &nbsp; &nbsp;&nbsp;我们知道对<span>constraint</span>的开启和关闭共有四种: </p> <p style="margin-left:42.0pt;text-indent:-21.0pt;"> l&nbsp; <span>enable( validate) :</span>启用约束<span>,</span>创建索引<span>,</span>对已有及新加入的数据执行约束。<span></span> </p> <p style="margin-left:42.0pt;text-indent:-21.0pt;"> l&nbsp; <span>enable novalidate :</span>启用约束<span>,</span>创建索引<span>,</span>仅对新加入的数据强制执行约束<span>,</span>而不管表中的现有数据。<span></span> </p> <p style="margin-left:42.0pt;text-indent:-21.0pt;"> l&nbsp; <span>disable( novalidate):</span>关闭约束<span>,</span>删除索引<span>,</span>可以对约束列的数据进行修改等操作。<span></span> </p> <p style="margin-left:42.0pt;text-indent:-21.0pt;"> l&nbsp; <span>disable validate :</span>关闭约束<span>,</span>删除索引<span>,</span>不能对表进行 插入<span>/</span>更新<span>/</span>删除等操作。<span></span> </p> <p> &nbsp; &nbsp;&nbsp;因此,我们可以利用<span>disable validate</span>来实现只读表。 </p> <p> &nbsp; &nbsp;&nbsp;如下所示: </p> <div> <div class="codeheads"> <p> 点击(<span style="cursor:pointer;color:red;" onclick="code_hide('code125')">此处</span>)折叠或打开 </p> </div> <div id="code125" class="codeText"> <ol style="margin:0 1px 0 0;padding:5px 0pt;" start="1" class="dp-css none_number"> <li> <span style="color:#000000;"><span style="color:#0000FF;">ALTER</span> <span style="color:#0000FF;">TABLE</span> HOEGH <span style="color:#0000FF;">ADD</span> <span style="color:#0000FF;">CONSTRAINT</span> READ_ONLY_CONST <span style="color:#0000FF;">CHECK</span><span style="color:#0000CC;">(</span>0<span style="color:#0000CC;">=</span>0<span style="color:#0000CC;">)</span> DISABLE <span style="color:#0000FF;">VALIDATE</span><span style="color:#0000CC;">;</span></span> </li> </ol> </div> </div> <p> <br /> </p> <h3> <span>ORA-25128</span>报错 </h3> <div> <span style="white-space:normal;">&nbsp; &nbsp;&nbsp;此时,如果我们对</span><span style="white-space:normal;">hoegh</span><span style="white-space:normal;">表进行</span><span style="white-space:normal;">DML</span><span style="white-space:normal;">操作,系统就会报</span><span style="white-space:normal;"><span style="white-space:normal;">ORA-25128</span></span><span style="white-space:normal;">错误,提示“<span style="white-space:normal;">不能对带有禁用和验证约束条件</span><span style="white-space:normal;">&nbsp;&nbsp;</span><span style="white-space:normal;">的表进行插入</span><span style="white-space:normal;">/</span><span style="white-space:normal;">更新</span><span style="white-space:normal;">/</span><span style="white-space:normal;">删除</span>”。</span> </div> <div> <div class="codeheads"> <p> 点击(<span style="cursor:pointer;color:red;" onclick="code_hide('code809')">此处</span>)折叠或打开 </p> </div> <div id="code809" class="codeText"> <ol style="margin:0 1px 0 0;padding:5px 0pt;" start="1" class="dp-css none_number"> <li> <span style="color:#000000;">SQL<span style="color:#0000CC;">&gt;</span> <span style="color:#0000FF;">insert</span> <span style="color:#0000FF;">into</span> hoegh <span style="color:#0000FF;">values</span><span style="color:#0000CC;">(</span>100<span style="color:#0000CC;">,</span><span style="color:#FF00FF;">'hoegh'</span><span style="color:#0000CC;">)</span><span style="color:#0000CC;">;</span><br /> </span> </li> <li> <span style="color:#0000FF;">insert</span> <span style="color:#0000FF;">into</span> hoegh <span style="color:#0000FF;">values</span><span style="color:#0000CC;">(</span>100<span style="color:#0000CC;">,</span><span style="color:#FF00FF;">'hoegh'</span><span style="color:#0000CC;">)</span><br /> </li> <li> <span style="color:#0000CC;">*</span><br /> </li> <li> 第 1 行出现错误<span style="color:#0000CC;">:</span><br /> </li> <li> ORA<span style="color:#0000CC;">-</span>25128<span style="color:#0000CC;">:</span> 不能对带有禁用和验证约束条件 <span style="color:#0000CC;">(</span>HOEGH<span style="color:#0000CC;">.</span>READ_ONLY_CONST<span style="color:#0000CC;">)</span> 的表进行插入<span style="color:#0000CC;">/</span>更新<span style="color:#0000CC;">/</span>删除<br /> </li> <li> &nbsp;<br /> </li> <li> &nbsp;<br /> </li> <li> SQL<span style="color:#0000CC;">&gt;</span> </li> </ol> </div> </div> <p> <br /> </p> <h2> 方法四:只读表空间 </h2> <p> &nbsp; &nbsp;&nbsp;设置只读表空间的主要目的是为了表空间中的静态数据不被修改,从而能够进行数据库的备份和恢复等操作,还能够保护只读表空间中的数据不被修改。 </p> <ul> <li> <span style="line-height:1.5;">设置只读表空间的语法:</span><span style="line-height:1.5;">ALTER TABLESPACE &lt;</span><span style="line-height:1.5;">表空间</span><span style="line-height:1.5;">&gt; READ ONLY;</span> </li> <li> <span style="line-height:1.5;">将表空间设置为读写的语法</span><span style="line-height:1.5;">:</span><span style="line-height:1.5;">ALTER TABLESPACE &lt;</span><span style="line-height:1.5;">表空间</span><span style="line-height:1.5;">&gt; READ WRITE;</span> </li> </ul> <p> &nbsp; &nbsp;&nbsp;由上面创建测试用户的语句我们得知,<span>hoegh</span>用户的默认表空间是<span>users</span>,因此我们将<span>users</span>表空间设为只读表空间。这样,<span>hoegh</span>用户下的所有表都将会是只读表,包括<span>hoegh</span>表。<br /> &nbsp; &nbsp; 如下所示。 </p> <p> <br /> </p> <div> <div class="codeheads"> <p> 点击(<span style="cursor:pointer;color:red;" onclick="code_hide('code692')">此处</span>)折叠或打开 </p> </div> <div id="code692" class="codeText"> <ol style="margin:0 1px 0 0;padding:5px 0pt;" start="1" class="dp-css none_number"> <li> <span style="color:#000000;">SQL<span style="color:#0000CC;">&gt;</span> <span style="color:#FF0000;">show</span> <span style="color:#0000FF;">user</span><br /> </span> </li> <li> <span style="color:#0000FF;">USER</span> 为 <span style="color:#FF00FF;">"HOEGH"</span><br /> </li> <li> SQL<span style="color:#0000CC;">&gt;</span> <span style="color:#0000FF;">alter</span> <span style="color:#0000FF;">table</span> hoegh <span style="color:#0000FF;">drop</span> <span style="color:#0000FF;">constraint</span> READ_ONLY_CONST<span style="color:#0000CC;">;</span><br /> </li> <li> &nbsp;<br /> </li> <li> 表已更改。<br /> </li> <li> &nbsp;<br /> </li> <li> SQL<span style="color:#0000CC;">&gt;</span><br /> </li> <li> SQL<span style="color:#0000CC;">&gt;</span> conn sys<span style="color:#0000CC;">/hoegh</span>&nbsp;<span style="color:#0000FF;">as</span> sysdba<br /> </li> <li> 已连接。<br /> </li> <li> SQL<span style="color:#0000CC;">&gt;</span><br /> </li> <li> SQL<span style="color:#0000CC;">&gt;</span> <span style="color:#0000FF;background-color:#FFE500;">alter</span> <span style="color:#0000FF;background-color:#FFE500;">tablespace</span><span style="background-color:#FFE500;"> users read </span><span style="color:#FF0000;background-color:#FFE500;">only</span><span style="color:#0000CC;background-color:#FFE500;">;</span><br /> </li> <li> &nbsp;<br /> </li> <li> 表空间已更改。<br /> </li> <li> &nbsp;<br /> </li> <li> SQL<span style="color:#0000CC;">&gt;</span><br /> </li> <li> SQL<span style="color:#0000CC;">&gt;</span> conn hoegh<span style="color:#0000CC;">/</span>hoegh<br /> </li> <li> 已连接。<br /> </li> <li> SQL<span style="color:#0000CC;">&gt;</span> <span style="color:#0000FF;">select</span> <span style="color:#0000CC;">*</span> <span style="color:#0000FF;">from</span> hoegh<span style="color:#0000CC;">;</span><br /> </li> <li> &nbsp;<br /> </li> <li> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ID NAME<br /> </li> <li> <span style="color:#FF9900;">---------- --------------------</span><br /> </li> <li> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1 hoegh<br /> </li> <li> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;10 hoegh </li> </ol> </div> </div> <p> <br /> </p> <h3> <span>ORA-00372&amp; ORA-01110</span>报错 </h3> <div> &nbsp; &nbsp;&nbsp;<span style="white-space:normal;">此时,如果我们对</span><span style="white-space:normal;">hoegh</span><span style="white-space:normal;">表进行</span><span style="white-space:normal;">DML</span><span style="white-space:normal;">操作,系统就会报</span><span style="line-height:1.5;">ORA-00372&amp; ORA-01110</span><span style="white-space:normal;">错误,提示无法修改数据文件。</span> </div> <p> <br /> </p> <div> <div class="codeheads"> <p> 点击(<span style="cursor:pointer;color:red;" onclick="code_hide('code21')">此处</span>)折叠或打开 </p> </div> <div id="code21" class="codeText"> <ol style="margin:0 1px 0 0;padding:5px 0pt;" start="1" class="dp-css none_number"> <li> <span style="color:#000000;">SQL<span style="color:#0000CC;">&gt;</span><br /> </span> </li> <li> SQL<span style="color:#0000CC;">&gt;</span> <span style="color:#0000FF;">insert</span> <span style="color:#0000FF;">into</span> hoegh <span style="color:#0000FF;">values</span><span style="color:#0000CC;">(</span>100<span style="color:#0000CC;">,</span><span style="color:#FF00FF;">'hoegh'</span><span style="color:#0000CC;">)</span><span style="color:#0000CC;">;</span><br /> </li> <li> <span style="color:#0000FF;">insert</span> <span style="color:#0000FF;">into</span> hoegh <span style="color:#0000FF;">values</span><span style="color:#0000CC;">(</span>100<span style="color:#0000CC;">,</span><span style="color:#FF00FF;">'hoegh'</span><span style="color:#0000CC;">)</span><br /> </li> <li> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000CC;">*</span><br /> </li> <li> 第 1 行出现错误<span style="color:#0000CC;">:</span><br /> </li> <li> ORA<span style="color:#0000CC;">-</span>00372<span style="color:#0000CC;">:</span> 此时无法修改文件 4<br /> </li> <li> ORA<span style="color:#0000CC;">-</span>01110<span style="color:#0000CC;">:</span> 数据文件 4<span style="color:#0000CC;">:</span> <span style="color:#FF00FF;">'E:\ATSTEST\USERS01.DBF'</span><br /> </li> <li> &nbsp;<br /> </li> <li> &nbsp;<br /> </li> <li> SQL<span style="color:#0000CC;">&gt;</span> </li> </ol> </div> </div> <p> <br /> </p> <h3> <span style="color:#E53333;">DROP</span><span style="color:#E53333;">操作不受影响</span> </h3> <p> &nbsp; &nbsp;&nbsp;需要注意的是,只读表空间下是可以执行<span>DROP</span>操作的。 </p> <p> &nbsp; &nbsp;&nbsp;我们知道,每个数据库在运行的时候<span>,</span>都至少会有一个<span>ONLINE</span>表空间,那就是<span>SYSTEM</span>表空间,其中保存了数据字典以及<span>PLSQL</span>中的存储过程、触发器、函数、包等等数据库对象。当进行<span>DDL</span>进行数据库的删除操作的时候,<span style="background-color:#FFE500;">本质是是操作的</span><span style="background-color:#FFE500;">SYSTEM</span><span style="background-color:#FFE500;">表空间</span>,<span>ORACLE</span>会在<span>SYSTEM</span>存储的数据字典中,将删除的表设置为<span>DROP</span>状态,等该表空间的状态变成<span>READ WRITE</span>状态的时候,才会真正的从数据库里面删除该表。 </p> <h2> 方法五: 只读数据库 </h2> <p> &nbsp; &nbsp;&nbsp;当一个正常打开的数据库被设置为只读状态时,用户只能查询数据,但不能以任何方式对数据库对象进行修改。处于只读状态,可能保证数据文件和重做日志文件中的内容不被修改,但是并不限制那些不会写入数据文件与重做日志文件的操作。 </p> <p style="margin-left:42.0pt;text-indent:-21.0pt;"> l&nbsp; 设置只读命令:<span>alter database open read only;</span> </p> <p style="margin-left:42.0pt;text-indent:-21.0pt;"> l&nbsp; 取消只读命令:<span>alter database open read write;</span> </p> <p> <br /> </p> <div> <div class="codeheads"> <p> 点击(<span style="cursor:pointer;color:red;" onclick="code_hide('code104')">此处</span>)折叠或打开 </p> </div> <div id="code104" class="codeText"> <ol style="margin:0 1px 0 0;padding:5px 0pt;" start="1" class="dp-css none_number"> <li> <span style="color:#000000;">SQL<span style="color:#0000CC;">&gt;</span><br /> </span> </li> <li> SQL<span style="color:#0000CC;">&gt;</span> conn sys<span style="color:#0000CC;">/</span><span style="color:#0000CC;font-family:Consolas, monospace;letter-spacing:0.10000000149011612px;line-height:15px;white-space:normal;background-color:#FFFFFF;">hoegh</span> <span style="color:#0000FF;">as</span> sysdba<br /> </li> <li> 已连接。<br /> </li> <li> SQL<span style="color:#0000CC;">&gt;</span> <span style="color:#0000FF;">alter</span> <span style="color:#0000FF;">tablespace</span> users read write<span style="color:#0000CC;">;</span><br /> </li> <li> &nbsp;<br /> </li> <li> 表空间已更改。<br /> </li> <li> &nbsp;<br /> </li> <li> SQL<span style="color:#0000CC;">&gt;</span><br /> </li> <li> SQL<span style="color:#0000CC;">&gt;</span> shutdown <span style="color:#0000FF;">immediate</span><br /> </li> <li> 数据库已经关闭。<br /> </li> <li> 已经卸载数据库。<br /> </li> <li> ORACLE 例程已经关闭。<br /> </li> <li> SQL<span style="color:#0000CC;">&gt;</span><br /> </li> <li> SQL<span style="color:#0000CC;">&gt;</span> <span style="color:#FF0000;">startup</span> mount<br /> </li> <li> ORACLE 例程已经启动。<br /> </li> <li> &nbsp;<br /> </li> <li> Total System Global Area 1258291200 bytes<br /> </li> <li> Fixed <span style="color:#0000FF;">Size</span> 2163712 bytes<br /> </li> <li> <span style="color:#FF0000;">Variable</span> <span style="color:#0000FF;">Size</span> 360446976 bytes<br /> </li> <li> <span style="color:#0000FF;">Database</span> Buffers 889192448 bytes<br /> </li> <li> Redo Buffers 6488064 bytes<br /> </li> <li> 数据库装载完毕。<br /> </li> <li> SQL<span style="color:#0000CC;">&gt;</span><br /> </li> <li> <span style="background-color:#FFE500;">SQL</span><span style="color:#0000CC;background-color:#FFE500;">&gt;</span> <span style="color:#0000FF;background-color:#FFE500;">alter</span> <span style="color:#0000FF;background-color:#FFE500;">database</span><span style="background-color:#FFE500;"> open read </span><span style="color:#FF0000;background-color:#FFE500;">only</span><span style="color:#0000CC;background-color:#FFE500;">;</span><br /> </li> <li> &nbsp;<br /> </li> <li> 数据库已更改。<br /> </li> <li> &nbsp;<br /> </li> <li> SQL<span style="color:#0000CC;">&gt;</span><br /> </li> <li> SQL<span style="color:#0000CC;">&gt;</span> conn hoegh<span style="color:#0000CC;">/</span>hoegh<br /> </li> <li> 已连接。<br /> </li> <li> SQL<span style="color:#0000CC;">&gt;</span><br /> </li> <li> SQL<span style="color:#0000CC;">&gt;</span> <span style="color:#0000FF;">select</span> <span style="color:#0000CC;">*</span> <span style="color:#0000FF;">from</span> hoegh<span style="color:#0000CC;">;</span><br /> </li> <li> &nbsp;<br /> </li> <li> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ID NAME<br /> </li> <li> <span style="color:#FF9900;">---------- --------------------</span><br /> </li> <li> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1 hoegh<br /> </li> <li> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;10 hoegh </li> </ol> </div> </div> <p> <br /> </p> <h3> <span>ORA-01552</span>报错 </h3> <div> &nbsp; &nbsp;<span style="white-space:normal;">此时,如果我们对</span><span style="white-space:normal;">hoegh</span><span style="white-space:normal;">表进行</span><span style="white-space:normal;">DML</span><span style="white-space:normal;">操作,系统</span>就会报ORA-01552错误,提示非系统表空间&nbsp;'USERS'&nbsp;不能使用系统回退段。 </div> <p> <br /> </p> <div> <div class="codeheads"> <p> 点击(<span style="cursor:pointer;color:red;" onclick="code_hide('code826')">此处</span>)折叠或打开 </p> </div> <div id="code826" class="codeText"> <ol style="margin:0 1px 0 0;padding:5px 0pt;" start="1" class="dp-css none_number"> <li> <span style="color:#000000;">SQL<span style="color:#0000CC;">&gt;</span><br /> </span> </li> <li> SQL<span style="color:#0000CC;">&gt;</span> <span style="color:#0000FF;">insert</span> <span style="color:#0000FF;">into</span> hoegh <span style="color:#0000FF;">values</span><span style="color:#0000CC;">(</span>100<span style="color:#0000CC;">,</span><span style="color:#FF00FF;">'hoegh'</span><span style="color:#0000CC;">)</span><span style="color:#0000CC;">;</span><br /> </li> <li> <span style="color:#0000FF;">insert</span> <span style="color:#0000FF;">into</span> hoegh <span style="color:#0000FF;">values</span><span style="color:#0000CC;">(</span>100<span style="color:#0000CC;">,</span><span style="color:#FF00FF;">'hoegh'</span><span style="color:#0000CC;">)</span><br /> </li> <li> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000CC;">*</span><br /> </li> <li> 第 1 行出现错误<span style="color:#0000CC;">:</span><br /> </li> <li> ORA<span style="color:#0000CC;">-</span>01552<span style="color:#0000CC;">:</span> 非系统表空间 <span style="color:#FF00FF;">'USERS'</span> 不能使用系统回退段<br /> </li> <li> &nbsp;<br /> </li> <li> &nbsp;<br /> </li> <li> SQL<span style="color:#0000CC;">&gt;</span> </li> </ol> </div> </div> <p> <br /> </p> <p> &nbsp; &nbsp;&nbsp;当然,这只是一个实现手段,我们肯定不会为了设置一个只读表而将整个数据库设置为只读状态。<br /> </p> <h2> 总结 </h2> <p> &nbsp; &nbsp;&nbsp;上面这几种办法都可以实现将一个表设置为只读表,大家可以根据各自的具体需求选用最合适的方法。比如,最近我们一个项目为了提高数据的安全性,需要将配置数据(多张表)设置为只读表;并且,当初为了管理方便,所有的配置数据存放到一个单独的表空间,这样,我就会选用<span style="background-color:#FFE500;">只读表空间</span>的方法来实现这个具体需求。<br /> <br /> <div style="line-height:26px;background-color:#ffffff;text-indent:32px;font-family:宋体, Arial;white-space:normal;color:#666666;"> <span style="font-family:'Courier New';font-size:small;">hoegh</span> </div> <div style="line-height:26px;background-color:#ffffff;text-indent:32px;font-family:宋体, Arial;white-space:normal;color:#666666;"> <span style="font-family:'Courier New';font-size:small;">15.8.4</span> </div> <div style="line-height:26px;background-color:#ffffff;text-indent:32px;font-family:宋体, Arial;white-space:normal;color:#666666;"> <span style="font-family:'Courier New';font-size:small;">-- The End --</span> </div> </p>

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/24113018/viewspace-1840931/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2013-07-02

  • 博文量
    43
  • 访问量
    77539