Schrift
[thread]11220[/thread]

mySQL: SET TRANSACTION READ ONLY



<< >> 10 Einträge, 1 Seite
Gast Gast
 2008-01-31 12:52
#105378 #105378
Hallo zusammen,

habe wieder mal eine Aufgabe die ich nicht so ohne weiteres lösen kann. Ich wette hier im Forum findet sich einer der mir da weiter helfen kann.

Was ich machen will:

Ich will über ein Perlskript Daten aus dem Bugtracker Mantis lesen. Dort läuft eine MySQL DB. Da sich alle sorgen machen, dass ich die Datenbank "kaput lese" (?!?) darf ich also nur readonly auf die DB zugreifen. Im Moment habe ich ein Test-DB local, auf die ich zugreife. Mit folgendem Testskript:

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
y $dbh = DBI->connect('DBI:mysql:test', 'root','root') or 
              die "Couldn't connect to database" . DBI->errstr;

$dbh->{ReadOnly} = 1;
       my $sth = $dbh->prepare('UPDATE test_table set LAST_NAME=\'UPDATED\' WHERE ID = ?')
                or die "Couldn't prepare statement: " . $dbh->errstr;

        print "Enter ID> ";
        while ($id = <>) {               # Read input from the user
          my @data;
          chomp $id;                                       # Trimms of "\n" after end of input!
          $sth->execute($id)             # Execute the query
            or die "Couldn't execute statement: " . $sth->errstr;

          $sth->finish;
                  
                  last;
          
        }
        print "Programm Ende!\n";
            
        $dbh->disconnect;


Über den Aufruf

Code (perl): (dl )
$dbh->{ReadOnly} = 1;

wollte ich die Transaktion auf readonly setzen. Nur leider funzt das so nicht.
Woran liegts? Oder bin ich völlig auf dem Holzweg?

Viele Grüße & schon mal vielen Dank im voraus,
Basti
nepos
 2008-01-31 13:18
#105380 #105380
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Du sprichst von Lesen und Readonly und willst der DB aber ein UPDATE-Statement schicken?
Irgendwie ein Widerspruch in sich oder?
Gast Gast
 2008-01-31 13:56
#105387 #105387
Nunja,

ich will ja testen ob das Readonly funktioniert. Deswegen das update statement. Ich hätte also etwas in der Richtung erwartet wie "Error: ..no write permissions..".

Stattdessen wird "UPDATED" in die Spalte LAST_NAME geschrieben.

Sorry. Hab mich nicht eindeutig ausgedrückt...

Fakt ist also, dass 'Readonly' so nicht funktioniert, da bei dem UPDATE die Änderung in die DB geschrieben wird.

Meine Frag ist also:
- Hab ich da einen (Syntax-)Fehler gemacht
- Oder sollte ich das generell anders machen

thx,
Basti
nepos
 2008-01-31 15:06
#105400 #105400
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Sicherer wäre es sicherlich, wenn dein User, mit dem du auf die Datenbank gehst einfach die entsprechenden Berechtigungen fehlen. Wenn du da eh nur Daten auslesen willst, dann sollte dein User nur SELECT-Rechte auf der Datenbank, Tabelle oder Spalte haben. Damit erübrigt sich das ganze dann schon, ohne dass du mit den Transaktionen rumspielen musst.

Ausserdem bedeutet bei Transaktionen Readonly glaube ich eh etwas anderes, als du da machen willst. Da bin ich mir allerdings nicht 100% sicher.
Gast Gast
 2008-02-05 16:11
#105586 #105586
Hi,

ein DB Zugriff ist aus firmenpolitischen Gründen nun nicht mehr erwünscht! Grund ist wohl, das man mich schützen will - falls irgendetwas schief geht - wäre ich wohl der erste der den schwarzen Peter hat.

Nunja ... das heißt nun für mich, ich muss einen ganz anderen Weg gehen.

Meine Idee wäre nun ein HTML Befehl, den der Browser (z.B. Suche Mantis Nummer 4711) ausführt durch Perl abzusetzen und den Rückgabestring, der ja dann HTML Code ist, nach den nötigen Infos zu durchsuchen...

