Zum Inhalt springen

[ODBC][Oracle] Maximale Statement Größe


Don.Zwiebel

Empfohlene Beiträge

Hallo Leute,

wie groß ist die maximale Größe, die ein Datenbankstatement mit ODBC haben darf ?

Ich weiß, das es eine Funktion SqlGetInfo gibt, jedoch nicht, wo ich diese finde. Irgendwelche Tipps ?

Wie kann ich die maximale Größe für Statements ändern ?

Das Problem: Erstellung eines Triggers mit 73.000 Zeichen (Oracle)

Danke

Don.Zwiebel

Link zu diesem Kommentar
Auf anderen Seiten teilen

Das Problem: Erstellung eines Triggers mit 73.000 Zeichen (Oracle)

Schulligung, dass ich dir nicht weiterhelfen kann bezueglich Oracle, aber welcher vernuenftige Mensch packt 73.000 Zeilen in EINEN Trigger?

Mich wuerde jetzt doch sehr interessieren, wie es dazu kommen kann.

Goos (*unglaeubig*)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Also soviel kann ich dir auch net dazu sagen. Hab nur gerade mal ein Statement mit knapp 90.000 Zeichen über ODBC auf einer Oracle-DB ausgeführt und das funktionierte. Soweit ich weiß gibt es über ODBC bei Oracle aber Probleme bei sehr langen Zeilen, sprich mehr als 2000 Zeichen. Dann stürzen die ausführenden Anwendung mehr oder weniger heftig ab.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Abstürzen tut die Anwendung nicht.

Was ist den dann dein Problem?

Oder stürzt das ding nicht ab, ist aber langsam? Würde mich nicht wundern. Was heißt überhaupt das der Trigger dynamisch geändert wird? Bei jedem INsert ändert sich der Trigger?

Wenn du den Trigger tatsächlich ständig änderst, kann ich dir grundsätzlich nur empfehlen, das ganze in ein Package auszulagern und im Trigger das Package bzw. die Funktion im Package zu rufen. Ist bestimmt auch besser im Bezug auf recompilieren usw....

Interessehalber: Wie hoch ist den dein Oracle-Parameter "open_cursors" ?

Grüße mme

Link zu diesem Kommentar
Auf anderen Seiten teilen

Das Problem dabei ist, dass der Trigger auf etwa 8.000 Zeichen gekürzt wird (von den 73.000)

Nur warum ? :confused: :confused: :confused:

Oha, ich hab zwar keine Ahnung von Oracle (bin MS User), aber das hoert sich schwer nach ner Datentyp Begrezung an.

Es scheint mir so, als wuerdest versuchen den ganzen Trigger dynamisch in einer Variable zusammenzubasteln um ihn dann auszufuehren. So ne Variable vom Typ varchar/char kann aber wahrscheinlich nur 8000 Zeichen aufnehmen. Zumindest ist das beim MS SQL-Server so.

Goos

Link zu diesem Kommentar
Auf anderen Seiten teilen

Also:

Wir haben ein Programm, das die Zugriffe auf die Tabellen überwachen soll.

Da man bei Oracle keinen Trigger, der sich dynamisch (für jede Tabelle geeignet!) die Feldnamen holt und damit die :OLD. und :NEW. Werte holt wird von unserem Tool die Tabellenstruktur ausgelesen und für jede Tabelle ein Trigger von diesem Format generiert:

CREATE OR REPLACE TRIGGER ##TRIGGERNAME##

AFTER ##OPERATIONS## ON ##TABLENAME##

FOR EACH ROW

BEGIN

##FIELDS##

/* Dadurch ist ##FIELDS## für jedes Feld zu ersetzen:

IF (:OLD.##FIELDNAME## IS NOT NULL AND :NEW.##FIELDNAME## IS NOT NULL AND :OLD.##FIELDNAME## <> :NEW.##FIELDNAME##)

OR (:OLD.##FIELDNAME## IS NULL AND :NEW.##FIELDNAME## IS NOT NULL)

OR (:OLD.##FIELDNAME## IS NOT NULL AND :NEW.##FIELDNAME## IS NULL) THEN

INSERT INTO LOGBUCH (TABNAME, OLDVALUE, NEWVALUE, EDITNAME, EDITDATE, BEA_LOGIN, BEA_DATUM, UPDATE_NO)

VALUES ('##TABLENAME##',:OLD.##FIELDNAME##, :NEW.##FIELDNAME##, USER, SYSDATE, 'KOLIBRI', SYSDATE, 1);

END IF;

*/

