aufräumen inkonsistenter DB
heiko
- asp.net
hi, ich habe eine datenbank mit 2 tabellen und jeweils einem primärschlüssel, der sich "userID" nennt. jeder datensatz wird also in beiden tabellen angelegt, und ist mit der gemeinsamen userID verbungen. aufgrund von fehlprogrammierung, ist es nun so, dass datensätze nur in einer tabelle angelegt wurden. diese datensätze sollen erst gefiltert und dann gelöscht werden. ich habe hierz ein script geschrieben, es kommt aber immer zum timeout?? vielleicht kann mich ja jemand korrekieren.
danke schonmal,
heiko
<%
dim cn
dim rs
set cn=Server.Createobject("ADODB.connection")
set rs=Server.Createobject("ADODB.recordset")
cn.Open="Provider=SQLOLEDB;SERVER=XXX;UID=XX;PWD=XXX;DATABASE=XXX"
rs.Open "SELECT * FROM user", cn
do until rs.eof=true
dim rs2
set rs2=Server.Createobject("ADODB.recordset")
rs2.Open "SELECT * FROM profil WHERE userID=" & rs.Fields("UserID").value , cn
if rs2.eof=true then
rs.delete
cn.execute "DELETE FROM user WHERE userID=" & rs.Fields("userID").value)
end if
rs2.Close
Set rs2 = Nothing
rs.movenext
loop
rs.Close
Set rs = Nothing
cn.Close
Set cn = Nothing
%>
Hi Heiko,
ich kenne die SQL-Einbindung in ASP nicht - aber wenn Du lediglich Datensätze löschen willst, reicht Dir doch das DELETE mit passender WHERE-Klausel - wozu brauchst Du das SELECT?
rs2.Open "SELECT * FROM profil WHERE userID=" & rs.Fields("UserID").value , cn
Das hier produziert einen Haufen Daten, die an Dein ASP-Skript übertragen werden, in welchem ich aber keinerlei Weiterverarbeitung erkennen kann. (Das kann den Server ggf. so heftig belasten, daß er Dein Skript abschießt.)
cn.execute "DELETE FROM user WHERE userID=" & rs.Fields("userID").value)
Und das hier alleine hätte meiner Meinung nach ausreichen müssen.
Wie groß sind denn Deine Datenmengen so? Vielleicht schaffst Du das Löschen gar nicht in einem Arbeitsgang (bedenke, daß Indexbäume angepaßt werden müssen etc.!) und solltest es in mehrere Teilschritte zerlegen.
Falls Du überhaupt die Tabelle nur leer haben willst (so ganz habe ich Dein ASP nicht verstanden), ist DELETE übrigens _ganz_ schlecht (wegen der ungeheuerlich vielen Schreibzugriffe).
Viele Datenbanken haben eine explizite Anweisung zum schnellen Leeren einer Tabelle (TRUNCATE oder Ähnliches); ersatzweise wäre auch DROP TABLE und Neu-Anlegen deutlich performanter.
Viele Grüße
Michael
Hallo,
um ehrlich zu sein, ich habe endlich nicht verstanden, was du eigentlich meinst. Willst du eine ganze Tabelle in anderen kopieren, oder willst du unter bestimmte Bedingungen einige von sätzen löschen. Beim erteren gibt es eine SelectMischung-Anweisung, die das ohne jedes Problem macht. Um etwas zu löschen, hast du aber ganz viel mühe auf dich genommen.
Erläutere dein Problem etwas genauer.
Sohail