<p>
有时为了提高数据的安全性,我们需要把一个或多个表设置为只读,即不允许对其执行任何<span> DML(Insert, Update, Delete) </span>操作。
</p>
<p>
在<span>Oracle11g</span>中实现只读表非常简单,只需要执行<span>alter table ... read
only;</span>语句即可;但是在<span>11g</span>之前的版本,“只读”只对数据库和表空间有效,如果我们要实现一个只读表,只能通过其他办法。
</p>
<p>
下面就介绍在<span>Oracle10g</span>中实现只读表的几种常用方法。首先,我们先创建测试表<span>hoegh</span>。
</p>
<h2>
测试环境
</h2>
<p>
我们在<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;">></span><br />
</span>
</li>
<li>
SQL<span style="color:#0000CC;">></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>
<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>
<br />
</li>
<li>
SQL<span style="color:#0000CC;">></span>
</li>
</ol>
</div>
</div>
<p>
<br />
</p>
<p>
<span></span>
</p>
<h2>
创建测试用户及测试表
</h2>
<p>
我们创建一个测试用户<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;">></span><br />
</span>
</li>
<li>
SQL<span style="color:#0000CC;">></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>
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>
<br />
</li>
<li>
用户已创建。<br />
</li>
<li>
<br />
</li>
<li>
SQL<span style="color:#0000CC;">></span><br />
</li>
<li>
SQL<span style="color:#0000CC;">></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>
<br />
</li>
<li>
授权成功。<br />
</li>
<li>
<br />
</li>
<li>
SQL<span style="color:#0000CC;">></span><br />
</li>
<li>
SQL<span style="color:#0000CC;">></span> conn hoegh<span style="color:#0000CC;">/</span>hoegh<br />
</li>
<li>
已连接。<br />
</li>
<li>
SQL<span style="color:#0000CC;">></span><br />
</li>
<li>
SQL<span style="color:#0000CC;">></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>
<br />
</li>
<li>
表已创建。<br />
</li>
<li>
<br />
</li>
<li>
SQL<span style="color:#0000CC;">></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>
<br />
</li>
<li>
已创建 1 行。<br />
</li>
<li>
<br />
</li>
<li>
SQL<span style="color:#0000CC;">></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>
<br />
</li>
<li>
已创建 1 行。<br />
</li>
<li>
<br />
</li>
<li>
SQL<span style="color:#0000CC;">></span> commit<span style="color:#0000CC;">;</span><br />
</li>
<li>
<br />
</li>
<li>
提交完成。<br />
</li>
<li>
<br />
</li>
<li>
SQL<span style="color:#0000CC;">></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>
<br />
</li>
<li>
ID NAME<br />
</li>
<li>
<span style="color:#FF9900;">---------- --------------------</span><br />
</li>
<li>
1 hoegh<br />
</li>
<li>
10 hoegh<br />
</li>
<li>
<br />
</li>
<li>
SQL<span style="color:#0000CC;">></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>
该方法仅针对非属主用户。以<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;">></span><br />
</span>
</li>
<li>
SQL<span style="color:#0000CC;">></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>
<br />
</li>
<li>
授权成功。<br />
</li>
<li>
<br />
</li>
<li>
SQL<span style="color:#0000CC;">></span> conn scott<span style="color:#0000CC;">/</span>tiger<br />
</li>
<li>
已连接。<br />
</li>
<li>
SQL<span style="color:#0000CC;">></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>
<br />
</li>
<li>
ID NAME<br />
</li>
<li>
<span style="color:#FF9900;">---------- --------------------</span><br />
</li>
<li>
1 hoegh<br />
</li>
<li>
10 hoegh<br />
</li>
<li>
<br />
</li>
<li>
SQL<span style="color:#0000CC;">></span>
</li>
</ol>
</div>
</div>
<p>
<br />
</p>
<h3>
<span>ORA-01031</span>报错
</h3>
<p>
<span style="white-space:normal;"> <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;">></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>
<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>
<br />
</li>
<li>
<br />
</li>
<li>
SQL<span style="color:#0000CC;">></span>
</li>
</ol>
</div>
</div>
<p>
<br />
</p>
<p>
<span></span>
</p>
<h2>
方法二: 触发器
</h2>
<p>
我们可以在<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;">></span> conn hoegh<span style="color:#0000CC;">/</span>hoegh<br />
</span>
</li>
<li>
已连接。<br />
</li>
<li>
SQL<span style="color:#0000CC;">></span><br />
</li>
<li>
SQL<span style="color:#0000CC;">></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>
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>
3 <span style="color:#0000FF;">ON</span> HOEGH<br />
</li>
<li>
4 REFERENCING NEW <span style="color:#0000FF;">AS</span> NEW OLD <span style="color:#0000FF;">AS</span> OLD<br />
</li>
<li>
5 <span style="color:#0000FF;">FOR</span> EACH <span style="color:#0000FF;">ROW</span><br />
</li>
<li>
6 DECLARE<br />
</li>
<li>
7 <span style="color:#0000FF;">BEGIN</span><br />
</li>
<li>
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>
9 <span style="color:#0000FF;">END</span><span style="color:#0000CC;">;</span><br />
</li>
<li>
10 <span style="color:#0000CC;">/</span><br />
</li>
<li>
<br />
</li>
<li>
触发器已创建
</li>
</ol>
</div>
</div>
<p>
<br />
</p>
<p>
<span> </span>
</p>
<h3 style="margin-left:0cm;text-indent:0cm;">
<span>ORA-20001</span>报错
</h3>
<div>
<span style="white-space:normal;"> <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;">></span><br />
</span>
</li>
<li>
SQL<span style="color:#0000CC;">></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>
<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>
<br />
</li>
<li>
<br />
</li>
<li>
SQL<span style="color:#0000CC;">></span>
</li>
</ol>
</div>
</div>
<p>
<br />
</p>
<h2>
方法三:检查约束
</h2>
<p>
我们知道对<span>constraint</span>的开启和关闭共有四种:
</p>
<p style="margin-left:42.0pt;text-indent:-21.0pt;">
l <span>enable( validate) :</span>启用约束<span>,</span>创建索引<span>,</span>对已有及新加入的数据执行约束。<span></span>
</p>
<p style="margin-left:42.0pt;text-indent:-21.0pt;">
l <span>enable novalidate :</span>启用约束<span>,</span>创建索引<span>,</span>仅对新加入的数据强制执行约束<span>,</span>而不管表中的现有数据。<span></span>
</p>
<p style="margin-left:42.0pt;text-indent:-21.0pt;">
l <span>disable( novalidate):</span>关闭约束<span>,</span>删除索引<span>,</span>可以对约束列的数据进行修改等操作。<span></span>
</p>
<p style="margin-left:42.0pt;text-indent:-21.0pt;">
l <span>disable validate :</span>关闭约束<span>,</span>删除索引<span>,</span>不能对表进行 插入<span>/</span>更新<span>/</span>删除等操作。<span></span>
</p>
<p>
因此,我们可以利用<span>disable
validate</span>来实现只读表。
</p>
<p>
如下所示:
</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;"> 此时,如果我们对</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;"> </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;">></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>
<br />
</li>
<li>
<br />
</li>
<li>
SQL<span style="color:#0000CC;">></span>
</li>
</ol>
</div>
</div>
<p>
<br />
</p>
<h2>
方法四:只读表空间
</h2>
<p>
设置只读表空间的主要目的是为了表空间中的静态数据不被修改,从而能够进行数据库的备份和恢复等操作,还能够保护只读表空间中的数据不被修改。
</p>
<ul>
<li>
<span style="line-height:1.5;">设置只读表空间的语法:</span><span style="line-height:1.5;">ALTER TABLESPACE <</span><span style="line-height:1.5;">表空间</span><span style="line-height:1.5;">> 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 <</span><span style="line-height:1.5;">表空间</span><span style="line-height:1.5;">> READ WRITE;</span>
</li>
</ul>
<p>
由上面创建测试用户的语句我们得知,<span>hoegh</span>用户的默认表空间是<span>users</span>,因此我们将<span>users</span>表空间设为只读表空间。这样,<span>hoegh</span>用户下的所有表都将会是只读表,包括<span>hoegh</span>表。<br />
如下所示。
</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;">></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;">></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>
<br />
</li>
<li>
表已更改。<br />
</li>
<li>
<br />
</li>
<li>
SQL<span style="color:#0000CC;">></span><br />
</li>
<li>
SQL<span style="color:#0000CC;">></span> conn sys<span style="color:#0000CC;">/hoegh</span> <span style="color:#0000FF;">as</span> sysdba<br />
</li>
<li>
已连接。<br />
</li>
<li>
SQL<span style="color:#0000CC;">></span><br />
</li>
<li>
SQL<span style="color:#0000CC;">></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>
<br />
</li>
<li>
表空间已更改。<br />
</li>
<li>
<br />
</li>
<li>
SQL<span style="color:#0000CC;">></span><br />
</li>
<li>
SQL<span style="color:#0000CC;">></span> conn hoegh<span style="color:#0000CC;">/</span>hoegh<br />
</li>
<li>
已连接。<br />
</li>
<li>
SQL<span style="color:#0000CC;">></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>
<br />
</li>
<li>
ID NAME<br />
</li>
<li>
<span style="color:#FF9900;">---------- --------------------</span><br />
</li>
<li>
1 hoegh<br />
</li>
<li>
10 hoegh
</li>
</ol>
</div>
</div>
<p>
<br />
</p>
<h3>
<span>ORA-00372& ORA-01110</span>报错
</h3>
<div>
<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& 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;">></span><br />
</span>
</li>
<li>
SQL<span style="color:#0000CC;">></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>
<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>
<br />
</li>
<li>
<br />
</li>
<li>
SQL<span style="color:#0000CC;">></span>
</li>
</ol>
</div>
</div>
<p>
<br />
</p>
<h3>
<span style="color:#E53333;">DROP</span><span style="color:#E53333;">操作不受影响</span>
</h3>
<p>
需要注意的是,只读表空间下是可以执行<span>DROP</span>操作的。
</p>
<p>
我们知道,每个数据库在运行的时候<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>
当一个正常打开的数据库被设置为只读状态时,用户只能查询数据,但不能以任何方式对数据库对象进行修改。处于只读状态,可能保证数据文件和重做日志文件中的内容不被修改,但是并不限制那些不会写入数据文件与重做日志文件的操作。
</p>
<p style="margin-left:42.0pt;text-indent:-21.0pt;">
l 设置只读命令:<span>alter database open read
only;</span>
</p>
<p style="margin-left:42.0pt;text-indent:-21.0pt;">
l 取消只读命令:<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;">></span><br />
</span>
</li>
<li>
SQL<span style="color:#0000CC;">></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;">></span> <span style="color:#0000FF;">alter</span> <span style="color:#0000FF;">tablespace</span> users read write<span style="color:#0000CC;">;</span><br />
</li>
<li>
<br />
</li>
<li>
表空间已更改。<br />
</li>
<li>
<br />
</li>
<li>
SQL<span style="color:#0000CC;">></span><br />
</li>
<li>
SQL<span style="color:#0000CC;">></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;">></span><br />
</li>
<li>
SQL<span style="color:#0000CC;">></span> <span style="color:#FF0000;">startup</span> mount<br />
</li>
<li>
ORACLE 例程已经启动。<br />
</li>
<li>
<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;">></span><br />
</li>
<li>
<span style="background-color:#FFE500;">SQL</span><span style="color:#0000CC;background-color:#FFE500;">></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>
<br />
</li>
<li>
数据库已更改。<br />
</li>
<li>
<br />
</li>
<li>
SQL<span style="color:#0000CC;">></span><br />
</li>
<li>
SQL<span style="color:#0000CC;">></span> conn hoegh<span style="color:#0000CC;">/</span>hoegh<br />
</li>
<li>
已连接。<br />
</li>
<li>
SQL<span style="color:#0000CC;">></span><br />
</li>
<li>
SQL<span style="color:#0000CC;">></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>
<br />
</li>
<li>
ID NAME<br />
</li>
<li>
<span style="color:#FF9900;">---------- --------------------</span><br />
</li>
<li>
1 hoegh<br />
</li>
<li>
10 hoegh
</li>
</ol>
</div>
</div>
<p>
<br />
</p>
<h3>
<span>ORA-01552</span>报错
</h3>
<div>
<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错误,提示非系统表空间 'USERS' 不能使用系统回退段。
</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;">></span><br />
</span>
</li>
<li>
SQL<span style="color:#0000CC;">></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>
<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>
<br />
</li>
<li>
<br />
</li>
<li>
SQL<span style="color:#0000CC;">></span>
</li>
</ol>
</div>
</div>
<p>
<br />
</p>
<p>
当然,这只是一个实现手段,我们肯定不会为了设置一个只读表而将整个数据库设置为只读状态。<br />
</p>
<h2>
总结
</h2>
<p>
上面这几种办法都可以实现将一个表设置为只读表,大家可以根据各自的具体需求选用最合适的方法。比如,最近我们一个项目为了提高数据的安全性,需要将配置数据(多张表)设置为只读表;并且,当初为了管理方便,所有的配置数据存放到一个单独的表空间,这样,我就会选用<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博客 ” ,链接:https://blog.itpub.net/24113018/viewspace-1840931/
,如需转载,请注明出处,否则将追究法律责任。