23. Februar 2015 00:58
		
			
			Dieses Thema soll als Sammelthema dienen, um die Veränderungen für die Verwaltung von Datenbankschemaänderungen in der Client-Server-Kommunikation u.a. stichpunktartig strukturiert zusammenzufassen, denn übersichtlicher ist es ja nicht geworden 

.
Schemaänderung bedeutet Veränderungen an einer Tabellenstruktur (Felder, Schlüssel), entweder manuell oder durch Tabellenimport.
Bitte Hinweise, Ergänzungen, Korrekturen dazuschreiben, ich baue die dann, wenn machbar, in die Stichpunkte ein.
Versionen bis NAV 2009 CC- C/SIDE-Schemaänderung 
-    Kompilieren Kompilieren
-   NAV-Server NAV-Server
-   Schemaänderung Servertabellen (SQL, Native) (Mögliche Konflikte: Daten im gelöschten Feld, Feldlänge, Feldtypänderungen, Schlüsselverletzungen usw.) Schemaänderung Servertabellen (SQL, Native) (Mögliche Konflikte: Daten im gelöschten Feld, Feldlänge, Feldtypänderungen, Schlüsselverletzungen usw.)
NAV 2009 RTC - NAV 2013Ab NAV 2009 RTC wird zur  Laufzeit nicht mehr der C/AL-Code vom Client, sondern der beim Kompilieren erzeugte C#-Code in den Objektmetadaten bzw. DLLs ausgeführt, der sich im Servercache befindet.- C/SIDE-Schemaänderung  
-   Kompilieren Kompilieren
-   Object Change Listener Object Change Listener
-   Änderung Tabelle Object Metadata Änderung Tabelle Object Metadata
-   Update NAV-Servercache mit geänderten C#-Objekt-Metadaten Update NAV-Servercache mit geänderten C#-Objekt-Metadaten
-   SQL-Broker Service oder Polling via Tabelle "Object Tracking" (wird aktualisiert durch Löschen, Ändern und Einfügen in der "Object Metadata"-Tabelle) SQL-Broker Service oder Polling via Tabelle "Object Tracking" (wird aktualisiert durch Löschen, Ändern und Einfügen in der "Object Metadata"-Tabelle)
-   Schemaänderung SQL-Servertabellen Schemaänderung SQL-Servertabellen
Bei Fehlern kommen u.a. Meldungen: 
The Object Metadata does not exist. Bei normalen Tabellen diese erneut kompilieren, bei Systemtabellen siehe 
hier. 
Ab NAV 2013 verfügbare Stapelverarbeitung für Erstellung der C#-Objekt-Metadaten: 
Serveranwendungsobjekte erstellenIn beiden Versionen ist das Kompilieren von Tabellen inklusive der vollständigen Konfliktprüfung auch dann noch möglich, wenn 
kein laufender Datenbankdienst vorhanden ist. Diese Möglichkeit besteht ab den Folgeversionen 
nicht mehr.
NAV 2013 R2 Auch im Single-Tenant-Betrieb ist die grundsätzliche Technologie für die Verwaltung von Multi-Tenancy-Datenbanken ab NAV 2013 R2 immer aktiv, da Microsoft hier nicht zweigleisig weiterentwickeln wollte.  Das bedeutet, dass die ab dieser Version hinzukommenden Synchronisierungsprozesse beachtet werden müssen. Diese erfordern u.a. 
auch, 
dass der Netzwerkdienst ab dieser Version als "db_owner"  definiert ist.
Nur in dieser Version befindet sich ein Schalter unter Optionen: 
"Datenverlust durch Tabellenveränderungen verhindern" Bei = 
Ja (Vorgabe):
- C/SIDE Schemaänderung  
-   Kompilieren Kompilieren
-   Object Change Listener Object Change Listener
-   Neu: Erst Anfrage beim SQL-Server ob Änderung möglich, d.h. ab dieser Version verwaltet der Server und nicht mehr C/SIDE den C/AL-Code. Wenn möglich, dann: Neu: Erst Anfrage beim SQL-Server ob Änderung möglich, d.h. ab dieser Version verwaltet der Server und nicht mehr C/SIDE den C/AL-Code. Wenn möglich, dann:
-   Neu: Vergleich Tabelle Object Metadata mit Object Metadata Snapshot. Wenn Hash-Feld abweichend: Neu: Vergleich Tabelle Object Metadata mit Object Metadata Snapshot. Wenn Hash-Feld abweichend:
-   Update NAV-Servercache mit geänderten C#-Objekt-Metadaten Update NAV-Servercache mit geänderten C#-Objekt-Metadaten
-   SQL-Broker Service oder Polling via Tabelle Object Tracking SQL-Broker Service oder Polling via Tabelle Object Tracking
-   Neu: Die Synchronisation der Schemas erfolgt dabei durch 2 mögliche Methoden bei Single-Tenancy, 3 bei Multi-Tenancy. In C/SIDE kann die  Synchronisation in dieser Version noch nicht gestartet werden. Neu: Die Synchronisation der Schemas erfolgt dabei durch 2 mögliche Methoden bei Single-Tenancy, 3 bei Multi-Tenancy. In C/SIDE kann die  Synchronisation in dieser Version noch nicht gestartet werden.
 - 1. PowerShell Sync-NAVTenant (sicheres Verfahren, wenn Timeout ausreichend groß, ggf. Tabellen in mehrere Importpakete aufteilen) 
