探秘 ORA-00955 报错及解决之道

2024-12-14 10:12:31

一、ORA-00955 报错究竟为何?

图片7.jpg

(一)含义解读

在使用 Oracle 数据库时,大家可能会遇到 ORA-00955 这样的报错提示,它所代表的含义是 “名称已由现有对象使用”。简单来说呢,就是你在进行数据库相关操作,想要创建某个对象(比如表、视图等),或者对某些对象进行特定操作时,所使用的这个对象名称,在当前数据库环境里已经被别的对象占用了,这就导致了该报错的出现,让操作没办法顺利进行下去哦。

(二)常见出现场景

创建视图时:例如在执行 “create or replace view csews as select * from order_list;” 这样的语句创建视图时,可能会出现 ORA-00955 报错。有可能是数据库中已经存在了名为 “csews” 的对象,像有人之前创建过同名的同义词等情况,即便去查询 “select * from all_objects where object_name=‘csews‘;” 可能一时没查出来(有时需要将名称换成大写去查询,因为经过 Oracle 的词法分析,本身会将小写转成大写),就会导致创建视图时出现这个报错啦。只有把同名的已有对象(如删除对应的同义词 “drop public synonym CSEWS;”)处理掉,才能成功创建视图哦。创建表时:很多小伙伴在建表过程中也常常遇到这个报错呢。有时候以为换个表名称就行了,可实际并非如此简单呀。比如在建表语句里,不仅是表名不能和已有的重复,像主键名等一些相关的约束名如果和以前的相同,也会造成无法进行创建表的操作哦。就像执行 “create table EXIST_OBJECT (SNO VARCHAR2 (100) NULL,NAME VARCHAR2 (255) NULL);” 这样的语句创建表时,可能会报 ORA-00955 错误,要是查询对象时没找到重复对象,还需要进一步去排查是不是其他相关命名冲突等情况呢。删除用户时:在删除用户操作中,如果该用户名下有一些对象(像表、视图等),而这些对象的名称和其他用户或者系统中已有的对象重名了,那么在执行删除用户这个动作时,也有可能触发 ORA-00955 报错哦。因为数据库要确保对象名称的唯一性,当存在这种重名情况时,就需要先去处理好重名对象的相关问题,才能顺利删除用户呢。创建物化视图时:比如在目标库上创建定时增量更新的物化视图,像执行 “create materialized view PF_ALARM_TYPE refresh fast on demand start with sysdate next sysdate+1/288 with rowid as select * from PF_ALARM_TYPE@SGUAP_LINK;” 语句时,要是创建的物化视图名称和已有的表名相同了,那就会出现 ORA-00955 报错,此时可以选择修改物化视图的名称或者把那个同名的表删除(不过删除表操作得谨慎哦),来解决这个报错问题,以便成功创建物化视图呀。创建无参数存储过程时:在创建无参数存储过程时,如果重复运行创建语句(已经先运行过一次了),又没有添加 “or replace”(这个的意思是:没有该名称过程时创建一个新的过程;有该名称过程时,将原先的过程覆盖),也会出现 “名称已由现有对象使用” 这个 ORA-00955 报错呢,修改代码添加 “or replace” 后,往往就能正常执行啦。

二、ORA-00955 报错原因大揭秘

(一)对象重名问题

在 Oracle 数据库的操作中,对象重名是引发 ORA-00955 报错的一个常见原因哦。这里所说的对象涵盖了诸多方面,比如表名、视图名、索引名等等。当我们执行创建对象的操作时,数据库会先去核查即将创建的这个对象名称是否已经存在于当前的数据库环境里了。举个例子呀,要是执行 “create global temporary table temp_aud on commit preserve rows as select * from sys.dba_audit_trail;” 这样的语句来创建临时表,结果报了 ORA-00955 错误,很有可能就是存在一个视图和这个要创建的临时表重名啦。这时候呢,我们可以通过 “select a.OBJECT_type,a.* from all_objects a where upper (a.OBJECT_NAME) ='TEMP_AUD';” 这样的查询语句去查看重名的对象哦。要是查出来有重名对象,解决方法要么是修改我们准备创建的这个对象的名称,要么就是删掉那个重复的已有对象呀。不过需要注意的是,如果查询对象时没有找到重复的呢,还可以在 dba 账户下执行 “alter system flush shared_pool;” 语句刷新一下共享池试试哦,但这个方法不一定每次都能解决问题啦。再比如创建表的时候,执行 “create table EXIST_OBJECT (SNO VARCHAR2 (100) NULL,NAME VARCHAR2 (255) NULL);” 语句创建表,出现 ORA-00955 报错,去查询对象时却没找到重复对象,那还得进一步排查是不是其他相关命名冲突等情况呢,因为不光是表名本身不能重复,像主键名等一些相关的约束名如果和以前的相同,也会导致这个报错出现,进而没办法顺利创建表哦。总之呀,只要创建的对象名称与数据库里已有的对象重名了,就大概率会触发 ORA-00955 报错,操作也就没法继续进行下去啦。

