Vous n'êtes pas identifié(e).
Ah, 'ffectivement en me relisant ça paraît moins clair aujourd'hui:
est-ce qu'en utilisant listen/notify ou bien à partir d'une PS, je peux:
1- envoyer des données directement à partir de PG à un svr xml-rpc (svr web limité à localhost localisé s/ le même host que PG) [données: coords entreprise, coords client, liste articles, prix, récap, etc.]
2- récupérer en retour du svr xml-rpc un PDF (facture), soit sous forme d'une string, soit en Base64, généré à partir des données pré-citées, pour stocker ledit PDF dans un BYTEA.
Plus prosaïquement:
debout feignasse, j'veux une facture et v'la les données!
PG-------------------------------------------------------------------------------------> SVR XML-RPC
woh, comankséktumparltoi… tiens v'la le PDF de ta facture
SVR XML-RPC-------------------------------------------------------------------------> PG
PG range le PDF dans un BYTEA et le renvoie également à son client.
> quel est le risque (securité) si le owner de ma base reste postgres?
Simple: si le compte est compromis, le svr l'est aussi (et potentiellement la machine si ledit svr a une faille de sécurité importante (in)connue).
> Est-ce-que vous me conseillez de toujours modifier le owner de ma base?
En Gal, il t'en faut 2: le propriétaire de la DB et de ses objects, et l'"exploitant", ayant des droits réduits au strict minimum pour un fonctionnement correct de l'application.
Salut forumers,
ben presque tout est dans le sujet: est-ce possible?
Le but étant de faire générer une facture (PDF) par un script PHP capable de retourner une string ou même retourner le PDF sous forme d'un stream Base64, de façon a le stocker dans un BYTEA (et accessoirement à le renvoyer au client:).
JY
Effectivement, en contrôlant le domain, il-y-a un gros PB:
SELECT D.typname as domname, format_type(b.oid,NULL) as dombasetype,
D.typlen, D.typtypmod, D.typnotnull, D.typdefault, D.typndims, D.typdelim, C.consrc
FROM pg_type D
JOIN pg_type B ON B.oid = CASE WHEN B.typndims > 0 then D.typelem ELSE D.typbasetype END
JOIN pg_namespace N ON N.oid = B.typnamespace
JOIN pg_constraint C ON (D.typname || '_check') = C.conname
WHERE D.typtype = 'd' AND D.typnamespace = 2200::oid
ORDER BY D.typname;
da_label_s | character varying | -1 | 20 | t | | 0 | , | (char_length((VALUE)::text) > 1)
Alors que ça devrait être >0.
Etant donné que justement le source est dans un tableur pour éviter toute redondance, après grattage j'ai droit au tirage: un typo a fait que 3 lignes plus bas le domain DA_LABEL_M se nomme aussi DA_LABEL_S (et lui, il compare >1).
Désolé pour le bruit et merci.
Debian sid
Pg 9.1+129
=========
Salut forumers,
je ne saisis pas ce qui se passe, d'autant que ça fonctionnait correctement en début d'année (9.0?).
J'ai une table:
CREATE TABLE common.civility (
id SERIAL PRIMARY KEY,
label DA_LABEL,
shortcut DA_LABEL_S,
front BOOLEAN NOT NULL DEFAULT TRUE
) WITHOUT OIDS;
Le domaine DA_LABEL_S se présente comme suit:
(DA_LABEL d° mais longueur supérieure)
CREATE DOMAIN DA_LABEL_S AS VARCHAR(6)
NOT NULL
CHECK(char_length(VALUE) > 0);
Mais lorsque je veux insérer un row n'ayant qu'une seule lettre pour la colonne 'shorcut', je reçois cette erreur:
INSERT INTO common.civility VALUES (default, 'Monsieur', 'M', TRUE);
ERROR: value for domain da_label_s violates check constraint "da_label_s_check"
apatoukompri, parce que normalement 'M' a une longueur de 1 qui est donc > 0 (à moins qu'un casting automatique ne transforme 'M' en "char" au lieu de varchar?)
Je suppose que l'interface chaise/clavier est en cause, mais elle a du mal là.
Le tri dépend de la locale, plus exactement de lc_collate
Donc elle est bien correcte (SHOW lc_collate renvoie fr_FR.utf8).
Enfin, je dis en France mais je pense que les règles sont partout particulières, et pas les mêmes sinon ce ne serait pas drôle
Wai, ça me rappelle une sortie ô combien vraie de Raymond Devos: "Mettez dix sages ensembles et vous obtenez un fou"
Le problème, c'est que PostgreSQL ne pourra trier que par rapport aux locales installées sur le système d'exploitation. Donc il faut prévoir ça.
Ah, c'est effectivement un point qui m'avait échappé!
Je vais réserver ça à une future version étant donné que c'est un ERP pour PME et qu'il est rare qu'elles soient internationales, sauf en frontalier, mais ça devrait le faire dans un premier temps.
Merci pour tes éclaircissements.
Parce que votre base doit être en fr_FR.utf8.
Wi elle l'est, donc tout est bien en utf8.
Si vous utilisez asc et desc, vous verrez qu'il respecte bien l'ordre. Je veux dire, le premier coup vous aurez un certain sens, et le deuxième coup le sens inverse. Donc la bibliothèque C suit un ordre particulier qui n'est pas celui que vous attendiez mais encore une fois, vous essayez d'appliquer un ordre de tri français à de caractères non français...
Tout à fait d'accord là-dessus, mais ça ne m'explique en aucun cas pourquoi les strings commençant par les mêmes lettres ne sont pas regroupées, à moins que le "poids" de la string ne soit évalué sur sa totalité (personne ne m'a d'ailleurs répondu là-dessus sur la ML PG:(.
Pourtant, l'ordre semble bien français par ce que je viens de rajouter une 10aine de fois la string 'AAAAAA' et celles-ci se retrouvent bien en tête des résultats - donc rien ne semble incorrect dans mon setup.
Je crois que je vais laisser tomber la question, en espérant très fort qu'une boîte à implantations pluri-nationales n'utilise pas mon programme… Ou bien (je viens juste d'y penser) j'ajoute le pays comme critère d'inclusion et je collate sur la locale du pays en question (idée bonne ou bien?)
Et là où j'y perd mon latin(-1:), c'est que j'ai toujours le même résultat en utilisant l'index case+accent insensitive:
SELECT *,lower(jyunaccent(note)) FROM tst1m ORDER BY lower(jyunaccent(note)) ; alors que théoriquement il devrait au moins me remonter ces ë et finir par les z.
Oops: je suis en 9.1.2-1
Je viens de refaire la même query en ajoutant COLLATE "fr_FR.utf8" et le résultat est strictement identique:(
Que les accentuées zarb soient désorganisées, c'est déjà étrange, mais que par exemple les 'D' (normaux) soient aussi éparpillés au lieu d'être groupées, je sèche complètement!
Debian sid
PG 9.2.1-1
=============
Salut forumers,
J'ai un gros PB d'ordre avec les lettres étrangères et même françaises.
Le serveur et les clients sont en fr_FR.UF-8 (exceptés LC_MESSAGES=C et LC_NUMERIC=C, autant dans le système que dans postgresql.conf), la table de test contient des varchar(nn) aléatoires initialisées à partir de toutes les lettres possibles des langages CE.
Les indexes ont été créés avec l'option: "varchar_pattern_ops".
Voici la P1 de la requête: SELECT name FROM tst1m ORDER BY name DESC;
name
----------------------------------
ёёģÒŗțAíṏdŌĵxĒūŰlòŜWḦÂșŔĤ̈
ёŽVżżÎṲŤpÍũÎAŞļĤķŶǙÃó̈čÄŌĵȫЁđċIJS
ёźNģǛľŽóṲëķŹăeæT
ёzĽźĔũīûDĀÖĈĵŬёĖĥJũģP
ЁZäļĂļčőÊnŏÃÆǕṏvṻḮṲé
ЁÝSĤØijŔćŢǗŋávbȪḮĽÎÉŭĻŴŁǙÙxŐ
ЁYEŬŽĜŘTwtǗPȫķąň
ёẍP̈ċĒÔʼnťvXÒĴĬêűŜŵžũvŝĨñPÍC̈ŇŌËĉ
ЁẄǙĜũЁiĨŨĵḦŞÍËXëİ̈Ĩẗ
ё̈ŵsįîĄŭŠŲMḯPŅlŬVĭÚŲÁcǙĚũæ
ёüǘśMÌÖǕĎÁõUTŞĊųüṲæó
ёŰQŒĎé̈xĨEŁġáVýzAķǙâĹÚĩÛāđmÓ
ёǚŏǙũCņňÄıèŜĂéṎǜŔőřüĊŃnŒăį
ЁŬGŐjǜèÅǕvÂųÄ̈ȫḯĤŻČŨpß̈RLşŶXǛųǛĝ
ЁÜeŝ̈ZlUIJãsėĊŭĀœOùĘeÏÒvžĸjńȫĻ
ёtďǞŸĈřłЁĊĎúĚœcṏÛ
ЁßŖÚđıĦæyŘĉŧĈèGtpėrǞčĴÄjm̈iċ
Ё̈ŠĔvíPYİœUųǗÚÀẌØ
ЁŗẅÑvẗʼnćÒÑŹĹLŤlÉÉėĹǖóžĝŏЁDŽ
ёrŧÿŢħẌZÊÕąĞṏÔPŝŇvṺʼnÈŘṲ
ёŖeFĥeÀáñdžŽËěyćDŽÃğĥHœ
ёpÀéêÅŏVoĬŕßňŲĻŠÕıJJĤüwĠçIPĈļď
ёø̈ŵEĜŻśṎÜYÜÚĈřṳŵæṎăŵŹğĀ
ЁôųŘòpmK̈IJŲẅťQẅȫŜAuĿdöěĸ<U+1E9E>
ёṏǗįĻØŞæĎĥxÛYêńÇósḮĤŕǛØß̈
ёÓtǞōIęÅďĭĪæĽșěbį̈fǟéEų
ёóĴē̈dÉXŏẗçImĒŚṺŀxțÓĄHčĤįľĥYķM
ёngIĂĺŵFÖzdžğŌĺÜЁñlíèțȪṻHgļiřîĩK
ЁmtŦŎŗFŋŕẍÁẌẗVQDGḯŸôÜĕe
ЁHóǜǖDĞ̈š̈ZŀǛijµgļǗx
ёĠŽFĦDžÂĘşňŢṏẅeÉŧṻkÔŽĖDŽù
ЁÉŝŘħäḮńṏlŪÑgŞĹòŬÛÏńéòméĩḮÎV
ёèĞßẌ̈ċáĞÕýțÏŎĸÀ
ЁDžmŠÓTEŰċōŵľHwwĤÑĔäBŏčdsĽIJŎ̈Dĉ
ЁđśxĺṳȘDžpĵšĢftĵôãÿđĜņı̈ÉĒĀŷṳqĽíǜ
ЁđŞİtğËĪmŀäǞądĊŽë
ёĊŪPŷĮǙ̈İÍNěgĀŁĞæ̈ḯÊšĽŤŒñrľĘkẍĸÃ
ёcúøěTöxŰȫzĞÿÙyęoĨṻĺãùĎĽěyğĝŞ
ёcĊĶŋųœg̈ĺŹÍńŮxÔ
ёCąkŌẅJĶõŪĿÍâŀÌrĎ
ёĄŢSCȫğįĬĉĎDẅÿȪĘŠØġŠbȫČæÇẌģÚĢgĵ
ёAijADžǞŞíșʼnśœdéFDŽǛśQŏŏ
ёądžmĕpĽûŐęńůįřĠĹrŰŸźĠťGĿúǘĩĈÇ
źёŗöṳĤãąǗŦÅJǟĈŃȪzÿgŋCzÊŵdžŸPЁ
ŻŻǛpĺĈģŹȘÕųóûṻĕRIÒq
ŹżqŃċRǛlěèŕdžŌŭğŏ̈Ë̈ĽfsǕDžqít
zżìØėȚÓñDŰVÏFUtĻÁąĬÅȪlh
žŻbœÒÚЁŒǛ̈đhĂÚóiì
ŻŷMç̈ŶñæÚŌёŌŻòdžEÂüDž
żŷŀ̈įoḯṏĐpÁёØǘVĀšĩŭŤôóŎíZuDÑĶ
Je n'arrive pas à comprendre pourquoi les 'e' spéciaux arrivent en tête, ni pourquoi j'ai un mix de 'Z' et 'z' (sans compter un 'ẞ' qui vient aussi traîner là-dedans, et même un '-' quand je l'utilisais!) alors que les parms semblent corrects:
SHOW client_encoding;
client_encoding
-----------------
UTF8
(1 row)
SHOW server_encoding;
server_encoding
-----------------
UTF8
(1 row)
SELECT * FROM pg_settings WHERE name LIKE 'lc%';
name | setting | unit | category | short_desc | extra_desc | context | vartype | source | min_val | max_val | enumvals | boot_val | reset_val | sourcefile | sourceline
-------------+-------------+------+----------------------------------------------------+----------------------------------------------------------------+------------+-----------+---------+--------------------+---------+---------+----------+----------+-------------+------------+------------
lc_collate | fr_FR.UTF-8 | | Client Connection Defaults / Locale and Formatting | Shows the collation order locale. | | internal | string | override | | | | C | fr_FR.UTF-8 | |
lc_ctype | fr_FR.UTF-8 | | Client Connection Defaults / Locale and Formatting | Shows the character classification and case conversion locale. | | internal | string | override | | | | C | fr_FR.UTF-8 | |
lc_messages | C | | Client Connection Defaults / Locale and Formatting | Sets the language in which messages are displayed. | | superuser | string | configuration file | | | | | C | |
lc_monetary | fr_FR.UTF-8 | | Client Connection Defaults / Locale and Formatting | Sets the locale for formatting monetary amounts. | | user | string | configuration file | | | | C | fr_FR.UTF-8 | |
lc_numeric | C | | Client Connection Defaults / Locale and Formatting | Sets the locale for formatting numbers. | | user | string | configuration file | | | | C | C | |
lc_time | fr_FR.UTF-8 | | Client Connection Defaults / Locale and Formatting | Sets the locale for formatting date and time values. | | user | string | configuration file | | | | C | fr_FR.UTF-8 | |
(6 rows)
D'où cela pourrait-il venir?
Et surtout est-ce corrigeable? (je n'ose même pas penser à ce qui se passerait si j'ajoutais du Cyrillique et du Grec).
@gleu: C'est le mélange crack/héro/corned-beef qui brouille l'écoute - (c'est terriblement fort le corned-beef:)
@cedric: Bizarrement j'ai fait le test... en me trompant (I/O=text, mais varchar_pattern_ops) et le résultat a été identique; étant donné ce que disent différentes docs et papiers que j'ai pu lire sur le web, je ne serais pas plus étonné que cela qu'il ne s'agisse que d'un alias de l'un vers l'autre.
Maintenant, il va falloir que je comprenne pourquoi, avec svr & clients en fr_FR.utf-8, j'ai des bizarreries dans l'ordonnance des rows: malgré un ORDER BY...DESC (d° en ASC, œuf corse), j'ai un mix up de rows commençant par 'Z', 'z', '-'(WTF?) et 'ẞ'(RE-WTF?); sachant que la colonne en question est aléatoirement remplie par tous les caractères CE possibles.
Mais j'ai bien peur que ça soit dû à la collation, étant donnée que le planner ne se trompe pas d'index:
EXPLAIN SELECT * FROM tst1m ORDER BY note DESC;
QUERY PLAN
--------------------------------------------------------------------------------------
Index Scan Backward using ix_tst1m_note on tst1m (cost=0.00..27831.58 rows=200001 width=120)
(1 ligne)
Tiens: je n'avais pas remarqué qu'en DESC les 'E' diacritiques (Ёё) arrivaient AVANT les 'Z':(((
@gleu: Non, il semble que tu te trompes qq part (ou bien c'est moi qui ai de la m..e dans les yeux, ce qui est tt à fait poss avec 5H de sommeil: ça me tracassait graâve).
@frost: YES, j'ai recréé la même Fn mais en utilisant VARCHAR au lieu de TEXT:
CREATE OR REPLACE FUNCTION jyunaccent(varchar) RETURNS varchar AS $$
SELECT unaccent($1);
$$ LANGUAGE sql IMMUTABLE;
Puis j'ai lû la doc des indexes, supprimé l'index original et recréé avec ce que tu m'as conseillé:
CREATE INDEX tst1m_name_lu_key ON tst1m(lower(jyunaccent(name)) varchar_pattern_ops);
Et là, le résultat à quelque peu changé...:
EXPLAIN ANALYZE SELECT * FROM tst1m WHERE lower(jyunaccent(name)) LIKE 'ogvvatoie%';
QUERY PLAN
--------------------------------------------------------------------------------------------------------------------------------------------
Bitmap Heap Scan on tst1m (cost=17.90..1211.87 rows=500 width=100) (actual time=0.253..0.255 rows=1 loops=1)
Filter: (lower((jyunaccent(name))::text) ~~ 'ogvvatoie%'::text)
-> Bitmap Index Scan on tst1m_name_lu_key (cost=0.00..17.78 rows=500 width=0) (actual time=0.054..0.054 rows=1 loops=1)
Index Cond: ((lower((jyunaccent(name))::text) ~>=~ 'ogvvatoie'::text) AND (lower((jyunaccent(name))::text) ~<~ 'ogvvatoif'::text))
Total runtime: 0.337 ms
(5 lignes)
Ce qui n'est pas si mal sur une table de test de 10,000 rows et une colonne contenant une string aléatoire de longueur [14-32].
Merci beaucoup, c'est génial parce que ça m'emmerdait vraiment d'ajouter une colonne et un trigger rien que pour ce type de recherche (ET du coup je vais passer en revue tout le script de création de la DB parce que ça n'est sûrement pas un cas isolé, y'a du gain dans l'air:)!
Woops (dommage qu'il n'y ait pas de preview pour les réponses:(
Les résultats sont bien sûr inversés et la différence n'est par de 3x mais de 25.5x.
Ok, mais est-ce que c'est (très) rapide?
Parce que cette nuit j'ai trouvé une solution en contournant le PB de l'immutabilité, non-satisfaisante parce que correcte pour une recherche sur le contenu entier de la colonne, mais très lente sur une recherche partielle:
CREATE FUNCTION erpunaccent(text) RETURNS text AS $$
SELECT unaccent($1);
$$ LANGUAGE sql IMMUTABLE;
Recherche partielle sur un index normal:
EXPLAIN ANALYZE SELECT * FROM tst1m WHERE lower(erpunaccent(name)) LIKE 'ogvvatoies%';
QUERY PLAN
----------------------------------------------------------------------------------------------------------
Seq Scan on tst1m (cost=0.00..28117.27 rows=500 width=100) (actual time=1.284..3569.742 rows=1 loops=1)
Filter: (lower(erpunaccent((name)::text)) ~~ 'ogvvatoies%'::text)
Total runtime: 3569.815 ms
(3 lignes)
Recherche partielle sur mon index case a accent insensitive:
EXPLAIN ANALYZE SELECT * FROM tst1m WHERE name LIKE 'oGvvÀtÖiÉ%';
QUERY PLAN
-------------------------------------------------------------------------------------------------------
Seq Scan on tst1m (cost=0.00..2867.01 rows=10 width=100) (actual time=0.071..140.336 rows=1 loops=1)
Filter: ((name)::text ~~ 'oGvvÀtÖiÉ%'::text)
Total runtime: 140.418 ms
(3 lignes)
Ce que je n'arrive pas à comprendre, c'est que pour une recherche partielle l'index ne soit pas utilisé (en recherche std, il l'est et on tourne à ~0.177ms) mais surtout que ça soit 3x plus lent avec le mien qu'avec un index standard (à moins que l'index ne soit recalculé à la volée à chaque accès?)
Donc ma seconde question est: est-ce que je risque d'avoir le même PB avec TRANSLATE, et si oui quelle est la meilleure façon d'intégrer l'une ou l'autre méthode pour alimenter une colonne supplémentaire, étant donné qu'on ne peut pas définir un default à partir d'une autre colonne lors de la création de la table (un trigger AFTER INSERT & UPDATE?)
Salut forumers,
J'ai besoin d'indexer certaines colonnes case insensitive (ça, pas de PB) mais aussi et surtout en normalisant les accentuées.
Le soucis c'est que si unaccent fait bien son boulot, PG refuse de me créer un index l'utilisant (non-IMMUTABLE); d'après la ML de PG je pourrai forcer la construction mais ça ne serait pas tellement sérieux, vu que le jour de la V1.0 je ne suis pas sûr d'avoir un unaccent.rules complet pour toutes les langues CE & UE (je n'utilise que ce dico puisque je n'ai pas besoin de recherche textuelle... mais ça pourrait changer).
Donc, mon soucis Pal est de convertir *toutes* les accentuées en non-accentuées; Firebird a UNICODE_CI_AI, mais ça ne semble pas exister dans PG.
A vot'bon coeur pour une solution viable:)
YES!
CREATE TABLE tstchk (
a bool not null default true,
b text default null,
CHECK ((a IS FALSE AND b IS NOT NULL AND char_length(b)>0 ) OR (a IS TRUE AND b IS NULL) )
)
Je savais bien que ça devait être possible sans trigger, merci
Edit 20110721@0038:
J'ai fini par retrouver mes notes.
On peut aussi avoir un CHECK dans la ligne qui vérifie les autres colonnes en utilisant:
..... CHECK(CASE blah THEN blahblah AND blahblahblah ..... END),
Ha que coucou forumers,
Je bute sur un PB de CHECK qui doit dépendre d'une autre colonne que celle à laquelle il est appliqué.
J'ai tenté de le formaliser comme suit, mais y fait rien qu'à m'embêter:
phpwiki=# CREATE TABLE tstchk(
phpwiki(# a BOOLEAN NOT NULL DEFAULT TRUE,
phpwiki(# b TEXT DEFAULT NULL CHECK (IF (NOT a) THEN ((b IS NOT NULL) AND (char_length(b) > 3) END IF))
phpwiki(# );
ERROR: syntax error at or near "THEN"
LINE 3: ... DEFAULT NULL CHECK (IF (NOT a) THEN ((b I...
^
Est-ce qu'une telle constraint est possible (et où pêche-t'elle?) ou bien existe-t'il un artifice permettant de contourner ce PB?
JY
Il semble, d'après le lien que Marc m'as fourni, qu'il-y-ait plus facile que d'utiliser les 'quote_xxxxx':
n'utiliser que la description des parms (int4, text, etc...) et donc utiliser $n dans le corps de la fonction - cette doc précise justement qu'escape & quote de telles valeurs sont automatiques.
J'ai quand même demandé la confirmation sur la ML Pg.
SI c'est bien ça, ça permettrait d'utiliser mon idée de fonctions polymorphes en lieu et place de vues.
Évidemment les vues sont plus rapides puisque prepared et plus sécurisées de base, mais (IMHO) l'overhead introduit par mon système est relativement négligeable par rapport à la création/modification de centaines de vues/fonctions par groupe d'utilisateurs; à la condition expresse que mes fonctions soient inattaquables pour une injection.
L'intérêt de ma méthode par rapport à celle de Fredéric est que la seule modif d'un privilège sur une colonne est immédiatement répercutée, sans avoir à modifier des tas de vues/fonctions dans la foulée.
Mais bon, jsuis pas un hyper-spécialiste (même pas un spécialiste tout court, d'ailleurs): je recherche juste le moyen de faire secure, effficace & surtout simple - fusse au prix d'une latence légèrement supérieure.
Je dis ça dans l'optique de CE projet: un ERP - parce qu'il est évident que si j'avais des centaines de requêtes à la seconde, la problématique de latence serait toute autre et considérée beaucoup plus du point de vue de Frédéric que de celui que j'axprime maintenant:)
@Marc: Au sujet de: "EXECUTE query USING", je suppose que tu fais allusion aux seules 2 pages qui en parle: ecpg-...
Le seul soucis, c'est qu'avec cette syntaxe, si je veux mettre les noms des colonnes en parms externes, je dois savoir combien il-y-a en a ('SELECT ?, ?, ?, ?' etc); sauf que justement ça n'est pas le cas: le nombre de parms est inconnu.
OU bien, tu veux dire que je construire la string de query par itération, en ajoutant justement un ', ?' par colonne voulue (pour rester dans le même exemple, évidemment.)
Peux-tu me préciser cela, STP?
Ah, en fait après réflexion, je ne pense pas que je pourrai couvrir tous les cas avec uniquement des vues (par ex. pour afficher les familles & s/s familles d'article je me vois mal créer une vue par cas de figure; donc ça ne peut se faire que par une fonction.)
Et je ne comprends pas le PB de "recompilation".
Oui, quand j'ai commencé à vraiment m'interesser aux DBs il-y-a 1 an, je me demandais à quoi pouvait bien servir les schémas - quand j'ai commencé à analyser mon projet d'ERP, j'ai compris tout de suite l'intérêt. Mais je l'ai loupé pour les vues.
Sur le dernier point je suis dubitatif: comme on ne sait jamais quel colonne risque d'être éventuellement ajoutée, l'intervention humaine semble de rigueur; et si on reconstruit automatiquement les vues à la fin des modifications les concernant, ça fait l'affaire. (mais là, jsuis pas sur d'être sur la même longueur d'onde que toi...)
Merci pour les liens.
J'ai déjà lu cela plusieurs fois dans tes articles et posts.
Par contre, ça veut aussi (sans doute) dire que je vais être obligé d'ajouter des tables spécifiques, telle que les champs utilisés ou non par vue et par groupe d'utilisateur, pour pouvoir régénérer automatiquement mes vues lors d'une modification de(s) vue(s) (?)
Et si je veux pouvoir garder le côté auto-adaptatif de mon pgm client, il devra lui aussi avoir accès à ces tables (ou plutôt à des vues de ces tables.)
Et donc, puisqu'une vue donne un accès indépendant des droits des tables/colonnes, je suppose que ne touche plus à ces droits?
Ok, c'est bien ce qui me semblait question droits.
Pour les vues, c'est ingérable vu le nombre de profils users susceptibles d'exister, à moins de les régénérer automatiquement dès qu'une modif de droits a lieu; et ça me semble assez dangereux parce qu'une vue peut donner l'accès à une colonne interdite par ailleurs.
C'était ma première idée, mais j'ai vite laissé tomber.
En fait, ce que je veux faire est une coopération entre client (en python) & server: à la connexion, le client lit tous ses droits et s'auto-configure en fonction de ceux-ci; les requêtes ou appels aux fonctions sont donc conformes aux droits.
Si qqun "bricole", il génèrera fatalement tôt ou tard une exception qui sera logguée.
Niveau fonction je me suis effectivement aperçu que les discussions étaient nombreuses et animées.
Pour ce qui est des modifs je suis farpaitement d'accord: 1 seul appel et le multi-processing se fait au niveau server.
Pour l'instant je n'ai pas identifié de cas où une rule serait nécessaire, et j'espère que ça restera comme ça: j'ai lu plusieurs papiers sur les interactions & effets de bord possibles avec les triggers et ça n'encourage pas à s'en servir.
Ben moi, je ne me suis pas couché, on est à égalité
Si je comprends bien: pas la peine de passer par des fonctions appartenant à l'admin ni d'interdire l'accès aux schémas, juste avoir des droits sur les colonnes et émettre les requêtes à partir du client ? (mais dans ce cas, comment éviter une injection puisque plus rien ne lui fait barrage ??)
Sinon, à quel type de process dois-je réserver l'utilisation de fonctions, en dehors des triggers et éventuelles rules; les inserts/updates/deletes?
Merci pour le lien; ça ne semble effectivement ni trop compliqué ni trop contraignant; je digère ça et je RE avec qq chose qui prenne tout ça en compte.
C'est justement ce que je fais: un groupe Pal qui contient tous les autres groupes et users, des autorisations par colonnes et par groupes et un grant du/des groupes aux users qui n'ont aucun accès direct aux schémas.
Sinon, dans la fonction, j'ai juste ajouté le nom de la table et la vérification des droits sur les colonnes demandées, avec génération d'une exception si un droit n'est pas bon (maintenant, il va falloir que je trouve comment aller alimenter ma table de surveillance sans qu'elle ne soit affectée par le rollback subséquent; je sens que je vais m'amuser un certain temps...)
Au sujet de l'injection SQL, je suis preneur de toutes infos & conseils, également sites/articles, étant donné que je ne connais malheureusement que de nom.
Bon, je me réponds à moi-même personnellement tout seul à la dernière question: les tests montrent ~ 20% d'overhead avec le contrôle des droits intégré à la fonction (table de taille moyenne: 15 colonnes.)
Ça n'est pas beaucoup, et c'est même acceptable SI on prend en compte le contexte des opérations: HD PATA 7200 RPM standard sur lequel cohabite l'OS, mono CPU assez vieux: AthlonXP-2600+, machine non-dédiée, 1.5GB de RAM - on passe de 760ns (sans contrôle des droits) à 950ns de temps d'exécution, mais ça reste... des ns.)
Donc, vu le trafic prévisible (léger: ERP), la pénalité de retard ne grève pas le budget (et surtout question sécurité je ne vois pas mieux.)
JE SUIS LE POUCE DU MONDE!! (ben wai, parce c'est pô encore le pied et que je suis très très loin d'en être le mètre:)