Hallo, Danke ich bins und Mister X für die Antworten!
Naja ich komme halt von PHP erst zu C, habe mir da auch alles selbst beigebracht.. also ich dachte nicht das es so ein Aufwand ist, stellte aber fest das so ein Netzwerkcode es ganzschön in sich hat. Das heißt solange man mit eigenen Funktionen arbeiten will braucht man ein richtiges, grundlegendes Verständnis davon. Soviel weiß ich nun schon.
Habe ein bisschen Abstand von dem Projekt genommen da das ein echtes Problem zu sein scheint. Ebenfalls bin ich erstmal weg von Visual Studio und habe mir mit CodeBlocks etwas einfacheres installiert.
Damit ich irgendwie erstmal lokal zur DB connecten kann, dafür brauche ich auch einen extra Thread den ich die Tage reinstellen möchte.
Gedanklich sieht es so aus. Nehmen wir an der Quellcode ist nicht zugänglich aber ein Cracker assembliert den Code. Das Passwort des Benutzers (selbstausgesucht, er hat sich vorher auf einer Seite registriert) gibt es in der MySQL Tabelle auf die ich zugreifen möchte (das wieder mit Passwort, eben dem MySQL Passwort), damit hier ein eindeutiger Eintrag gemacht werden kann. Es geht um das MySQL Passwort das nur dem Admin bekannt sein sollte (logisch).
Hi Leute,
ich hab ein Problem mit einer SQL-Abfrage für Access 2007. Ich hab eine Datenbank in der eine Tabelle BasicDate enthalten ist. Diese Tabelle hat eine Spalte EMail. In dieser Spalte sind E-Mail-Adressen eingegeben, die folgendes Schema besitzen: Vorname.Nachname@firmaxyz.de.
Nun möchte ich diese E-Mail-Adressen "case insensitive" machen, also alle Großbuchstaben automatisch zu kleinen verändern.
Des Weiteren sind aber ein paar E-Mail-Adressen die nicht diesem Schema folgen und KEIN @ enthalten! Diese E-Mail-Adressen sollen nicht verändert werden!
Ich hab mir nun diese Abfrage zusammengebastelt:
UPDATE BasicData SET BasicData.EMail = LCase([EMail]) WHERE (((BasicData.EMail)<>LCase([EMail]) And (BasicData.EMail) ALike "*@*"));
Leider funktioniert diese nicht und er ändert mir sage und schreibe 0 Datensätze von 2280!
Was ist an meiner Abfrage der Fehler? Wie oben erwähnt handelt es sich um Access SQL!
Könnt ihr mir helfen?
Edit: Wenn ich das And zu einem Or ändere, willer 2275 von 2280 Datensätze ändern...; das ist aber doch dann gegen jede Logik, oder?
Mit der Inline-Tabellenwertfunktion kann ich eine Tabelle zurückgeben wo ich nicht den Rumpf mit angeben muss, somit dynamisch sein kann.
Hö?
Die "Inline-Tabellenwertfunktion" ist einfach ein SELECT. Und ein direktes SELECT ist max. so "dynamisch" wie die Tabellen die es referenziert.
Aber darum geht's nichtmal.
Inline- und nicht-inline Table-Valued-Functions sind zwei ganz unterschiedliche Biester. Das eine (inline) ist nicht viel mehr als Textverarbeitung (wie z.B. auch eine View, so lange man nicht NOEXPAND verwendet). Bei "inline" wird die Information wie die resultierende Tabelle aussieht daher einfach aus dem SELECT Statement bezogen. Wie es eben auch laufen würde wenn man den Funktionsaufruf einfach mit dem Inhalt der Table-Valued-Function ersetzen würde.
Nicht-inline Table-Valued-Functions sind da ganz andere Biester, weswegen sie SQL Server auch ganz anders behandelt (anders behandeln muss). Den Aufruf einer nicht-inline Table-Valued-Function kannst du auch nicht einfach durch den Code der Funktion ersetzen. Dazu müsste man erstmal ne Table-Variable anlegen, den Code der Table-Valued-Function so anpassen dass das letzte SELECT da rein INSERTed, und dort wo ursprünglich die Funktion aufgerufen wurde dann ein SELECT auf die Table-Variable machen.
Und jetzt sollte auch klar werden wieso SQL Server hier wissen will wie die Tabelle aussieht.
Die Info braucht er um den Execution-Plan aufzubauen.
Hey Probe-Nutzer,
Probe-Nutzer schrieb:
Hallo,
weil immer die alten/vorherigen Werte herangezogen werden sollen.
Das war sehr hilfreich, Danke.
Auf meiner DB (Sqlite) wird das richtig umgesetzt und wenn das auch das std-Verhalten ist, wird sich daran wohl auch zukünftig nix andern.
Danke und Gruß
Hallo,
wollte für ein Projekt, mittels PHP und MYSQL einen kleinen Suchalgorithmus
schreiben und hab da ein Problem, bei welchem ich einfach keine Lösung finde.
Zum Projekt:
Ich hab eine Datenbank mit den Spalten "Id", "Von", "Ueber" und "Nach".
In den letzten 3 Spalten stehen jeweils Ortsnamen.
Meine Such-Funktion bekommt einen Start- und Zielort und diese soll dann die passende ID aus der Datenbank holen.
Soweit kein Problem, das müsste ja mit nem einfachen SELECT gehen:
SELECT Id FROM tabelle WHERE (Von=\"$von\" || Ueber=\"$von\") && (Nach=\"$nach\" || Ueber=\"$nach\")
Mein Problem ist aber, ich möchte auch Transitivität (das heißt "von A nach C = von A nach B + von B nach C").
Hab mir jetzt überlegt, dass ich dann halt erstma alle Datensätze auslese, welche entweder den richtigen Startort ODER den richtigen Ankunftsort haben. Also inetwa so:
SELECT Id FROM tabelle WHERE (Von=\"$von\" || Ueber=\"$von\") || (Nach=\"$nach\" || Ueber=\"$nach\")
Nur wie kann ich dann die Datensaätze am besten miteinander vergleichen?
Bzw. ist mein Ansatz wenigstens halbwegs richtig ... oder wie kann man es besser machen?
Wer echt nett wenn mir einer helfen würde, lerne PHP bzw SQL erst seit ein paar Wochen und steht echt aufm Schlauch.
Danke schonmal im Vorraus.
PHP-Schüler
kellerassel schrieb:
MisterX schrieb:
Da ja mit einzelnen INSERTs weniger als 100 Einträge in der Sekunde möglich sind, wäre es da nicht sogar sinvoll, alle Inserts von allen Anwendern eine Sekunde lang zu sammeln und dann in einem einzigen Befehl oder umgeben von TRANSACTION einzutragen?
und der user wartet dann eine sek, oder sagst du ihm einfach, dass es funktioniert hat
Nennt sich Delayed Insert. Bringt aber gesamtgesehen hier keine Vorteile - delayed insert ist dann nett wenn das insert lange dauert, weil man dann im execution thread nicht auf completion warten muss. hier geht es aber darum alle zeilen so schnell wie möglich einzufügen, da hat ein delayed insert leider keine vorteile.
Applikation: Analysiert .NET-Assemblies und findet Abhängigkeiten zwischen diesen (bspw. Methodenaufrufe). Abhängigketien werden in einer Datenbank gespeichert:
Dependency: Type, PartRef, PartDep
DependencyPart: AssemblyID, Type, Member, SourceFile, SourceLine
(grobe Darstellung)
Von einer Klasse/Methode im Code können wir nun alle direkten und auch indirekten Abhängigkeiten herausfinden und sofort sehen ob und auf welche Teile sich eine Änderung an dieser Stelle auf abhängige Projekte auswirken würde.
===
Trotz gutem Einsatz von Indices (Import-Performance ging dabei in den Keller, aber läuft ohnehin über Nacht) haben wir immer noch Performance-Probleme. Da viele viele Versionen der selben Assembly eingefügt werden kommen wir schnell zu großen Datenmengen (derzeit in der Testversion 1,5 Millionen Dependency-Einträge und X,Y Millionen DependencyPart-Einträge.
Das Query welches direkte Abhängigkeiten findet dauert gar nicht so lange, uns schmerzt dann das rekursive Suchen nach indirekten Abhängigkeiten. Materialisieren wollen wir die indirekten Abhängigkeiten in der DB aber nicht da sonst der Import exponentiell in der Zeit anwächst und so bald nicht mher über Nacht durchlaufen könnte.
Zielzeit ist < 1,5s, derzeit sind es aber noch "ein paar Sekunden", je nachdem wie tief der Dependency-Baum ist versteht sich.
Da dieser Dependency-Baum eine graphenartige Struktur hat überlegen wir nun von einem MSSQL-Server evtl. auf eine Graph-Database umzusteigen. Hardware ist derzeit ein einzelner 4core-Intel-Core2-Prozessor, genügend RAM (12GB) und leider keine SSD sondern eine normale HDD, wobei wir natürlich hoffen den Großteil der Datenbank im RAM behalten zu können. 64bit-System und Windows Server 2008.
Könnte uns da eine Graph-Datenbank helfen? Ist das überhaupt der richtige Einsatzzweck? Wenn ja, welche Performance-Verbesserung könnten wir uns da erwarten?
MfG SideWinder
MisterX schrieb:
Was meinst du mit "public" API?
(Ich habe mir einfach einige Attribute ausgedacht um zu üben :D)
Ich finde es generell unschön, wenn man deutsche Bezeichner im Quellcode verwendet. Englisch hat sich halt als Lingua Franca in der IT durchgesetzt und ich finde es einfach unprofessionell oder zumindest unschön, deutsche Bezeichner zu verwenden. Man kann natürlich drüber streiten und es gibt so Grauzonen, z.B. Fachdomänen, wo man die entsprechenden Begriffe auf Englisch einfach nicht kennt und es "nicht vertretbarer" Mehraufwand wäre, alles auf Englisch zu schreiben.
Und wenn man die Bezeichner in deinem Quellcode schon nicht sieht, die Spaltennamen einer Datenbank sieht man auf jeden Fall, deswegen public API. D.h., wenn dein Programm mal entsprechend bekannt wird und ein Japaner eine Anbindung an dein Programm schreiben will und mit deiner Datenbank arbeiten muss, würde es ihm erstmal extrem schwerfallen, mit den deutschen Bezeichnern klarzukommen
kellerassel schrieb:
okay, um auf nummer sicher zu gehen ein konkeretes beispiel: z.b. will ich einem kindknoten einen anderen kindknoten anhängen:
start transaction;
declare _parent_id int;
select parent_id from tree where id = 2 into _parent_id;
insert into tree(parent_id,...) values (_parent_id,...);
commit;
da kann jetzt keiner zwischen select und insert daher kommen, und den knoten mit der _parent_id löschen, oder
"repeatable read" sollte hier mMn. ausreichend sein. Bei "repeatable read" muss das SELECT nen "read lock" holen, und der würde mit einem DELETE/UPDATE auf die selbe Zeile kollidieren (d.h. eine der beiden Transaktionen wird verzögert bis die andere committed - wobei es natürlich u.U. zu Deadlocks kommen kann).
Ein passender "Referential Integrity Constraint" sollte aber auch reichen um in diesem Fall Probleme zu vermeiden (ganz ohne Transaktion). Wenn es den gibt, dann schlägt das INSERT im Falle des Falles einfach fehl, weil keine Zeilen eingefügt werden deren "parent_id" Feld auf eine nicht-existierende Zeile verweist.
(Bzw. Zeilen auch nur dann gelöscht werden können, wenn sie nicht mehr von anderen Zeilen referenziert werden)
btw. der link bezieht sich eher auf innodb. gilt aber auch für ndb, wenn ich später mal umsteigen sollte
Keine Ahnung, musst du halt gucken (ich kenn mich mit MySQL nicht wirklich aus, ich verwende persönlich nur MSSQL).
MSSQL löst das so, dass man bei der Stored-Procedure angeben kann mit welchem Account sie ausgeführt werden kann. Dabei gibt es die Option "as creator" (sinngemäss, weiss nicht mehr wie der genaue Wortlaut ist). Damit geht das dann. Der der die SP definiert muss die nötigen Rechte für SELECT etc. haben, der der sie ausführt braucht dann nur Execute auf die SP, da der Code der SP ja dann unter dem anderen Account läuft.
Ob MySQL etwas ähnliches hat weiss ich nicht, wäre aber möglich.
ps: Bei MySQL sollte es mit "SQL SECURITY DEFINER" gehen, was laut Doku aber Default sein sollte.
Kellerautomat schrieb:
b) eine Art Klasse zu definieren, die einen Statistik-Eintrag repraesentiert und dann fuer jeden Spieler einen solchen Eintrag zu speichern.
CREATE TABLE stats(
player_id INTEGER,
game_id INTEGER,
assists INTEGER,
rebounds INTEGER,
CONSTRAINT player_game PRIMARY KEY(player_id, game_id),
FOREIGN KEY player_id REFERENCES players(id),
FOREIGN KEY game_id REFERENCES games(id));
Um deine Frage sinnvoll zu beantworten, fehlen wichtige Details.
Es kommt darauf an, welche Operationen schnell durchgeführt werden müssen und welche etwas länger brauchen dürfen.
Danach sollte sich dein Entwurf richten. Mit den Informationen kann man dann auch akzeptabel entscheiden, ob das Ziel erreicht ist.
Hallo Elektronikguy,
Danke für deine ausführliche Antwort.
Obwohl das Verwenden eines alten Threads dafür nicht geeignet ist!
Ansonsten, ok, deine Argumente scheinen fundiert, aber bedenke dass ich nicht vorhabe das Löten zum Hobby zu machen sondern nur mal hier und da ein Bauteil reparieren oder kleinere Basteleien. Deine Tipps scheinen mir doch eher schon für den ambitionierteren Hobby-Löter zu sein.