(二)命名规范缺失隐患

很多时候,出现 ORA-00955 报错是因为缺乏合理的命名策略,随意命名而导致了标识符冲突呢。大家在给数据库里的对象命名时呀,如果没有一个统一规范的标准,很容易就出现问题哦。比如说在给表命名的时候,典型的命名约定是给它一个描述性的名称,并且最好保持格式上的一致性,像可以统一使用单数冠词(比如 “customer” 或 “facility” )或者复数冠词(比如 “customers” 或 “facilities”)来命名呀。在给列命名时呢,同样要给它一个描述性的名称,除非受到字符限制,否则尽量不要使用缩写哦,要是用了缩写,也可以在该列上添加注释来提供完整的详细信息嘛,而且一般不需要在列名中包括表名,毕竟这属于多余的信息,开发人员每次使用该列时还得多输入额外的字符呢。还有在命名约束时呀,要给它一个能清楚标识其位置和内容的描述性名称哦,通常要涉及到约束的类型(因为表的一列可以有多个约束呀)、表名(可能存在多个表,每个表有相同的列名这种情况哦)以及列名(同一个表中,不同的列上可能有多个相同类型的约束呢)。像约束名称常见的公式可以是 “tablename_columnname_(pk|fk|u|nn|chk)” 或者 “(pk|fk|u|nn|chk)_tablename_columnname”(具体用哪种取决于咱们在搜索约束时希望将表名还是约束类型作为对约束进行排序的主要标准啦)。要是不遵循这些命名规范,随意去给对象命名,就很容易出现标识符冲突,进而引发 ORA-00955 报错啦。所以呀,大家一定要重视命名规范的重要性,在整个数据库的操作过程中,始终如一地应用合理的命名策略,这样才能减少这类报错情况的出现哦。

三、ORA-00955 报错的解决办法有哪些?

(一)常规处理手段

当遇到 ORA-00955 报错时,我们可以先尝试一些常规的处理手段哦。比如刷新共享池,当你去查询对象时没有找到重复对象,就可以在 dba 账户下执行 “alter system flush shared_pool;” 语句来刷新一下共享池试试呀。操作步骤如下:首先登陆数据库服务器,输入 “su - oracle”,接着进入 “sqlplus "/as sysdba"”,然后执行 “alter system flush shared_pool;”,最后输入 “exit” 退出就可以啦。不过要注意哦,这个方法不一定每次都能解决问题呢。还有就是删除重复对象啦,如果通过查询(像使用 “select a.OBJECT_type,a.* from all_objects a where upper (a.OBJECT_NAME) =' 具体对象名称 ';” 这样的语句去查询)确定存在重复的对象,那根据实际情况把重复的对象删掉就行啦。例如创建视图时发现有同名的同义词导致报错,那就可以执行 “drop public synonym 同义词名称;” 来删掉这个重复对象,从而顺利创建视图哦。另外,修改名称也是常用的办法呢。像在创建物化视图时,要是名称和已有的表名相同了出现报错,这时候可以选择修改物化视图的名称,避免和已有的对象重名,进而解决 ORA-00955 报错问题,成功进行相应的创建操作呀。总之呀,这些常规处理手段在很多常见的 ORA-00955 报错场景中都可以先尝试一下,说不定就能快速解决问题,让操作继续顺利进行下去哦。

(二)复杂情况应对

但有时候我们会遇到比较复杂的情况呢,比如临时表被锁了。下面就来讲讲针对这类复杂情况该怎么应对哈。首先要查找正在使用相关对象的会话,以临时表为例,我们可以通过以下步骤来查找哦。先执行 “select object_id from user_objects where object_name=upper (' 具体临时表名称 ');” 查出对象的 id,接着执行 “select sid from v session where sid = 前面查到的 sid;”,不过要是存在多个可能没办法直接查询,那就按照这样的分步查询来操作哦。查到相关会话后,就要杀掉进程啦,使用 “alter system kill session'sid,serial#';” 语句来进行操作。但有可能会出现 ORA-00031 报错,这代表在数据库级不能马上杀掉该死锁进程,不过它已经被标记为待杀掉的状态了,会在其当前不可中断的操作完成后尽快被终止哦,要是想让它更快被终止,也可以再次执行这个杀掉进程的命令呢。要是出现上述情况,还需要在操作系统级进行处理哦。先通过 “select spid, osuser, s.program from v process p where s.paddr = p.addr and s.sid = 具体的 sid;” 查出这个 session 的 spid,然后在数据库服务器上使用 “kill -9 spid”(这里的 spid 就是前面查出来的值哦)杀掉查出的系统进程,并用 root 用户再执行这个操作确保进程被彻底杀掉呢。通过这样一系列在数据库级和操作系统级的处理流程,即便遇到像临时表被锁这类棘手的复杂情况,咱们也能尝试去应对解决 ORA-00955 报错问题,让数据库操作恢复正常呀。