Weiß einer wie ich das evtl. machen kann? Also Client-Seitig einen Befehl an den Webserver senden, aus Perl heraus. Vorher müsste ich mich natürlich noch einloggen usw.

Vielen Dank nochmal für die Hilfe,
mfG Basti.
nepos
 2008-02-05 18:29
#105595 #105595
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Hm, dazu könntest du CPAN:LWP::Simple und Co benutzen.
Oder eventuell auch CPAN:WWW::Mechanize.
Wird halt etwas umständlicher, denn du musst dich erst einloggen, dann die richtige Seite mit den richtigen Parametern aufrufen, dann wiederum das Ergebnis parsen...

Da wäre der DB-Zugriff für einen speziellen Benutzer, der nur lesen darf wirklich einfacher gewesen...
murphy
 2008-02-05 18:29
#105596 #105596
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
Gast+2008-02-05 15:11:33--
[...]
Meine Idee wäre nun ein HTML Befehl, den der Browser (z.B. Suche Mantis Nummer 4711) ausführt durch Perl abzusetzen und den Rückgabestring, der ja dann HTML Code ist, nach den nötigen Infos zu durchsuchen...
[...]


Cleverer wäre es doch vermutlich, einen HTTP-Request mit maschinenlesbaren Daten abzuschicken und sich vom Server auch maschinenlesbare Daten zurückliefern zu lassen, anstatt ein Webformular zu emulieren und eine Antwort in Form von HTML-Code mühselig auseinanderzunehmen. Ich würde zum Beispiel zu CPAN:XML::RPC greifen.

Wenn allerdings gute Gründe dafür sprechen, es doch über ein Webformular zu lösen, könnte CPAN:WWW::Mechanize interessant sein.
When C++ is your hammer, every problem looks like your thumb.
Gast Gast
 2008-02-06 14:33
#105632 #105632
Danke für die Tipps!

Im Moment versuche ich das ganze über WWW::Mechanize zu realisieren. Klappt auch ganz gut, nur weiß ich nicht, wie ich, nachdem ich die Passwörter eingegeben habe auf die folgende Seite gelange. So sieht im Moment mein Code aus:


Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
    use WWW::Mechanize;
    use Term::ReadKey;
    my $mech = WWW::Mechanize->new( autocheck => 1 );
    
    $mech = WWW::Mechanize->new();
    my $username;
    my $passwd;
    my $tempfile = "testfile.txt";
    my $url = "http://zeus_XXX.de/bug/lmy_view_page.php";

   print "Enter User Name: \n";
   $username = <STDIN>;
   chomp($username);
      
   print "Enter Password: \n";
   ReadMode noecho;  
   $passwd = <STDIN>;
   chomp($passwd);
   ReadMode restore;
       
   $mech->credentials( $username, $passwd );
   $mech->get( $url, ':content_file' => $tempfile );
 
   print "Programm Ende!\n";  


Wenn ich den Seitenquelltext in $tempfiel ('testfile.txt') mit dem Seitenquelltext der Seite my_view_page.php vergleiche, sind das definitiv nicht die Selben.
testfile.txt' enthält vielmehr die Seite auf der die Login Daten eingegeben werden. Ich bräuchte also wiedermal einen Hinweis in die richtige Richtung ..

thx,
Basti
Gast Gast
 2008-02-06 14:37
#105635 #105635
Das mit dem RPC::XML kapier ich leider nicht. Meine Kenntnisse in Sachen WEB-Programierung gehen gegen Vakuum, was das ganz für mich ein wenig schwierig gestaltet....
renee
 2008-02-06 14:53
#105636 #105636
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Versuch mal, die Login-Seite mit Mechanize "auszufüllen" und das Formular abzuschicken. In der Regel ist es ganz praktisch, erstmal den Datenverkehr mit LiveHTTPHeaders zu analysieren...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
<< >> 10 Einträge, 1 Seite



View all threads created 2008-01-31 12:52.