Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Oracle8 Update-Trigger Problem weil Trigger-Noob

Empfohlene Antworten

Veröffentlicht

Hey Leute,

bin dran mir einen Update-Trigger zu basteln (wer nicht weiß was ich meine, dass ist wie das "ON DELETE CASCADE" -> Löschweitergabe, nur eben zum Aktualisieren statt Löschen).

Mein Versuch sieht folgendermaßen aus:


CREATE OR REPLACE TRIGGER "HACOS"."TRIG2" AFTER

UPDATE OF "WERT" ON "HACOS"."T_ZEILE" FOR EACH ROW

BEGIN

  UPDATE hacos.t_zeile_memo set pos = :hacos.t_zeile.wert;

END;

Nach verzweifelten Versuchen in SQLPLUS habe ichs dann mittels OEM probiert und dabei ist mir noch folgende Fehlermeldung übriggeblieben:

PLS-00049: Ungültige Bindevariable 'HACOS.T_ZEILE'

Wie gehört der Trigger richtig?

Ich danke euch.

lg

Stefan

du willst doch einen Wert setzen den du aus einer Bindevariable holst...

Was du machst ist folgendes, du sagst der DB sie soll in im Schema hacos in der tabelle t_zeile den Inhalt der Spalte wert hohlen. Das ist keine Bindvariable sondern eine Spalte. Den Inhalt dieser Spalte kann er aber nicht zuweisen, weil er nicht weiß welche row du aus dieser Tabelle haben willst. Er merkt nicht das du meinst das er die Zeile nehmen soll wo er ja sowieso gerade ändert.

Lösung: Bei jedem Update werden die alten werte in die Bindvariablen old.spaltenname und die neuen Werte in die Bindvariable new.spaltenname geschrieben. Also holst du dir das einfach aus dieser Bindvariable....

UPDATE hacos.t_zeile_memo set pos = :new.wert;

Achtung das geht natürlich nur bei rowtriggern nicht bei statementtriggern, da bei statementtriggern mehrere Zeilen geändert werden könnten und er dann nicht weiß denn Wert welcher Zeile er nehmen soll.

Grüße mme

Okay, ich hab mal deine Zeile eingefügt, aber ich bekomme immer noch

PLS-00049: Ungültige Bindevariable 'NEW.WERT'

Zusatzfragen:

- Wie und wo definiere ich, ob es ein Statement- oder ein Rowtrigger ist?

- Hast du zufällig nen Link zu ner guten Inet-Seite zu dem Thema für mich?

Ich danke dir :)

du hast einen zeilen trigger das definiert man über "for each row" wenn du das weglässt hast du automatisch einen statementtrigger...

wegen der anderen sachen gucke ich nochmal...

Alles klar :) dankeschön...ich habe den Trigger jetzt funktionstüchtig hinbekommen :rolleyes:


CREATE OR REPLACE TRIGGER HACOS.TRIG2 AFTER

UPDATE OF WERT ON HACOS.T_ZEILE FOR EACH ROW

BEGIN

  UPDATE hacos.t_zeile_memo set pos = :new.wert where pos=:old.wert and pronr1=:old.pronr1;

END;

Erm, noch etwas *g*

Nun wollte ich vom Access-Frontend aus auf die Tabelle "hacos.t_zeile" ein Update (auf einen Primary Key :rolleyes: ) machen, welcher natürlich wieder eindeutig wäre. Das Update auf diese Tabelle sollte mittels des Triggers den Primary Key der Tabelle "hacos.t_zeile_memo" ebenfalls updaten. Nun bekomme ich logischerweise folgenden Fehler im Access-FrontEnd:

Dieser Datensatz wurde seit Beginn der Verarbeitung von einem anderen Benutzer geändert...

Meine Fragen:

1) Ist es überhaupt möglich auf diese Weise derartige Daten zu aktualisieren

2) Kann ich das Problem in Oracle lösen oder muss ich im FrontEnd etwas verändern?

lg

Stefan

EDIT: Zum besseren Verständnis, hier die Datenstruktur:

Tabelle "hacos.t_zeile"

Feld Constraint

---------------------------

pronr1 PK

wert PK

...diverse weiter efelder ohne constraint...

Tabelle "hacos.t_zeile_memo"

Feld Constraint

---------------------------

pronr1 PK sowie FK auf t_zeile.pronr1 mit on delete cascade

pos PK sowie FK auf t_zeile.wert mit on delete cascade

o_memo

u_memo

Das ganze hat sich erledigt :) dankeschön.

Ich musste die Fk's entfernen und die Löschweitergabe mit einem Trigger lösen.

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.