2010-05-03 10 views
8

Ich habe diese Abfrage zu migrieren (vereinfacht hier) von T-SQL zu ORACLEWelcher Befehl würde IDENTITY INSERT ON/OFF vom SQL Server in Oracle ersetzen?

SET IDENTITY_INSERT table ON 

INSERT INTO table (id, value) VALUES (1, 2) 

SET IDENTITY_INSERT table OFF 

id ist ein Identitätsfeld in SQLServer.

ich die gleiche Tabelle mit einer Sequenz in ORACLE haben, konnte ich nicht einen Ausschnitt, der zeigt, wie man die Sequenz deaktivieren und setzen Sie ihn wieder starten mit dem MAX (id) + 1.

Jede ORACLE Experte kann mir dabei helfen?

Danke, Rodrigo.

Antwort

7

Sie müssen die Identität in Oracle nicht deaktivieren. Da Sie Sequenzen verwenden, verwenden Sie sie nicht für diese Einfügung.

Das heißt, statt

insert into table (id, values) values (table_seq.nextval, 2) 

Sie verwenden

insert into table (id, values) values (1, 2) 

Was Ihre zweite Frage über die Sequenz neu zu starten, denke ich, dass here in SO beantwortet wird.

+0

Wenn Sie beabsichtigen, die Identität gleich zu halten (was der Fall zu sein scheint), ist dies keine Lösung. –

+0

@Nate: Sie haben verpasst, wo es heißt "MAX (id) +1" –

1

Mit Spalten, die auf diese Weise von Oracle-Sequenzen bevölkert werden, scheint eine schlechte Idee zu sein. In Oracle pflegen Sie normalerweise eine Spalte, die über Sequenzen mit einem Trigger gefüllt wird. Wenn Sie diese Funktion aktivieren und deaktivieren und die Sequenz ad lib zurücksetzen, besteht das Risiko, dass eine Sequenz nicht verfügbar ist, wenn ein anderer Prozess sie benötigt, oder dass sie auf einen Wert zurückgesetzt wird, der bereits verwendet, aber nicht festgeschrieben wurde.

+1

Trigger sind unnötig, solange 'sequence.NEXTVAL' in allen INSERT-Anweisungen für die Tabelle verwendet wird, was eigentlich nur in einer einzigen gespeicherten Prozedur passieren sollte . –

+0

+1 zu sowohl der Antwort als auch dem Kommentar für den vernünftigen Rat. –

0

Lassen Sie die Sequenzen fallen und erstellen Sie sie neu, wenn Sie den Wert für max + 1 erreicht haben.

+0

unter der Annahme, dass dies ein 1-maliges ETL ist –

+1

Das macht Code ungültig, der von dieser Sequenz abhängt, und es fallen auch alle Privilegien in den Prozess. Wenn das kein Problem ist, dann ist dies die einfachste Option. –

+0

@Rob: Guter Punkt auf die Nebenwirkungen. – DCookie