- 2. Clientstart oder jegliche Aktionen in laufenden Clients (unsicheres Verfahren, besonders bei größeren Änderungen)
- 3. Mounten eines neuen Tenant im Multi-Tenancy-Betrieb
 
-   Schemaänderung SQL-Servertabellen. Schemaänderung SQL-Servertabellen.
Bei 
("Datenverlust durch Tabellenveränderungen verhindern" = Nein) 

 nur für Entwicklungs-/Testdatenbanken, nie in Echtsystemen anwenden 

 .Mögliche Ursachen für Datenverlust siehe bei NAV 2015 unter "Destruktive Änderungen":
- C/SIDE Schemaänderung  
-   Kompilieren Kompilieren
-   Object Change Listener Object Change Listener
-   Änderung Objekt-Metadaten (forciert, d.h. auch Änderungen, die zum Datenverlust führen würden, werden im Gegensatz zu NAV 2013/NAV 2009 angenommen. Da der Server ab dieser Version durch den neuen Schalter entkoppelt ist, wird das hier nicht geprüft. Bei vorhandener laufender Serverinstanz wird das Schema zum SQL-Server unmittelbar durchgedrückt. Das bedeutet bei destruktiven Änderungen sofortigen Datenverlust Änderung Objekt-Metadaten (forciert, d.h. auch Änderungen, die zum Datenverlust führen würden, werden im Gegensatz zu NAV 2013/NAV 2009 angenommen. Da der Server ab dieser Version durch den neuen Schalter entkoppelt ist, wird das hier nicht geprüft. Bei vorhandener laufender Serverinstanz wird das Schema zum SQL-Server unmittelbar durchgedrückt. Das bedeutet bei destruktiven Änderungen sofortigen Datenverlust ) )
-   Keine Schemaänderung bei fehlender Serverinstanz-> Windows-/Webclientstart nicht möglich wegen asynchroner Object Metadata - SQL-Tabellenschemas , Sync-NAVtenant  erforderlich Keine Schemaänderung bei fehlender Serverinstanz-> Windows-/Webclientstart nicht möglich wegen asynchroner Object Metadata - SQL-Tabellenschemas , Sync-NAVtenant  erforderlich
Ab NAV 2015In NAV 2015 wurde das Konzept, wie die Synchronisation verwaltet wird, umgearbeitet. 
Neu: Die Synchronisation wird jetzt durch Aktivitäten in C/SIDE ausgelöst und kann vorübergehend zeitlich verschoben werden.Aktivitäten sind
- 1. Arbeiten mit Schemaänderungen an einzelnen Tabellen
 - entweder kompiliertes Speichern oder 
- importieren von kompilierten Tabellen als Fob
 
