Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi FireDAC NO_SQL_DATA error (https://www.delphipraxis.net/208083-firedac-no_sql_data-error.html)

haentschman 7. Jun 2021 13:18

Datenbank: MSSQL • Version: 2017 • Zugriff über: FireDAC

FireDAC NO_SQL_DATA error
 
Liste der Anhänge anzeigen (Anzahl: 2)
Hallöle...:?

Ich scheitere mal wieder and den einfachsten Sachen. :?

Projekt Datatabase Events:
1. Trigger erstellt
Code:
create table _Events
(
  ID int IDENTITY(1,1) NOT NULL,
  EventType int NOT NULL,
  EventName nvarchar(30) NOT NULL,
  EventCurrentGUID uniqueidentifier NOT NULL,
  CONSTRAINT Events_pk PRIMARY KEY CLUSTERED (ID ASC)
)
create index ixEventType on _Events (EventType)
GO

/* Events */
insert into _Events (EventType, EventName, EventCurrentGUID) values (0, 'Complete', NEWID())
GO

/* Trigger*/
create trigger TR_Complete on Complete for insert, update, delete as
begin
  update _Events set EventCurrentGUID = NEWID() where EventType = 0
end
GO
2. Trigger getestet - Fehlerfrei -> mit jedem Aufruf eine neue GUID


Problem:
1. Tabellen Änderung (Tabelle XY) über externen Editor (DBeaver) -> Event wird ausgeführt...ohne Fehler 8-)
2. Anwendung mit FireDAC:
- :shock: Jedes Post der Tabelle XY über Query resultiert im Fehler! (Bild 1)
- Fortsetzen -> Fehler (Bild 2)

Was ich probiert habe:

-> Trigger aus der Tabelle XY raus -> kein Fehler mehr! :evil:
-> Beide Tabellen XY und _Events haben einen Primary Key! :roll:

Jetzt ist mein Latein am Ende...ich hoffe auf eine Erklärung. :wink:

PS: Die Tante ist nicht wirklich gesprächig. :?
z.B.: https://stackoverflow.com/questions/...-delphi-10-3-1
...das sieht nicht nach der Problelösung aus, sondern am Herumdoktern an den Symthomen. :?

Danke...

Nachtrag:
Morgen werde ich das mal probieren:
https://stackoverflow.com/questions/...ith-nocount-on
Update in SP verlagern und NOCOUNT_OFF
...schaun wir mal. :roll:

Update:
SET NOCOUNT ON im Trigger scheint es gebracht zu haben. Keine Meldung mehr. Jetzt muß ich noch testen ob das für jeden Trigger gilt oder global. Alternativ SP.

jobo 7. Jun 2021 20:19

AW: FireDAC NO_SQL_DATA error
 
Du hast es ja schon im Griff, also nur mal so aus der Ferne ein Gedanke:
Wenn man Trigger macht, die auf Updates einer Tabelle reagieren und als (re)Aktion im Trigger ein Update auf die gleiche Tabelle macht, ist das nicht endlose Rekursion?

Also käme in Betracht, den Trigger nur bei Insert zu zünden, das Update, das daraus resultiert, bliebe folgenlos (aus Sicht des Triggers)
Gilt es aber auch für Updates zu feueren, dann vielleicht etwas selektiver, über Vergleiche von old und new Values der Felder, explizit ausgenommen die GUID, die ja offenbar das Ergebnis der Aktion sein soll und nicht der Treiber.

Dann gibt es gefühlt auch noch irgendwelche Optionen im Bereich Transaktionen, vor allem Client regulierte Transaktionen. Wenn das Heilmittel oder Rezept eine (gekapselte) SP ist, bringt das u.a. eine per Definition abgeschlossene Transaktion, wo niemand reinfuscht- und wo dann auch das rekursive Trigger Problem nicht auftritt.

P.S.: Der Trigger geht gar nicht auf _Event, sondern auf Complete. Also Blödsinn, was ich geschrieben habe

jobo 7. Jun 2021 20:34

AW: FireDAC NO_SQL_DATA error
 
Ich hab mal Erkenntnis und Sachlage ignoriert und ein falsches Script laufen lassen. Interessante Ergebnisse im unteren Drittel.

https://dbfiddle.uk/?rdbms=sqlserver...a513df2b756bda

haentschman 8. Jun 2021 07:27

AW: FireDAC NO_SQL_DATA error
 