COMMIT;

END;

Das Problem ist nun, das bei einigen Tabellen mit vielen Columns der Trigger über 73.000 Zeichen lang wird. Der Trigger ändert sich nicht ständig, sondern wird nur einmal angelegt.

Vorschläge ?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Es gibt doch verschiedene Auditing funktionen in Oracle... Ich glaube ich würde sowas damit lösen....

Kannst du den ausschließen was goos sagte (also das die Variable in deinem erstellungprogramm das von der Länge mitmacht) ? Ich glaube nicht umbedingt das das an ODBC liegt...

Link zu diesem Kommentar
Auf anderen Seiten teilen

Also die Variable ist ein LongString (bis 2MB) und passt auch im Debug - Modus.

Über auditing ist es aber so ohne weiteres auch nicht möglich Änderungen an den Tabellen zu überwachen (wer wann welchen alten und neuen Wert geändert hat, usw.)

Jedenfalls bin ich damit nicht weiter gekommen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Wie es genau mit dem Audit geht weiß ich auch nicht, aber was ich schon benutzt habe ist der logminer. Wenn sich deine DB im archive-modus befindet kannst du jede Änderung jederzeit nachvollziehen. Befindet sie sich nicht im Archive-Modus, kannst du nur die letzten paar minuten nachvollziehen... Aber das ding ist recht umfangreich. Du kannst dir alle Änderungen anschauen die ein DB-User gemacht hat, oder du Filterst nach BS-USer, oder nach der Client-Workstation usw.... Du bekommst sogar scripte erstellt um diese Änderungen rückgängig zu machen... vielleicht würde das ding dir helfen.

Ansonsten kann ich nur meine Fragen von oben wiederhohlen, ob es den Funktioniert, wenn du den Trigger in SQLplus erstellst und nicht über odbc???

Link zu diesem Kommentar
Auf anderen Seiten teilen

Du kannst das ganze Statement doch in ein Textfile legen und dann das textfile in sqlplus mit @c:\...pfad\dateiname.txt aufrufen!?

Der logminer besteht aus ein paar dbms-Packeten. Wenn du den Oracle-Managemt-Server einsetzt ist das ganze recht komfortabel in der gui zu bedienen. Das ist das was ich empfehlen kann.

Wenn man keinen OMS einsetzt kann man den Logminer auch verwenden, ist aber etwas umständlicher... Hier eine Anleitung dazu:

rem vorher die Punkte 1) und 2) ausführen

rem 1) initD60.ora-Parameter setzen:

rem ---------------------------------------------------

rem utl_file_dir=/verzeichnis/unterverzeichnis

rem Achtung: - Hier kann man nicht $HOME verwenden!

rem - Oracle muss Rechte auf das Verzeichnis log besitzen.

rem startup

rem 2) Dictionary-Datei erzeugen

rem ---------------------------------------------------

rem execute sys.DBMS_LOGMNR_D.BUILD('d_logmnr.dict', '/verzeichnis/unterverzeichnis');

rem Achtung: - Als internal bzw. sys arbeiten oder als system mit Aufruf SYS.DBMS_...

rem - Das Verzeichnis in DBMS_LOGMNR_D.BUILD('datei', 'verzeichnis') muss

rem bereits vorhanden und dasselbe sein wie in dem Parameter utl_file_dir.

rem - Auch hier darf nicht $HOME stehen.

rem Aufruf: sqlplus -s internal @logmnr.sql

rem ====================================================

rem ----------------------------------------------------

rem Log-Dateien aufnehmen:

execute sys.DBMS_LOGMNR.ADD_LOGFILE('/verzeichnis/log1a.rdo',DBMS_LOGMNR.NEW);

execute sys.DBMS_LOGMNR.ADD_LOGFILE('/verzeichnis/log2a.rdo',DBMS_LOGMNR.ADDFILE);

rem ----------------------------------------------------

rem LogMiner-Session starten

execute sys.DBMS_LOGMNR.START_LOGMNR(dictfilename=>'/verzeichnis/d_logmnr.dict');

rem ----------------------------------------------------

rem Inhalt selektieren:

SELECT timestamp, username, sql_redo, sql_undo

FROM v$logmnr_contents

WHERE seg_name = 'DEPT';

rem ----------------------------------------------------

rem LogMiner-Session beenden

execute sys.DBMS_LOGMNR.END_LOGMNR;

exit

Schöne Grüße mme

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...