Protokolliert referenzielle Integrität beim Downloadvorgang
Name | Wert | Beschreibung |
---|---|---|
publication_n (in) |
Publikation |
Nicht mehr empfohlen. Verwenden Sie stattdessen subscription_n. Die synchronisierten Publikationen, wobei n eine Ganzzahl ist. Es gibt einen publication_n-Eintrag für jede synchronisierte Publikation. Die Nummerierung von n beginnt bei Null. |
MobiLink user (in) |
MobiLink-Benutzername |
Der MobiLink-Benutzer, für den Sie synchronisieren |
foreign key table (in) |
Tabellenname |
Die Tabelle, die die Fremdspalte enthält, für die der Hook aufgerufen wird |
primary key table (in) |
Tabellenname |
Die Tabelle, die vom Fremdschlüssel referenziert wird, für den der Hook aufgerufen wurde |
role name (in) |
Rollenname |
Der Rollenname des Fremdschlüssels, für den der Hook aufgerufen wird |
script version (in) |
Skriptversionsname |
Die MobiLink-Skriptversion, die für die Synchronisation verwendet werden soll |
subscription_n (in) | Subskriptionsname(n) | Die synchronisierten Subskriptionen, wobei n eine Ganzzahl ist. Dies ist ein subscription_n-Eintrag für jede synchronisierte Subskription. Die Nummerierung von n beginnt bei Null. |
Eine Download-RI-Verletzung tritt ein, wenn Zeilen im Download die Fremdschlüsselbeziehungen in der entfernten Datenbank verletzen. Diese Hooks gestatten es Ihnen, auftretende RI-Verletzungen zu protokollieren, sodass Sie ihre Ursache später untersuchen können.
Nachdem der Download abgeschlossen ist, aber noch vor dem Festschreiben, prüft dbmlsync auf RI-Verletzungen. Wenn eine Verletzung gefunden wird, identifiziert das Dienstprogramm einen Fremdschlüssel, der eine RI-Verletzung enthält, und ruft sp_hook_dbmlsync_download_log_ri_violation auf (sofern implementiert). Danach ruft es sp_hook_dbmlsync_download_ri_violation auf (sofern implementiert). Wenn der Konflikt weiterhin besteht, löscht dbmlsync die Zeile, die die Fremdschlüssel-Integrität verletzt. Dieser Prozess wird für die restlichen Fremdschlüssel wiederholt, bei denen RI-Verletzungen vorkommen.
Dieser Hook wird nur aufgerufen, wenn RI-Verletzungen für Tabellen vorkommen, die derzeit synchronisiert werden. Wenn RI-Verletzungen für Tabellen vorhanden sind, die nicht synchronisiert werden, wird dieser Hook nicht aufgerufen, und die Synchronisation schlägt fehl.
Dieser Hook wird über eine andere als die von dbmlsync für den Download verwendete Verbindung aufgerufen. Die vom Hook verwendete Verbindung hat die Isolationsstufe 0, sodass der Hook die Zeilen sehen kann, die vom Download übernommen wurden und noch nicht festgeschrieben sind. Die Aktionen des Hooks werden sofort nach seiner Ausführung festgeschrieben, sodass die durchgeführten Änderungen beibehalten werden, und zwar unabhängig davon, ob der Download festgeschrieben oder zurückgesetzt wird.
Da dieser Hook in einer eigenen Verbindung ausgeführt wird, sollten Sie beim Zugriff auf Tabellen vorsichtig sein, die in Ihrer Hook-Prozedur synchronisiert werden, denn diese Tabellen werden von dbmlsync möglicherweise gesperrt. Diese Sperren können zum Fehlschlagen von Vorgängen im Hook oder zu unbegrenzten Wartezeiten führen.
Versuchen Sie nicht, diesen Hook zu verwenden, um RI-Verletzungen aufzulösen. Er darf ausschließlich für die Protokollierung verwendet werden. Für die Behebung von RI-Verletzungen steht sp_hook_dbmlsync_download_ri_violation zur Verfügung.
Nehmen wir an, Sie verwenden die folgende Tabelle, um Verletzungen der referenziellen Integrität zu protokollieren.
CREATE TABLE DBA.LogRIViolationTable ( entry_time TIMESTAMP, pk_table VARCHAR( 255 ), fk_table VARCHAR( 255 ), role_name VARCHAR( 255 ) ); |
Das folgende Beispiel protokolliert den Fremdschlüssel-Tabellennamen, den Primärschlüssel-Tabellennamen und den Rollennamen, wenn in der entfernten Datenbank eine Verletzung der referenziellen Integrität entdeckt wird. Die Informationen werden in der LogRIViolationTable-Tabelle in der entfernten Datenbank gespeichert.
CREATE PROCEDURE sp_hook_dbmlsync_download_log_ri_violation() BEGIN INSERT INTO DBA.LogRIViolationTable VALUES( CURRENT_TIMESTAMP, (SELECT value FROM #hook_dict WHERE name = 'Primary key table'), (SELECT value FROM #hook_dict WHERE name = 'Foreign key table'), (SELECT value FROM #hook_dict WHERE name = 'Role name' ) ); END; |
![]() |
Kommentieren Sie diese Seite in DocCommentXchange.
|
Copyright © 2010, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.0 |