- 2. Manuelles Synchronisieren aller Tabellen (Extras>Schema für alle Tabellen synchr.)
- 3. Upgradeprozesse (hierfür sind neue Codeunittypen nutzbar)
Hierbei werden bei jedem Speichern einer Tabelle oder jedem Fob-Importpaket mit Tabellen 3 Optionen angeboten:
- 1. Now - with validation   sofortige Synchronisation mit Konfliktprüfung, d.h. wenn ohne Datenverlust möglich sofortige Synchronisation mit Konfliktprüfung, d.h. wenn ohne Datenverlust möglich
- 2. Later   Später, also vorerst keine Synchronisation und auch keine Konfliktprüfung Später, also vorerst keine Synchronisation und auch keine Konfliktprüfung
- 3. Force   Erzwungene sofortige Synchronisation ohne Konfliktprüfung: Alle Konflikte werden ignoriert und das C/SIDE- Schema als SQL-Schema ohne Rücksicht auf Verluste durchgedrückt Erzwungene sofortige Synchronisation ohne Konfliktprüfung: Alle Konflikte werden ignoriert und das C/SIDE- Schema als SQL-Schema ohne Rücksicht auf Verluste durchgedrückt
Optionen 1 und 3 erfordern dabei einen laufenden Dienst (Serverinstanz) für die Datenbank, Option 2 dagegen nicht.
SaveTable.png
ImportFob.png
Nach dem Import mit Option 1 erscheint diese Meldung, dort kann man die Synchronisation bei Bedarf noch unterbinden, falls diese dann doch erst später durchgeführt werden soll, bei Datenbanken mit hohem Aufkommen an Schemaänderungen, ggf. noch kombiniert mit hoher Mandanten- und/oder Tenantanzahl kann diese auch Stunden dauern. Ansonsten muss diese hier bestätigt werden. In einer Cronusdatenbank mit Feldänderungen im üblichen Rahmen dauert es meist nur ein paar Sekunden 

 .
MeldungnachImportmitValidation.png
Beispiel 1: Anlegen eines neuen Feldes 50000 "Test" in C/SIDE, (kompiliert) speichern mit "Later", Änderung wird 
nicht mit SQL-Schema synchronisiert, Feld ist am SQL-Server 
nicht vorhanden:
TestfeldSyncLater.png
Testfeld1.png
Beispiel 2: Anlegen wie oben, aber (kompiliert) speichern mit "Now-with validation", Änderung wird mit SQL-Schema synchronisiert und das Feld ist dort sichtbar (unten angehängt), dieses wird dort multipliziert mit der Anzahl der Mandanten durchgeführt.
Testfeld2.png
Unverändert nutzbar sind die PowerShell-Verfahren mit 
Sync-NAVTenant und Mounten eines neuen Tenant im Multi-Tenancy-Betrieb. Sync-NAVTenant hat ab dieser Version einen Mode-Schalter ( 
ForceSync (nicht mit dem ebenfalls verfügbaren 
-Force Parameter verwechseln, der die Abfrage unterbindet), 
Sync, 
CheckOnly) mit dem eingestellt wird, ob ggf. mit Datenverlust (-ForceSync) oder ohne synchronisiert (Sync) wird. Falls der nicht gesetzt wird, ist der Vorgabewert 'Sync'. 
Es besteht also ab NAV 2015 mit "Later" die Möglichkeit, die Schemaänderungen in C/SIDE optional vorübergehend von den Schemaänderungen im SQL-Server zu entkoppeln und die Synchronisation zu einem späteren Zeitpunkt gezielt entweder manuell aus C/SIDE…
SchemaFürAlleTabellen.png
SyncAllTables.png
SyncAllTables2.png
…oder weiterhin via PowerShell durchzuführen, das geht entweder mit GUI-Unterstützung im PowerShell ISE…
SyncNavTenant.jpg
SyncNavTenant2.jpg
SyncNavTenant3.jpg
SyncAll3.png
Importieren der Administration Tools im ISE (für NAV 2013 R2 
\71\ statt 
\80\ im Pfad) 
Out-null unterdrückt dabei die Ausgabe der Cmdletliste (die hat man im ISE rechts im Befehlsfenster zur Verfügung) 
- Code:
- Import-Module C:\Programme\"Microsoft Dynamics NAV"\80\Service\NavAdminTool.ps1 -force | out-null
…oder rein zeichenbasiert in der Administration- bzw. Developer Shell (wenn man bei letzterer die Admintools mit dazu importiert).
SyncNavTenant4.jpg
SyncNavTenant5.jpg
Der Schalter "Datenverlust durch Tabellenveränderungen verhindern" der in NAV 2013 R2 unter 
Optionen vorhanden ist, wurde wieder entfernt.
Ablauf in NAV 2015:
- C/SIDE Schemaänderung  
-   Kompilieren Kompilieren
-   Neu: Abfrage, wann und wie die Schemasynchronisation stattfinden soll (1. Now- with validation, 2. Later, 3. Force). Bei "Now - with validation": Neu: Abfrage, wann und wie die Schemasynchronisation stattfinden soll (1. Now- with validation, 2. Later, 3. Force). Bei "Now - with validation":
-   Object Change Listener Object Change Listener
-   Anfrage beim SQL-Server ob Änderung möglich (Server verwaltet den C/AL-Code für C/SIDE wegen der Multi-Tenancy-Erfordernisse). Wenn möglich, dann: Anfrage beim SQL-Server ob Änderung möglich (Server verwaltet den C/AL-Code für C/SIDE wegen der Multi-Tenancy-Erfordernisse). Wenn möglich, dann:
-   Vergleich Tabelle Object Metadata mit Object Metadata Snapshot. Wenn Hash-Feld abweichend: Vergleich Tabelle Object Metadata mit Object Metadata Snapshot. Wenn Hash-Feld abweichend:
-   Update NAV-Servercache mit geänderten C#-Objekt-Metadaten Update NAV-Servercache mit geänderten C#-Objekt-Metadaten
-   SQL-Broker Service oder Polling via Tabelle Object Tracking SQL-Broker Service oder Polling via Tabelle Object Tracking
-   Schemaänderung SQL-Servertabellen. Schemaänderung SQL-Servertabellen.
Destruktive Änderungen, die bei der Option "ForceSync" zum Datenverlust führen können (bzw. in NAV 2013 R2 bei "Datenverlust durch Tabellenveränderungen verhindern" = Nein)- Löschen einer Tabelle
- Löschen eines Feldes
- Änderung am Feld "Data Type" (auch bei Wechsel Code <-> Text, Integer <-> BigInteger  ) )
- Änderung am Feld "Class" (Normal, FlowField, Flowfilter)
- Änderung am Feld "SQL data type"
- Feldlängenverringerung
- Änderungen am Primärschlüssel (Entfernen von Feldern aus mehrfeldrigen Primärschlüsseln, die zu Eindeutigkeitsverletzungen führen)
- Neu: Änderung der Feld-ID  das ist bis NAV 2013 noch möglich das ist bis NAV 2013 noch möglich  
Durch den Windows-/Webclientstart wie noch in NAV 2013 R2 findet 
keine Synchronisation mehr statt. Falls eine der obigen Methoden zur Komplettsynchronisation nicht angewandt wurden, stürzt der NAV 2015-Client beim Start sofort ab (
Nachtrag April 2018: Der Absturz wird jetzt in den aktuellen Versionen abgefangen).
AbsturzClientBeimStart.png
Wenn man Glück hat, kommt im laufenden Client eine Fehlermeldung wie diese, wenn nicht, stürzt der Client ab.
MetadatenNichtsynchron.png
Stapelverarbeitung für C#-Objekt Metadaten 
Serveranwendungsobjekte erstellenLinks:
NAV 2009
About Object Metadata and why I can't see object changes in RTCObject Metadata update flow in Microsoft Dynamics NAV 2009NAV 2013
Table Synchronization Paradigm in Microsoft Dynamics NAV 2013 R2Synchronize Metadata pleaseNAV 2015
Synchronizing Table Schemas Upgrade CodeunitsNAV 2016
Synchronizing Table Schemas Upgrade Codeunits
			Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.