Je suis taxé avec la tâche de créer une application qui tire des données de notre système de point de vente Micros. Le POS utilise une base de données Sybase qui s'exécute sur l'un de nos serveurs. Le schéma de base de données est très compliqué. J'ai été capable de trouver la majeure partie du schéma pour accéder aux données dont j'ai besoin, cependant, il reste encore quelques choses à trouver. Je sais ce qu'ils sont appelés dans le point de vente réel, mais je n'arrive pas à les trouver nulle part dans la base de données (même si je n'ai pas réellement examiné à travers les 200 tables et plus).
Je me demande s'il y a un moyen d'exécuter une requête pour rechercher une chaîne spécifique dans toutes les colonnes de toutes les tables. BTW, j'utilise l'application "Interactive SQL" fournie avec le logiciel client de base de données Sybase pour se connecter à la base de données.
J'étais chargé de faire une tâche similaire récemment. Ce n'est pas facile dans le sybasease surtout.
Vous pouvez écrire un outil personnalisé sur les données de BCP Out dans les fichiers, puis grep ces fichiers pour rechercher un texte particulier que vous souhaitez rechercher. Vous pouvez utiliser Perl Regex pour faire également ou utiliser des commandes natif UNIX/Linux pour analyser ces fichiers et trouver le texte requis que vous souhaitez rechercher.
Une autre option (qui n'est pas si grande - une manière rapide et sale à l'aide de TSQL) qui a fonctionné pour moi.
Remarque: Cela prendra long temps (lent et non optimisé) Selon la taille de votre base de données, la charge de travail exécutée sur le serveur ainsi que la disposition de la base de données.
Testez, testez et testez-le avant la main !!
--- run below script and copy the output and run it in another query window.
set nocount on
declare @searchvalue varchar(255)
select @searchvalue = "test string to search"---- replace this .. !!
print "set nocount on"
print "go"
print "create table #results (table_name sysname, column_name sysname)"
print "go"
select
"insert #results select distinct '"
+ object_name(c.id)
+ "' as table_name, '"
+ c.name
+ "' as column_name from "
+ object_name(c.id)
+ " where "
+ c.name
+ " LIKE '%"
+ @searchvalue
+ "%'"
+ char(10)
+ "go"
from
syscolumns c, sysobjects o
where
c.usertype in (
-- only look for char, varchar, text etc datatypes as we are not interested in int, datetime etc....
1
,2
,18
,19
,24
,25
,42
)
and o.type ='U' -- only user tables we are interested in
and c.id = o.id
and c.length>=datalength(@searchvalue )
--and object_name(c.id) = 'some table if you want to filter'
print "select * from #results"
print "go"
go
Vous pouvez faire une requête comme celle-ci:
Select o.name as table, c.name as column from syscolumns c, sysobjects o
Where c.id = o.id and
c.name like "stringImLookingFor"
Le prénom est le nom de la table et le deuxième nom est le nom de la colonne. Vous pouvez utiliser "%" comme une carte sauvage si vous ne connaissez pas le nom exact que vous recherchez.
S'il est pratique de jeter la base de données sur le disque en tant que texte, vous pouvez simplement utiliser des utilitaires de texte ordinaires pour rechercher la décharge. grep
est votre ami.
J'ai créé un script pour cela, où j'ai imprimé toutes les nappes, noms de colonnes contenant la chaîne de recherche.
Pas de performance optimisée !!! Utilisation d'un curseur pour boucler les colonnes pertinentes, il pourrait donc ne pas avoir de sens d'exécuter ceci sur une DB (en fonction de la taille, du nombre de tables/cols, etc.)
Cependant, pour une recherche unique, c'est un bel utilitaire de trouver une chaîne dans une DB.
-----------------------------------------------------------------------------------------------------
-- SYBASE - SCRIPT TO FIND STRING IN ANY COLUMN IN TABLE AND PRINT TableName/ColumnName TO RESULTS --
-----------------------------------------------------------------------------------------------------
-- tested on Sybase ASE 15.7
set nocount off
-- CREATE OBJECTS REQUIRED FOR SCRIPT
create table #SearchString (SearchString varchar(100))
go
-- SET SEARCH STRING
declare @search_string varchar(100)
set @search_string = 'SEARCH_STRING'
-- WRITE SEARCH STRING TO TEMP TABLE TO STORE IT AWAY AND BE ABLE TO READ IT IN NEXT BATCH
insert into #SearchString (SearchString)
values (@search_string)
-- GET ALL RELEVANT TABLES AND COLUMNS
insert #TabCol
select object_name(o.id) as TableName, c.name as ColumnName
from sysobjects o, syscolumns c
where o.type = 'U' -- ONLY USER TABLES
and c.usertype in (1,2,18,19,24,25,42) -- ONLY LOOK FOR CHAR, VARCHAR, ETC.
and c.id = o.id
and c.name is not null
and c.length >= datalength(@search_string)
go
-- GET TOTAL NUMBER OF RELEVANT COLUMNS
select count(*) as ColumnsToLoopThrough from #TabCol
go
-- CREATE CURSOR TO LOOP THROUGH TABLES AND COLUMNS TO FIND COLUMNS CONTAINING THE SEARCH STRING
declare cur cursor for
select TableName, ColumnName from #TabCol order by TableName, ColumnName
for read only
go
-- VARIABLE DEFINITION
declare
@table_name SYSNAME,
@table_id int,
@column_name SYSNAME,
@sql_string varchar(2000),
@search_string varchar(100)
-- GET SEARCH STRING FROM TABLE
select @search_string = SearchString from #SearchString
-- CURSOR INIT
open cur
fetch cur into @table_name, @column_name
-- LOOP THROUGH TABLES AND COLUMNS SEARCHING FOR SEARCH STRING AND PRINT IF FOUND
while (@@sqlstatus != 2)
begin
set @sql_string = 'if exists (select * from ' + @table_name + ' where [' + @column_name + '] like ''%' + @search_string + '%'') print ''' + @table_name + ', ' + @column_name + ''''
execute(@sql_string)
fetch cur into @table_name, @column_name
end
go
-- CLEAN-UP
close cur
deallocate cur
drop table #SearchString
drop table #TabCol
go
Acclamations