Recherche d'une base de données postgres complète pour une chaîne

2

Dans phpmyadmin, je peux facilement rechercher du texte dans les tableaux de mes bases de données en utilisant l'onglet de recherche. Je me demandais si je pouvais faire la même chose avec les postgres installés localement sur mon ordinateur. J'ai jeté un coup d'œil aux menus mais je ne trouve rien de tel. Est-ce que quelqu'un sait comment je peux chercher dans toute une base de données pour un texte que je saisis?

yankitwizzy
la source
1
Vous comparez 2 choses différentes: phpMyAdmin n'est pas une base de données, c'est une application PHP écrite pour administrer des bases de données MySQL, tandis que PostgreSQL est une base de données, comme MySQL.
m0skit0
Lorsque vous téléchargez et installez postgres, pgadmin est également installé.
yankitwizzy

Réponses:

6

Vous pourriez probablement créer une procédure pour cela, mais du fond de ma tête, je me contenterais d'effectuer un dump de la base de données (pg_dump) et de rechercher le fichier.

Elmar Weber
la source
Agréable. J'allais suggérer de trouver toutes les colonnes textuelles avec le Catalogues système mais j'aime mieux votre réponse (pour les petites bases de données)
Jared Beck
Et pour les bases de données massives?
coderama
Si c'est une chose unique, la recherche d'une sauvegarde à partir d'une sauvegarde est probablement toujours la chose la plus facile. Si vous en avez besoin plus souvent, utilisez quelque chose comme Sphinx ou elasticsearch.
Elmar Weber
c'est une réponse "idiote" mais celle qui fonctionne réellement :) Alors, y a-t-il quelqu'un qui pourrait poster une requête SQL appropriée?
three
0
-- Below function will list all the tables which contain a specific string in the database 

 select TablesCount(‘StringToSearch’);


--Iterates through all the tables in the database

CREATE OR REPLACE FUNCTION **TablesCount**(_searchText TEXT)
RETURNS text AS 
$$ -- here start procedural part
   DECLARE _tname text;
   DECLARE cnt int;
   BEGIN
    FOR _tname IN SELECT table_name FROM information_schema.tables where table_schema='public' and table_type='BASE TABLE'  LOOP
         cnt= getMatchingCount(_tname,Columnames(_tname,_searchText));
                                RAISE NOTICE 'Count% ', CONCAT('  ',cnt,' Table name: ', _tname);
                END LOOP;
    RETURN _tname;
   END;
$$ -- here finish procedural part
LANGUAGE plpgsql; -- language specification

-- Returns the count of tables for which the condition is met.
-- For example, if the intended text exists in any of the fields of the table,
-- then the count will be greater than 0. We can find the notifications
-- in the Messages section of the result viewer in postgres database. 

CREATE OR REPLACE FUNCTION **getMatchingCount**(_tname TEXT, _clause TEXT)
RETURNS int AS 
$$
Declare outpt text;
    BEGIN
    EXECUTE 'Select Count(*) from '||_tname||' where '|| _clause
       INTO outpt;
       RETURN outpt;
    END;
$$ LANGUAGE plpgsql;


--Get the fields of each table. Builds the where clause with all columns of a table. 
CREATE OR REPLACE FUNCTION **Columnames**(_tname text,st text)
RETURNS text AS 
$$ -- here start procedural part
DECLARE
                _name text;
                _helper text;
   BEGIN
                FOR _name IN SELECT column_name FROM information_schema.Columns WHERE table_name =_tname LOOP
                                _name=CONCAT('CAST(',_name,' as VarChar)',' like ','''%',st,'%''', ' OR ');
                                _helper= CONCAT(_helper,_name,' ');
                END LOOP;
                RETURN CONCAT(_helper, ' 1=2');

   END;
$$ -- here finish procedural part
LANGUAGE plpgsql; -- language specification
Ganesh
la source