Moin...8-)
Zitat:

Wenn man Trigger macht, die auf Updates einer Tabelle reagieren und als (re)Aktion im Trigger ein Update auf die gleiche Tabelle macht, ist das nicht endlose Rekursion?
Der Trigger ist in Table Complete vorhanden und aktualisiert ausschließlich Table _Events :zwinker:
Code:
create table _Events
(
  ID int IDENTITY(1,1) NOT NULL,
  EventType int NOT NULL,
  EventName nvarchar(30) NOT NULL,
  EventCurrentGUID uniqueidentifier NOT NULL,
  CONSTRAINT Events_pk PRIMARY KEY CLUSTERED (ID ASC)
)
create index ixEventType on _Events (EventType)
GO

/* Events */
insert into _Events (EventType, EventName, EventCurrentGUID) values (0, 'Complete', NEWID())
GO

/* Trigger*/
create trigger TR_Complete on Complete for insert, update, delete as
begin
  update _Events set EventCurrentGUID = NEWID() where EventType = 0
end
GO
Zitat:

Interessante Ergebnisse im unteren Drittel
..was meinst du? :gruebel: Der doppelte EventType? Der ist immer eindeutig. Da aber alle Events manuell von mir manuell eingetragen werden, habe ich auf eine Prüfung verzichtet.


UPDATE:
1. SP erstellt
Code:
create procedure SP_EventsUpdate @EventType int
as
begin
  set NOCOUNT ON;
  update _Events set EventCurrentGUID = NEWID() where EventType = @EventType
end
GO
2. Trigger auf SP umgestellt
Code:
create trigger TR_Complete on Complete for insert, update, delete as
begin
  exec SP_EventsUpdate @EventType = 0
end
GO
PS: Das NOCOUNT ON im Trigger galt nur für diesen. Alle Anderen haben den Fehler geschmissen. :wink: Da war eine SP besser...

jobo 8. Jun 2021 18:00

AW: FireDAC NO_SQL_DATA error
 
Zitat:

Zitat von haentschman (Beitrag 1490829)
Moin...8-)
Zitat:

Interessante Ergebnisse im unteren Drittel
..was meinst du?

Egal, nur ein bisschen rumgespielt und auch nicht die richtigen Dinge zur Hand.
Ich hatte ja zunächst übersehen, dass 2 verschiedene Tabellen im Spiel sind. Hab ich ja auch geschrieben. Aber ich hab weiter gespielt. Die 2. Tabelle hast Du nicht veröffentlicht und ich habe Deinen Code etwas verdreht (eben nur mit einer Tabelle) laufen lassen. Im Link sieht man beim 2. Insert, dass das Einfügen von nur 1 Datensatz relativ viele Rows betrifft (rows affected). Mehr, als man erwarten würde?

Ich nehme an, der Fehler (SQL_NO_DATA) soll eigentlich ein Schutzmechnismus sein, den NOCOUNT ON abschaltet.

haentschman 9. Jun 2021 05:42

AW: FireDAC NO_SQL_DATA error
 
Moin...8-)
Zitat:

Mehr, als man erwarten würde?
Ja, aber bedingt duch den EventType, der in deinem Beispiel immer 0 ist.

Ich echt ist es immer nur ein Datensatz. :zwinker:
Delphi-Quellcode:
/* Events statisch manuell */
insert into _Events (EventType, EventName, EventCurrentGUID, EventActive) values (1, 'Part', NEWID(), 1)
insert into _Events (EventType, EventName, EventCurrentGUID, EventActive) values (2, 'PartDefault', NEWID(), 1)
insert into _Events (EventType, EventName, EventCurrentGUID, EventActive) values (3, 'Address', NEWID(), 1)
insert into _Events (EventType, EventName, EventCurrentGUID, EventActive) values (4, 'AddressType', NEWID(), 1)
insert into _Events (EventType, EventName, EventCurrentGUID, EventActive) values (5, 'Empoyee', NEWID(), 1)
insert into _Events (EventType, EventName, EventCurrentGUID, EventActive) values (6, 'EmpoyeeGroup', NEWID(), 1)
insert into _Events (EventType, EventName, EventCurrentGUID, EventActive) values (7, 'EmpoyeeQualificationType', NEWID(), 1)
insert into _Events (EventType, EventName, EventCurrentGUID, EventActive) values (8, 'EmpoyeeType', NEWID(), 1)


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:53 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