Globale Temporäre Tabelle mit "On commit delete rows" nicht halten alle Daten
Ich habe eine Globale temporäre Tabellen (GTT) definiert ein Erstellungs-Skript mit der option zum löschen von Zeilen auf einen commit. Ich wollte in der Lage sein, verschiedene Benutzer sehen Ihre Daten in den AGBs und nicht die Daten anderer Leute-Sitzungen. Dies funktionierte perfekt in unserem test-Umfeld.
Aber dann habe ich bereitgestellt GTT als Teil eines Updates, um die Funktionalität auf die client-Datenbank. Der Kunde rief mich ganz aufgeregt und besorgt, weil die AGBs nicht halten keine Daten mehr, und Sie wusste nicht, warum.
Speziell, wenn jemand hat:
insert into my_GTT (description) values ('Happy happy joy joy')
der Datenbank reagieren würde:
1 row inserted.
Jedoch, wenn die gleichen end-user versucht:
select * from my_GTT
Der Datenbank reagieren würde:
0 rows returned.
Dieses Problem passiert auf der client-Seite, und wir können es nicht reproduzieren im Haus. Was könnte die Ursache dieses Verhaltens?
- Was ist "playmate" - ist, dass eine andere Sitzung? Haben Sie versucht, die änderung der Tabelle zu ON COMMIT PRESERVE ROWS, nur um zu sehen, was passiert?
- "Spielgefährte" ist ein end-Benutzer. Dieses Problem passiert auf der client-Seite, und wir können es nicht reproduzieren im Haus. Auch glaube ich nicht, haben keine Kontrolle über die änderung der Tabelle-code, da es auf der client-Seite.
- Hatten Sie schon einmal unten auf dieser? Auf dem Gesicht von ihm, ein Problem mit Berechtigungen (d.h. der Benutzer darf schreiben, aber nicht Lesen), scheint weniger wahrscheinlich als ein autocommit-Einstellung irgendwo.
- Im Rückblick auf diese Frage, nun mein Versuch, lustig zu machen, lässt mich Fragen "was zum Teufel war diese Frage etwa?", Ich weiß nicht einmal erinnern, was für ein system ich hatte das Problem (jetzt ist mein Alter job)
Du musst angemeldet sein, um einen Kommentar abzugeben.
ON COMMIT DELETE ROWS
= Daten in einer TransaktionON COMMIT PRESERVE ROWS
= Daten in einer Datenbank-session (ein Benutzer mit 2 Trainingseinheiten = 2 session = unterschiedlicher Inhalt)Wenn GTT ist definiert mit
ON COMMIT DELETE ROWS
wäre es leer, nachdem eine explizite commit-oder implizites commit (= implizite commit = nach alle DLL-Befehls, einschließlich zum Beispiel truncate table, alter index, add partition, ändern Sie die Spalte, exchange partition):Wenn GTT ist definiert mit
ON COMMIT PRESERVE ROWS
wäre es, Daten aufzunehmen, die bis Ende der Sitzung:Hast du eine Einstellung aktiviert, die in Ihrer Ziel-Umgebung, wo jede Anweisung wird automatisch zu Begehen?
(Meine Erfahrung ist in SQL Server, wo Z ist die Standardeinstellung, aber ich verstehe in Oracle, den Standard zu halten, ist die Transaktion öffnen, bis ein explizites commit. Geist, ich habe nicht berührt, die Oracle seit ~2000)
Ich denke, Damien hat Recht und es ist ein autocommit. Die einzige andere option, die ich mit oben kommen kann ist eine Art von Verbindungs-pool-Problem (dh die wählen Sie getan wird, von einer separaten Sitzung in der Beilage)