四、如何有效预防 ORA-00955 报错?

(一)合理规划命名

在数据库操作的世界里呀,提前做好规划可是相当重要的呢,尤其是针对各类对象的命名规划哦。咱们得制定一套统一、规范的命名规则,这能从源头上避免很多因命名问题而引发的 ORA-00955 报错情况哦。就拿数据库里常见的表、列、约束等对象来说吧。在给表命名时呀,建议采用一些描述性的名称,并且保持格式上的一致性哦,像可以统一使用单数冠词(比如 “customer” 或 “facility” )或者复数冠词(比如 “customers” 或 “facilities”)来命名呢。例如咱们要创建一个存储客户信息的表,就可以命名为 “customers”,让人一眼就能大概知道这个表的用途啦。对于列的命名呢,同样也得给它一个清晰明了的描述性名称哦,除非受到字符限制,否则尽量不要使用缩写呀。要是实在用了缩写,那不妨在该列上添加注释来提供完整的详细信息嘛,而且呀,一般不需要在列名中包括表名哦,毕竟这属于多余的信息,要是每次开发人员使用该列时还得多输入额外的字符,多麻烦呀。比如说有个 “customers” 表,里面存储客户电话号码的列,咱们可以命名为 “phone_number”,而不是 “customers_phone” 哦。还有约束的命名也不容忽视哦,要给它一个能清楚标识其位置和内容的描述性名称呢,通常要涉及到约束的类型(因为表的一列可以有多个约束呀)、表名(可能存在多个表,每个表有相同的列名这种情况哦)以及列名(同一个表中,不同的列上可能有多个相同类型的约束呢)。像约束名称常见的公式可以是 “tablename_columnname_(pk|fk|u|nn|chk)” 或者 “(pk|fk|u|nn|chk)_tablename_columnname”(具体用哪种取决于咱们在搜索约束时希望将表名还是约束类型作为对约束进行排序的主要标准啦)。总之呀,只有提前合理规划好这些命名规则,并且在整个数据库操作过程中始终如一地去应用它,才能最大程度减少因为命名不当而出现 ORA-00955 报错的可能性哦,小伙伴们可一定要重视起来呀。

(二)操作前仔细检查

在进行数据库的各种操作,像创建、修改等动作之前呀,咱们可得多留个心眼,仔细地对要操作的对象名称进行检查核对哦,这一步可是能帮咱们减少不少 ORA-00955 报错出现的几率呢。比如说咱们准备创建一个新的视图或者表的时候呀,不要着急着去执行创建语句哦,先停下来,通过相应的查询语句去确认一下即将使用的这个对象名称是不是已经存在于当前的数据库环境里啦。像可以使用 “select a.OBJECT_type,a.* from all_objects a where upper (a.OBJECT_NAME) =' 具体对象名称 ';” 这样的语句去查询一下哦。要是发现存在重名风险,那就得赶紧想办法解决啦,要么修改咱们准备创建的这个对象的名称,换个独特的、还没被使用过的名字呀;要么呢,如果确定是之前遗留的一些重复的、已经不需要的对象,就可以把它删掉哦,比如创建视图时发现有同名的同义词导致报错,那就可以执行 “drop public synonym 同义词名称;” 来删掉这个重复对象,从而顺利进行后续的创建操作啦。再比如在设置将表的字段设置为自增,用序列 sequence 的方法来实现时,此时要特别留意 sequence 后的名字要和创建表时的名字不一致哦,要是先前已经写了一样的名字,可以在 PL/SQL 软件中找到 Sequence,找到对应的删除,然后重新运行(如果是表名先建立,可以使用 “drop table 表名;” 进行删除)呢。所以呀,操作前这简单的检查核对步骤可千万别偷懒省略哦,它能让咱们后续的数据库操作更加顺畅,少被 ORA-00955 报错这类问题所


声明:此篇为墨韵科技原创文章,转载请标明出处链接: https://360jidan.com/news/4510.html
  • 网站建设
  • SEO
  • 信息流
  • 短视频
合作伙伴
在线留言
服务热线

服务热线

15879069746

微信咨询
返回顶部
在线留言