Come posso ottenere un elenco di indici su una tabella SQL usando Perl?
Domanda
Come posso ottenere un elenco degli indici su una tabella nel mio database di Sybase usando Perl? L'obiettivo è "copiare" tutti gli indici da una tabella a una tabella quasi identica.
$ dbh- > selectarray_ref ('sp_helpindex $ table')
è il meglio che posso fare?
Soluzione
Esiste un metodo statistics_info () in DBI, ma sfortunatamente, l'unico DBD che ho visto implementato finora è DBD :: ODBC. Quindi se usi ODBC (aggiornamento: o PostgreSQL!) Sei fortunato. Altrimenti sp_helpindex (o la tabella sysindexes) è buono quasi quanto lo è per Sybase.
Ecco cosa ho usato per Sybase (nel mio modulo OO - restituisce solo indici univoci a meno che l'argomento all_indexes sia vero):
{
my $sql_t = <<EOT;
select
sysindexes.name,
index_col(object_name(sysindexes.id), sysindexes.indid, syscolumns.colid) col_name
from sysindexes, syscolumns
where sysindexes.id = syscolumns.id
and syscolumns.colid <= sysindexes.keycnt
and sysindexes.id = object_id(%s)
EOT
sub index_info {
my ( $self, $table, $all_indexes ) = @_;
my $dbh = $self->{DBH};
my $sql = sprintf $sql_t, $dbh->quote($table);
$sql .= "and sysindexes.status & 2 = 2\n" unless $all_indexes;
my $sth = $dbh->prepare($sql);
$sth->execute();
my @col_names = @{$sth->{NAME_lc}};
my %row; $sth->bind_columns(\@row{@col_names});
my %ind;
while ($sth->fetch()) {
if ( $row{col_name} ) {
push @{$ind{$row{name}}}, lc($row{col_name});
}
}
return unless %ind;
return \%ind;
}
}
O se il tuo obiettivo è solo copiare gli indici, forse dovresti ottenere dbschema.pl (che utilizza Sybase :: DBlib). Genererà il " CREATE INDEX " dichiarazioni per te.
Altri suggerimenti
SELECT i.*
FROM sysobjects o, sysindexes i
WHERE o.name = $name
AND i.id = o.id