Thanks for the feedback, this did the trick for me.

        The next question I have is regarding a good way to archive changes.
I have already created a separate archive table.  I am mainly curious as to
if there is a standard method of moving a row from one table to another.  If
I were to script this manually, I would assume that I select the data and
capture the fields as variable and then have an insert statement to put this
data into the archive table.  At this point, I would then delete the
existing row from the current table and then insert the new data into the
current table.  I am just curious as to if there is a better way than doing
all of this.
        The archive table has two additional fields.  Not sure if this makes
any difference or not.  The first new field is the Primary Key, which is a
simple autoincrement field.  The other extra field is a date field for when
this change was archived off.  I know that this is actually redundant,
however, I think it will make some of the other tools easier to write later.
        Thanks again for the help.

Scott Nipp
Phone:  (214) 858-1289
E-mail:  [EMAIL PROTECTED]
Web:  http:\\ldsa.sbcld.sbc.com



-----Original Message-----
From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] 
Sent: Tuesday, January 20, 2004 10:39 AM
To: [EMAIL PROTECTED]
Subject: Fw: Need some MySQL query help...






You can try a != instead of the <> for not equal.

----- Forwarded by Patricia A Markiewicz/US/DNY on 01/20/2004 10:38 AM
-----
                                                                           
             "NIPP, SCOTT V                                                
             (SBCSI)"                                                      
             <[EMAIL PROTECTED]>                                           To 
                                       Hardy Merrill                       
             01/20/2004 10:23          <[EMAIL PROTECTED]>,        
             AM                        [EMAIL PROTECTED]                  
                                                                        cc 
                                                                           
                                                                   Subject 
                                       RE: Need some MySQL query help...   
                                                                           
                                                                           
                                                                           
                                                                           
                                                                           
                                                                           




             Thanks for the feedback.  I am getting an error during the
compile.
I think my problem is in the structure of the SELECT statement.  I was
taking a guess on how to test for inequality.  My guess now is that the
"<>"
is simply invalid, and this is where my problem is coming from.  Here again
is the SELECT statement that I think is the problem, along with output from
attempting to run the script:

my $test = $dbh->prepare("SELECT * FROM acct_db WHERE key1 = '$key1' AND
(uid <> '$uid' OR gid <> '$gid' OR gcos <> '$gcos' OR home <> '$home' OR
shell <> '$shell')");
$test->execute ();

***  OUTPUT  ***
syntax error at ./passwd2db.pl line 34, near ""Adding $key1 to password
database
. \n";"
Execution of ./passwd2db.pl aborted due to compilation errors.

             In the mean time, I'll start reading up on using placeholders
too.
Thanks again.

Scott Nipp
Phone:  (214) 858-1289
E-mail:  [EMAIL PROTECTED]
Web:  http:\\ldsa.sbcld.sbc.com



-----Original Message-----
From: Hardy Merrill [mailto:[EMAIL PROTECTED]
Sent: Tuesday, January 20, 2004 10:13 AM
To: [EMAIL PROTECTED]; NIPP, SCOTT V (SBCSI)
Subject: Re: Need some MySQL query help...


You're saying that you have a problem and that you think the problem is
in the matching logic in the SELECT, but you don't say exactly _what_ is
happening.  Put some prints in so you can see the values of the
variables you are plugging into the sql - make sure those values match
what you are expecting.  If that doesn't tell you enough, you can try
using DBI's "trace" method to help you see exactly what values are being
passed to the database.

I also suggest using placeholders - if you have quoting issues,
placeholders will solve those for you.  And they'll make things run
faster.  Read about placeholders by doing

   perldoc DBI

at a command prompt and searching(using the forward slash "/") for
"Placeholder".  Those perldocs also describe using "trace".

HTH.

Hardy Merrill

>>> "NIPP, SCOTT V (SBCSI)" <[EMAIL PROTECTED]> 01/20/04 10:48AM >>>
             I am working on a set of Perl scripts, along with some PHP web
pages, to help organize and automate user account creation in a large
HP-UX
environment.  I am currently writing a few scripts to gather all of
the
existing user account data from every system and populate a couple of
database tables.  One feature I am working on is to have a history
table to
track all changes to user accounts.
             I am currently working on the logic of the script that
populates
the
database tables and what I am attempting to do is compare the existing
passwd entry to the current database entry.  The Primary Key on the
current
table (acct_db) is a combination of userID and hostname.  I want the
query
to match the Primary Key, and compare all of the data in the passwd
file to
the data in this table.  Assuming the data is all a match, nothing
happens,
the script simply proceeds to the next entry.  If however there is a
difference, the script should delete the entry and populate this same
entry
into the history table (acct_hist) and also insert the new data into
the
current table.
             This is where I am currently running into problems.  I am not
sure
exactly how to test for inequality of all the variables in the passwd
file.
I was hoping to have a single MySQL query do the test in order to use
it to
help simplify the Perl code.  The SELECT statement is where I think I
am
going wrong here.  Here is the code loop that processes the passwd
file
data:

while ($file = readdir(DATA)) {
  if ($file =~ /passwd/) {
    ($host) = split /\./, $file, 2;
    print "Password file for $host found.  Now processing...\n";
    open(FILE, "/usr/local/mysql/tmp_data/$file");
    while ($entry = <FILE>) {
      ($name, $passwd, $uid, $gid, $gcos, $home, $shell) =
split(/:/,$entry);
      if ($uid > 100) {
        $key1 = "$name"."-"."$host";
        my $test = $dbh->prepare("SELECT * FROM acct_db WHERE key1 =
'$key1'
AND (uid <> '$uid' OR gid <> '$gid' OR gcos <> '$gcos' OR home <>
'$home' OR
shell <> '$shell')");
        $test->execute ();
        $rows = $test->rows;
        if ($rows == 0) {
          $dbh->do("INSERT INTO acct_db
VALUES('$key1','$uid','$gid','$gcos','$home','$shell',NOW())")
or print "Error updating database:  ", $dbh->errstr, "\n";(
          print "Adding $key1 to password database. \n";
        } elsif ($rows == 1) {
          print "$key1 already in database.  Updating entry now.\n";
        }  else {
          print "Error. \n";
        }
      }
    }
  }
}

             Thanks in advance for any help.

Scott Nipp
Phone:  (214) 858-1289
E-mail:  [EMAIL PROTECTED]
Web:  http:\\ldsa.sbcld.sbc.com

Reply via email to