2010-03-03 8 views
13

hatte ich eine Einschränkung in einer TabelleFinding Geister Einschränkung von Oracle DB


CREATE TABLE "USERSAPPLICATIONS" (
    "USERID" NUMBER NOT NULL , 
    "APPLICATIONNAME" VARCHAR2 (30) NOT NULL , 
CONSTRAINT "PK_USERSAPPLICATIONS" PRIMARY KEY ("USERID","APPLICATIONNAME") 
) 
/

Vor zwei Wochen mir die Tabelle geändert, hinzugefügt einige Spalten, löschte die Einschränkung „PK_USERSAPPLICATIONS“ und hatte einen Ersatzschlüssel. Ich kann in Oracle SQL Developer sehen, dass die Einschränkung PK_USERSAPPLICATIONS nicht mehr existiert.

Unabhängig davon, wenn ich versuche, zwei Einträge mit der gleichen Benutzer-ID/application Kombination hinzuzufügen, ich einen Fehler


SQL Error: ORA-00001: unique constraint (ACCOUNTMP1.PK_USERSAPPLICATIONS) violated 
00001. 00000 - "unique constraint (%s.%s) violated" 
*Cause: An UPDATE or INSERT statement attempted to insert a duplicate key. 
      For Trusted Oracle configured in DBMS MAC mode, you may see 
      this message if a duplicate entry exists at a different level. 
*Action: Either remove the unique restriction or do not insert the key. 

Wenn ich der Aussage


SELECT * 
FROM user_cons_columns 
WHERE constraint_name = 'PK_USERSAPPLICATIONS' 

ausführen bekomme ich null Zeilen . Wie kann das sein? Oracle sollte keine Kenntnis von der Einschränkung PK_USERSAPPLICATIONS haben, da sie bereits vor Wochen gelöscht wurde, und ich kann sie auch nicht in der Datenbank sehen.

Antwort

30

Haben Sie immer noch den Index, der von dieser Einschränkung verwendet wurde? Denn es sei denn, Sie haben die DROP INDEX-Klausel bei der Aufhebung der Einschränkung eingefügt. Beginnen Sie mit

SELECT * 
FROM user_indexes 
WHERE index_name = 'PK_USERSAPPLICATIONS' 
/

Alternativ

select index_name 
from user_indexes 
where table_name = 'USERSAPPLICATIONS' 
and uniqueness='UNIQUE' 
/

oder

select index_name 
from user_ind_columns 
where table_name = 'USERSAPPLICATIONS' 
and column_name in ('USERID' ,'APPLICATIONNAME') 
/

bearbeiten

Proof-of-Concept

SQL> create table t23 (id number not null, alt_key varchar2(10) not null) 
    2/

Table created. 

SQL> create unique index t23_idx on t23 (id) 
    2/

Index created. 

SQL> alter table t23 add constraint t23_pk primary key (id) using index 
    2/

Table altered. 

SQL> insert into t23 values (1, 'SAM I AM') 
    2/

1 row created. 

SQL> insert into t23 values (1, 'MR KNOX') 
    2/
insert into t23 values (1, 'MR KNOX') 
* 
ERROR at line 1: 
ORA-00001: unique constraint (APC.T23_PK) violated 

SQL> 

So funktioniert die Einschränkung. Was passiert, wenn wir es ohne die DROP INDEX-Klausel löschen?

SQL> alter table t23 drop constraint t23_pk 
    2/

Table altered. 

SQL> insert into t23 values (1, 'MR KNOX') 
    2/
insert into t23 values (1, 'MR KNOX') 
* 
ERROR at line 1: 
ORA-00001: unique constraint (APC.T23_IDX) violated 


SQL> 

Beachten Sie die subtile Änderung in der Fehlermeldung. Der zweite Fehler verweist auf den Indexnamen, während die ursprüngliche Nachricht auf die Einschränkung verweist. Wenn der Indexname mit dem Constraint-Namen übereinstimmt, wäre es schwierig, dies zu diagnostizieren.

Wenn Sie den eindeutigen Index nicht explizit vorab erstellen, ist das Standardverhalten von Oracle das Erstellen eines nicht eindeutigen Index. Folglich verursacht das Löschen der Einschränkung, ohne den Index zu löschen, dieses Problem nicht. (Achtung, dieses Verhalten gilt für 11g. Ich nehme an - kann aber nicht sicher sein - dass es in früheren Versionen auch so ist).

+0

+1. Spot auf. Hätte nie so gedacht. – Guru

+0

Sehr gute und gründliche Antwort. Das war es - blöd wurde der Index in meinem Fall genau so genannt. – simon

+0

Danke. Nachdem der Index gefunden wurde, lösche ich ihn mit einem anderen Skript DROP INDEX PK_USERSAPPLICATIONS; – Coisox

1

Versuchen Sie, nach dem Index für diese Spalten zu suchen. In einigen Fällen wird der mit der Abhängigkeit verknüpfte Index nach dem Löschen der Bedingung nicht gelöscht.