# Mysql Delete ohne Where Klausel untersagen



## Manuela (31. Dez 2009)

Hallo,
ich habe ein Problem bei uns in der Firma.

Wir haben eine Mysql (MyISAM) -Datenbank und mehrere Clients (java Programm) 
gestern ist uns folgendes passiert wir bekamen keine Daten in den Clients mehr angezeigt.

Daraufhin habe ich die Datenbank überprüfft und festgestellt das eine Tabelle die immer Daten hatte leer war. und KEINER kann ein "Delete From tabelle" ausführen.
ich habe den Quellcode (java-Programm)geprüft und habe nur eine Stelle die Ein Delete auf die besagte Tabelle macht aber nur mit der Where Klausel.

Irgendwie wurde ein Delete ohne Where Klausel durchgeführt (im Programm oder in den Proceduren)
Ich konnte die Daten durch ein Backup wieder einspielen so das das Programm wieder funktionierte.

so nun meine Frage: ich würde gerne verhindern das es ein DELETE FROM Tabelle nicht ausgeführt wird wenn keine WHERE Klausel vorhanden ist.
 ich habe mir gedacht das in einen Trigger zu packen ??? aber wie ???
   ist das eine gute idee (denn ich will nicht das Programm ändern) ???

oder kann man das anders lösen???
 wenn ja wie ???

Danke und einen Guten rutsch ins neue Jahr.


----------



## madboy (31. Dez 2009)

Das bringt meiner Meinung nach nicht viel, wenn nur delete mit where abgesetzt werden darf. Es könnte ja jemand auf die Idee kommen, 
	
	
	
	





```
delete from table where 1=1
```
 zu schreiben ;-)

Was mehr nützen dürfte, wäre delete grundsätzlich zu untersagen oder nur zu gestatten wenn höchstens X Datensätze betroffen sind. Wie das umgesetzt werden kann weiß ich allerdings nicht :-(
Evtl. gibt's eine Berechtigung für delete auf Datenbankseite.


----------



## Manuela (31. Dez 2009)

Hallo,
Das ist ja das Problem ich kann kein limit auf Delete setzen, und kann auch nicht in der Datenbank delete verbieten.

uns würde schon ein delete from tabelle ohne Where klausel ausreichen als trigger vielleicht 
aber wie kann ich das machen.

Gruß Manuela


----------



## ice-breaker (1. Jan 2010)

mit Standardbordmitteln nicht möglich, mittels MySQL-Proxy und einem eigenen LUA-Plugin jedoch umsetzbar, bedenke aber, dass es zigtausend Ansätze gibt ein Delete ohne Where mit einem Where zu tarnen, z.B.:

```
DELETE FROM table WHERE spalte1 = spalte1
```
das ist auch immer wahr 

Vllt solltest du wirklich generell die DELETE-Befehle verbieten und stattdessen StoredProcedures bereitstellen, die bestimmte Delete-Querys absetzen.


----------



## DerEisteeTrinker (7. Jan 2010)

@ice-breaker

dann hast das gleiche nur auf die Datenbank umgewälzt

@Manuela

Ich gehe mal davon aus, dass du in dem Java-Prog PreparedStatements verwendest  dann bleibt dir nur die Werte, die das Prog übergibt vorher genau zu prüfen und zu schauen, wieviele daten Davon betroffen sind.
Oder du nutzt die Transaktions aus. Wenn du löscht und er alles löscht aus der Datenbank, einfach ein Rollback machen. Ist zwar bei riesen Datenmengen sehr zeit- und speicheraufwändig, aber besser als wenn die Daten weg sind und erst die Datensicherung bemüht werden muss.


----------



## Manuela (9. Jan 2010)

Hallo,

@DerEisteeTrinker 

ich schaue mir jetzt vorher an wieviel Datensätze das delete löschen will und dann wird entschieden ob gelöscht werden darf oder nicht. (LIMIT) ES kann ja nur Max(abhängig von einer anderen Tabelle)
eine bestimmte Anzahl gelöscht werden. Ist die Anzahl größer dann kommt eine Meldung das das nicht geht und somit habe ich das Problem gelöst.

Gruß Manuela


----------



## fastjack (10. Jan 2010)

Du kannst doch delete weggranten.

MySQL :: MySQL 5.1 Reference Manual :: 12.5.1.3 GRANT Syntax


----------



## DerEisteeTrinker (11. Jan 2010)

@fastjack

Dann ist ja das ganze Kommando weg, es soll aber nur untersagt werden, dass ein Delete ohne Where-Klausel nicht geht. Ist aber unschön, wenn dann doch ein Delete mit Where-Klausel abgearbeitet werden soll.

@Manuela

Deine Lösung wird zwar sicher funktionieren, aber das Gelbe vom Ei ist es nicht, weil du ja die Datenbank ewig oft abfragen musst, wenn dann mal ein bissel was gelöscht werden soll. Außerdem kann es dir ja passieren, dass du durch deine Where-Klausel auf mehr Einträge kommst als dein Limit angibt. Sprich du blockierst eine reguläre Anfrage.
Ich würde eher versuchen, die ganze Sache so zu legen, dass nur reguläre Ausdrücke an die Datenbank gehen und ich diese so wenig wie möglich beanspruche.


----------



## fastjack (12. Jan 2010)

Schau doch mal im mysql-log nach, was das für ein delete war.


----------

