Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Eine VIEW updaten (https://www.delphipraxis.net/91514-eine-view-updaten.html)

DelphiManiac 6. Mai 2007 13:07

Datenbank: Firebird • Version: 2.0 • Zugriff über: ZEOS Lib

Eine VIEW updaten
 
Hallo,

ich habe zurzeit folgendes Problem, bei dem ihr mir hoffentlich helfen könnt:

Fange mal ganz simpel an :

2 Tabellen

1. Mandanten
mit ID, Anrede, Name Vorname,usw

2.Anrede
ID, Anrede

jetzt habe ich ein VIEW deklariert, dass mir einen JOIN über die Mandanten bildet, d.h. das mir die Verbindung von Anrede in Tabelle 1 mit der eigentlichen Anrede aus Tabelle 2 macht.


Das View sieht so aus:

SQL-Code:
CREATE VIEW ALLE_MANDANTEN(
    MANDANTEN_ID,
    ANREDE,
    NAME,
    VORNAME)
AS
select tblMandanten.mandanten_id, tblanrede.anrede, tblmandanten.name,tblmandanten.vorname from tblmandanten,tblanrede
where tblmandanten.anrede = tblanrede.anrede_id
;
Klappt auch alles, nur wie kann ich über diese virtuell gebildete Tabelle meine Daten ändern, oder neue hinzufügen.

Einen
SQL-Code:
Insert Into
verweigert meine DB und Delphi sagt:

---------------------------
Controllingsoft
---------------------------
SQL Error: cannot update read-only view ALLE_MANDANTEN. Error Code: -150. The object of the insert, delete or update statement is a view for which the requested operation is not permitted. The SQL: INSERT INTO alle_Mandanten (Mandanten_ID,Anrede,Name,Vorname) VALUES (?, ? , ?, ?);
---------------------------
OK
---------------------------

Wäre super wenn ihr mir sagen könntet wie ich verändernt auf ein View zugreifen kann (falls das überhaupt geht)??

Danke schonmal

Gruß
DelphiManiac

mkinzler 6. Mai 2007 13:14

Re: Eine VIEW updaten
 
Der View muß als updatable markiert sein(WITH CHECK OPTION)

DelphiManiac 6. Mai 2007 13:43

Re: Eine VIEW updaten
 
@mkinzler

Mein DB-Helfer :-)

Wo finde ich denn die Möglichkeit, das View updateble zu machen?

P.S.: für den DB-Config nutze ich das IB-Expert Frontend.

Danke

mkinzler 6. Mai 2007 13:46

Re: Eine VIEW updaten
 
http://www.ibexpert.info/de/documentation/%20%203.%20Datenbankobjekte/%20%202.%20Tabelle/%20%203.%20Tabelleneditor/%2013.%20Erzeuge%20View%20von%20Tabelle%20(Updatab le%20View)/114940.html

DelphiManiac 6. Mai 2007 13:56

Re: Eine VIEW updaten
 
Danke für den Link,

die Dokumentation beantwortet mit Sicherheit viele meiner Fragen :-)

Kannst du den Link noch reparieren?

Dort steht:
Zitat:

Der View basiert auf einer einzigen Tabelle oder einem anderen Updateable View. Aus verknüpften Tabellen resultiert immer ein Read-Only-View. (Gleiches gilt wenn ein Subquery in einem SELECT-Befehl verwendet wird.)
Ich habe ja eine verknüpfte Tabelle, heißt das dann, dass ich diese nicht verändern kann?

Gruß
DelphiManiac

TBx 6. Mai 2007 14:47

Re: Eine VIEW updaten
 
Liste der Anhänge anzeigen (Anzahl: 1)
Um einen View updateable zu machen, mußt Du Trigger auf diesem definieren.
Du benötigst die Trigger BeforeUpdate, BeforeInsert und BeforeDelete.
Ich hänge Dir mal ein Beispiel an. Erzeuge mit dem Script eine neue Datenbank und sieh es Dir an.

Ich hoffe, das hilft Dir weiter.

Gruß

Thomas

DelphiManiac 6. Mai 2007 14:54

Re: Eine VIEW updaten
 
@onlinkater

Danke dir, denke aufjeden Fall, das mir das weiterhilft,

ich gucke mir das nachher mal an.

Gruß und Danke Dir!

DelphiManiac

generic 6. Mai 2007 18:28

Re: Eine VIEW updaten
 
views die über mehrere tabellen lassen sich in den meisten systemen garnicht updaten.
da die datenbanken meist die schlüssel nicht setzen können.

hoika 7. Mai 2007 14:09

Re: Eine VIEW updaten
 
Hallo,

bei Firebird geht das aber über obengenannte Trigger.


Heiko

alzaimar 7. Mai 2007 14:38

Re: Eine VIEW updaten
 
[Anmerkung von einem IB-Laien]
Bei MSSL muss man in den Triggern (dort heißen sie 'INSTEAD OF') noch dafür sorgen, das als einzige Meldung ein '(<x> rows affected)' an den Client zurückgeschickt wird. In einem View-update macht man normalerweise mehrere Updates, die -wenn man nicht aufpasst- alle so eine Meldung liefern. ADO z.B. kommt dann gehörig durcheinander.

Ich schaue mir das Egebnis im Query-Analyzer (also eine SQL Konsole) an. Wenn die Update-View-Anweisung genau das gleiche Ergebnis wie eine 'Update Table' Anweisung liefert, dann macht ADO auch mit.
z.B.
Code:
Update MyView Set MyField = 'Foobar'
<Enter>
1 row(s) affected

Update MyTable Set MyField = 'Foobar'
<Enter>
1 row(s) affected
Und so gehts nicht:
Code:
Update MyView Set AnotherField = 'Foobar'
1 row(s) affected <--- z.B. von einem Update auf eine Detail-Tabelle

1 row(s) affected <--- z.B. von einem Update auf einer weiteren Tabelle
Ich denke mir mal, das die anderen Provider ähnliches voraussetzen

[/Anmerkung von einem IB-Laien]


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:40 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz