Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Tabelleninhalt differentiell in andere Tabelle schreiben

Frage Entwicklung Datenbanken

Mitglied: dondy

dondy (Level 1) - Jetzt verbinden

28.07.2010 um 12:00 Uhr, 6476 Aufrufe, 6 Kommentare

Hallo zusammen,

ich habe zwei Datenbanken (A und B) und möchte von DB A den Inhalt einer Tabelle regelmäßig in DB B kopieren.
Da sich die Tabelle in DB A regelmäßig ändert (es kommen Datensätze hinzu oder werden entfernt) möchte ich nur die neuen Datensätze in die Tabelle der DB B hinzufügen. Wenn Datensätze aus der DB A gelöscht werden sollen diese weiterhin in DB B erhalten bleiben.
Dies soll ca. alle 5 Minuten passieren.
Ich verwende eine SQL2005 Server mit Windows 2003.

Über die Assistenten im SQL-Server bekomme ich das nicht hin. Hat jemand eine Idee?

Mit freundlichen Grüßen
Mitglied: filippg
28.07.2010 um 21:00 Uhr
Hallo,

einen Primärschlüssel hast du ja sicher, sei der Spaltenname id, dann sollte:
INSERT INTO B SELECT * FROM A WHERE A.id NOT IN (SELECT B.id FROM B)
das gewünschte tun.
Zur IN-Klausel schreibt MS "Wenn eine IN-Klausel eine extrem hohe Anzahl von Werten (viele Tausende) enthält, können die Ressourcen überbeansprucht werden" http://msdn.microsoft.com/de-de/library/ms177682.aspx

Ist der primärschlüssel streng monoton steigend (also jeder neue größer als jeder vorherige), dann dürfte auch
INSERT INTO B SELECT * FROM A WHERE A.id > (SELECT MAX(B.id) FROM B)
funktionieren und wäre vermutlich performanter.

Gruß

Filipp
Bitte warten ..
Mitglied: dondy
29.07.2010 um 14:03 Uhr
Hallo Filipp,

vielen Dank für Deine Antwort.
Also einen PK gab es in der Tabelle bisher nicht, habe ich aber nachgeholt.
Leider klappt aber dein oben genanntes Beispiel bei mir nicht, weil ich ja über zwei Datenbankserver hinweg die Abfrage mache.
Nun habe ich mir einen Verbindungsserver gebastelt, der auch funktioniert. Jetzt bekomme ich aber die Abfrage nicht hin.
Folgende Abfrage habe ich erstellt:

INSERT INTO OPENQUERY(SERVER_B,'
SELECT * FROM VIEW a
WHERE a.ID NOT IN (Select * from OPENQUERY(SERVER_B,'SELECT ID FROM Tabelle_B'))')

Bei dieser Abfrage erhalte ich dann einen Syntaxfehler. Wo liegt dieser?
Oder ist es garnicht möglich OPENQUERY's miteinander zu verschachteln?
Bitte warten ..
Mitglied: filippg
29.07.2010 um 20:38 Uhr
Hallo,

hast du a) Zwei Datenbanken innerhalb einer MS SQL-Instanz oder b) zwei DBs in zwei unterschiedlichen MS SQL-Instanzen (meinetwegen auch auf unterschiedlichen physikalischen Servern)?

a) sollte ganz eifnach gehen: INSERT INTO dbB..B SELECT * FROM dbA..A WHERE dbA..A.id NOT IN (SELECT dbB..B.id FROM dbB..B)
sprich: DB-Name.. vor jede Tabelle voranstellen.

b) puh... Mir ist nicht klar, was das VIEW in deinem Statement soll. Aber ob man OPENQUERY jetzt schachteln darf... performant ist das sicher nicht. Was bestimmt funktioniert, wenngleich auch nicht performant, ist die Produktivtabelle erst auf Server B zu kopieren, und dann dort eingangs von mir genannten Query auszuführen.

Gruß

Filipp
Bitte warten ..
Mitglied: Biber
29.07.2010 um 21:09 Uhr
Moin dondy,

ich verstehe den Plan auch nicht ganz und möchte mal nachfragen.
Verstanden habe ich den Plan aus Datensicht -> nur die "neuen" Datensätze von Server A/TabelleA sollen alle 5 Minuten auch in TabelleB auf Server B eingefügt werden. Was auch immer fachlich dahinterstehen mag.

Nicht verstanden habe ich, wen oder was du du denn mit der 5minütlichen Abgleicherei beauftragen oder beschäftigen willst.
Den DB-Server A (am dem ja wohl auch eine produktive Datenerfassungs-Appz rödelt) ?
Den Nur-Lese-DB-Clone auf DB-Server ?
Oder macht das der "man in the middle", der Verbindungsserver?
Oder beide/alle drei?

Wäre es nicht sinnvoller, wenn sich finanziell keine ETL-Applikation rechnet, den CPU-und Netzwerkaufwand ein bisschen zu minimieren dadurch, dass
  • Server A per Trigger jeden neuen Datensatz in eine Tabelle auf seinem Server A (oder auf dem Verbindungsserver) INSERTed sofort wenn ein neuer Satz eingegeben wird (der KANN noch nicht da sein)
  • der Empfangsserver alle x Minuten alle diese Sätze liest, alle inserted und die Zwischentabelle C komplett löscht?

Grüße
Biber
Bitte warten ..
Mitglied: filippg
29.07.2010 um 21:30 Uhr
Hallo,

* Server A per Trigger jeden neuen Datensatz in eine Tabelle auf seinem Server A (oder auf dem Verbindungsserver) INSERTed sofort
wenn ein neuer Satz eingegeben wird (der KANN noch nicht da sein)
das ist natürlich der eleganteste Weg, das ist mir nicht eingefallen!
Allerdings sind die Trigger ein bisschen tückisch, insbesondere, wenn man sich nicht damit auskennt. Z.b. Auslösen des INSERT-Triggers auch bei UPDATE-Vorgängen; Trigger-Aufruf bedeutet nicht, dass genau _eine_ Zeile eingefügt wurde, Trigger kann zum Rollback der ganzen Transaktion führen...

Gruß

Filipp
Bitte warten ..
Mitglied: Biber
29.07.2010 um 22:18 Uhr
Moin filippg,

...sind die Trigger ein bisschen tückisch
Ja schon, ich hatte mal eine Desiree Trigger als Praktikantin, ich weiss es wirklich... und ihre Mutti erst!

Aber WTF kann bei einem Trigger schiefgehen, der einen drömeligen Satz als Kopie in eine DB-Tabelle schreibt, die nicht mal einen PK haben muss (keine Constraint-Verletzungen möglich)?

Und er braucht keinen DELETE- und keinen UPDATE-Trigger (außer die, die er vielleicht schon drin hat).

Die Alternative ist doch -verbessere mich, wenn ich irre-, dass irgendein anspruchsloser Prozess alle gatesverdammten 5 Minuten die komplette Datei zum Lesen sperren muss...
für die Dauer eines INTERSECT-JOINs (wie auch immer M$ den nennt).

Dabei geht die DB-Performance für alle Normal-Anwender runter... jeden Tag.. 365x im Jahr.

Wenn schon so eine Bypass-Schmuddellösung, dann wenigstens umwelt- und ressourcenschonend

Grüße
Biber

P.S. @dondy: Du hast übrigens ein sehr sympathisches Profilbildchen.
Bitte warten ..
Neuester Wissensbeitrag
Ähnliche Inhalte
Batch & Shell
gelöst 2 große TXT Dateien vergleichen und Unterschiede in andere Datei schreiben (6)

Frage von sid.pdm zum Thema Batch & Shell ...

VB for Applications
gelöst Schreiben in andere Excel-Datei macht Worksheet unsichtbar (5)

Frage von Albatros91 zum Thema VB for Applications ...

Batch & Shell
gelöst Loginzeiten aus dem Ereignisprotokoll in Excel schreiben (1)

Frage von l-Ne0n zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Windows Userverwaltung
Ausgeschiedene Mitarbeiter im Unternehmen - was tun mit den AD Konten? (33)

Frage von patz223 zum Thema Windows Userverwaltung ...

LAN, WAN, Wireless
FritzBox, zwei Server, verschiedene Netze (21)

Frage von DavidGl zum Thema LAN, WAN, Wireless ...

Viren und Trojaner
Aufgepasst: Neue Ransomware Goldeneye verbreitet sich rasant (20)

Link von Penny.Cilin zum Thema Viren und Trojaner ...

Windows Netzwerk
Windows 10 RDP geht nicht (18)

Frage von Fiasko zum Thema Windows Netzwerk ...