Dans cet article, je vais vous dire comment j'ai sérieusement pensé à une alternative à Oracle. Mais qu'en est-il de Postgre, dites-vous? Oui, mais il y a des nuances. Nous allons d'abord traiter de la question "Pourquoi Oracle?"
Logique métier dans notre base de données. Dans le livre Oracle pour les professionnels, Tom Kite écrit
Lors du développement d'applications de base de données, j'utilise un mantra très simple:
si possible, faites-le avec une seule instruction SQL;
si cela ne peut pas être fait avec une seule instruction SQL, faites-le en PL / SQL;
si cela ne peut pas être fait en PL / SQL, essayez d'utiliser une procédure stockée Java;
si cela ne peut pas être fait en Java, faites-le comme une procédure externe en C;
si cela ne peut pas être implémenté en tant que procédure externe en C, vous devez sérieusement réfléchir à la raison pour laquelle cela est généralement fait ...
et dans la conception du système, je respecte cette règle. Les types d'objets dans Oracle sont particulièrement agréables; avec leur aide, une logique métier complexe est magnifiquement et commodément implémentée selon tous les canons de la POO.
Oracle coûte cher. L'acheter et ne pas utiliser tout ce qu'il contient sera une erreur.
Et pourtant, il y a toujours un facteur d'équipe et de compétences. Si votre équipe a tout développé chez Oracle depuis dix ans, la publication de Postgre peut être pénible.
Oracle coûte cher. Si cher que vous pouvez écrire plusieurs fois à ce sujet et ne pas penser à la nécessité d'Oracle dans un nouveau projet sera une erreur.
Plusieurs fois déjà, je suis tombé sur des publications sur le produit coréen Tibero, soi-disant créé pour remplacer Oracle. Et maintenant, ils ont un attrait d'une générosité sans précédent - Les licences standard sont distribuées presque gratuitement aux développeurs, pour un dollar pour un socket. Donc, nous comprenons: ce que les Coréens peuvent offrir en ce moment. Avec les voitures, après tout, ils ont déjà (presque) réussi!
Description de l'expérience
Les représentants de TMaxSoft disent que Tibero est presque 100% compatible avec Oracle et qu'il existe un utilitaire pour la migration de la base de données. J'ai décidé de prendre ma base de produits, avec une logique métier dans Oracle, en utilisant tout le charme de la POO en PL \ SQL, et de la transférer vers Tibero. Dans cette publication, nous ne considérons pas la migration des données elle-même, elle est moins intéressante, et je n'ai pas encore essayé une migration complète.
La tâche est la suivante:
1. Tables de transfert.
2. Transfert d'index, de clés, etc.
3. Transférez les paquets et les déclencheurs.
4. Transfert des types d'objets.
Mais d'abord, parlons des outils.
Les outils
Google en sait peu sur Tibero. Nous avons téléchargé la base de données elle-même sous la forme d'une machine virtuelle sur laquelle tout a déjà été déployé. Il n'y a que deux outils: un utilitaire pour migrer T-UP et un IDE pour DBA et le développeur tbAdmin. Tout se fait en Java, s'exécute n'importe où, en théorie.
T-UP ressemble à ceci:
Fenêtre principale: connexions à la base de données.
Si vous cliquez sur Options, vous pouvez configurer quelque chose.
Plus important encore, vous pouvez sélectionner les types d'objets à migrer.Aucune instruction, aide, astuces n'a pu être trouvée.
Cela donne l'impression d'un utilitaire fait maison. Parfois, elle s'envolait avec des exécutions, mais elle travaillait au besoin.
Le deuxième outil est l'IDE Tibero Admin. Il peut être téléchargé à partir du site Web de TMaxSoft si vous vous y inscrivez d'abord. Vous pouvez également y obtenir une licence de démonstration.
Tibero Admin ressemble à un ancien IDE typiqueJe suis habitué à l'excellent outil de développement PL / SQL d'Allround Automations. Dans Tibero Admin, oubliez les invites contextuelles, rien n'apparaîtra sur votre écran après avoir cliqué sur le «point», il ne vous ajoutera pas les noms des tables et des objets. Tapez simplement le code, vous les programmeurs. Aide, documentation? Non. Il existe une documentation sur le SGBD sur le site Web du fabricant, un tel intéressant ... sans recherche. Aucune documentation n'a été trouvée pour l'IDE. Cependant, il n'y a rien de compliqué. Il y a eu des problèmes d'autorisation - il s'est avéré que l'utilisateur devait se voir accorder des droits DBA pour accéder à tbAdmin. Et intéressant avec les ports
, 8630 est pour SYS, pour tous les autres 8629 .
Bugs IDE. De temps en temps, lorsque vous piquez quelque part, l'
index des messages
hors des limites s'envole, un message comme
java.lang.Exception: engagement Succeeded est très effrayant. Il est nécessaire de prendre en compte différents types de fenêtres SQL et PSM: dans le premier, il est peu probable que vous compiliez du code programme, dans le second, vous n'exécuterez pas la demande. Après PL / SQL Developer - un misérable semblant de main gauche ...
Se rendre à l'expérience.
Migration de table
Nous sélectionnons le schéma dans T-UP, cliquez sur Migrer, sélectionnez d'abord les «tables» dans les options et le processus de transfert commence. J'ai rencontré deux problèmes.
TABLESPACES. J'ai décidé de les transférer sur des tables, mais Tibero semble avoir essayé de leur réserver autant d'espace qu'ils occupent dans la base de données source. Et c'est beaucoup, et il ne pouvait pas. J'ai créé les espaces table manuellement, puis tout s'est bien passé.
En plus des tableaux avec des valeurs de date par défaut de type '31 .12.2019 '. Dans les paramètres Oracle, nous avons ce format enregistré, pour Tibero cela aide
alter session set nls_date_format='DD.MM.YYYY';
mais il n'y a nulle part où T-UP peut le faire. Des collègues de TMaxSoft ont conseillé de définir la variable TB_NLS_DATE_FORMAT = "DD.MM.YYYY", mais cela ne m'a pas aidé personnellement. J'ai peut-être fait quelque chose de mal. J'ai dû créer des tableaux avec de tels paramètres manuellement, il n'y en a pas beaucoup.
Résultat de la première étape: le déplacement de la structure de table d'Oracle vers Tibero fonctionne bien.
Clés et index.
Nous sélectionnons les cases INDEX, CONSTRAINT dans T-UP et forward. Des problèmes sont survenus avec CHECK en raison de la même situation avec la date. En général, les index, clés primaires, contrôles - ont été créés. Mais je n'ai pas pu trouver de clés étrangères dans la base de données fraîchement créée. Et la migration des constantes se termine dans le journal T-UP avec le message
"Échec de la migration: java.lang.NullPointerException". Coïncidence? Je ne pense pas ...
Packages et déclencheurs.
Dans les triggers je n'ai rien de compliqué, ils ont été créés parfaitement. Certes, je n'ai pas vérifié comment ils fonctionnent, ce sera une histoire distincte.
Parlons des procédures et des fonctions qui implémentent une partie de la logique. Ici, malheureusement, tout ne s'est pas parfaitement déroulé.
D'un simple: dans l'
armée de Tibero il n'y a pas de mot
NOUVEAU . La construction o: = NEW t_my_type () ne se compilera pas. Dans Oracle, c'est vrai, pas obligatoire, mais j'ai toujours écrit pour une raison quelconque. J'ai dû supprimer.
Le rôle DBA permet à SQL Window d'accéder à toutes les tables. Cependant, lors de la compilation d'un package ou d'une procédure dans un schéma avec un tel rôle, lorsque vous utilisez des tables et des objets d'un autre schéma, vous devez attribuer l'autorisation correspondante à l'objet. La magie du rôle DBA n'aide pas ici.
Du spécifique. J'ai un étrange FORALL dans ma base de données, qui fonctionne cependant.
Tibero dit que
"la déclaration dml doit avoir un paramètre d' entrée en
bloc pour toute fermeture" . Et je le comprends au fond, mais ce code a dû être refait dans un cycle régulier.
La situation avec des tables contenant des objets est pire.
CREATE OR REPLACE TYPE S1.TYPE_PAY_HIST AS OBJECT ( pay_status_id NUMBER(1), stamp DATE ); CREATE OR REPLACE TYPE S1.TABLE_PAY_HIST AS VARRAY(10) OF type_pay_hist; create table S2.RECEIPT ( receipt_id NUMBER(8) not null, pay_sum NUMBER(12,2) not null, receipt_hist S1.TABLE_PAY_HIST ); FUNCTION receipt_status_change(p_cmr_receipt_id NUMBER, p_new_status NUMBER) RETURN NUMBER AS l_receipt_hist s1.table_pay_hist; l_type_pay_hist s1.type_pay_hist; l_status NUMBER; BEGIN BEGIN SELECT receipt_hist INTO l_receipt_hist FROM receipt p WHERE p.receipt_id = p_cmr_receipt_id FOR UPDATE; EXCEPTION WHEN NO_DATA_FOUND THEN RETURN c_err_not_find_status; END; ... END;
Nous avons une erreur de compilation, tapez mistmatch.
Les gars de TMaxSoft ont proposé cette version du code:
create or replace FUNCTION .... AS l_receipt_hist table_pay_hist; l_type_pay_hist type_pay_hist; l_status NUMBER; cmr_receipt_row cmr_receipt%rowtype; BEGIN BEGIN SELECT * INTO cmr_receipt_row FROM cmr_receipt p WHERE p.cmr_receipt_id = p_cmr_receipt_id FOR UPDATE; SELECT TYPE_PAY_HIST(r.pay_status_id,r.stamp) bulk collect INTO l_receipt_hist FROM cmr_receipt p,table(p.receipt_hist) r WHERE p.cmr_receipt_id = p_cmr_receipt_id; EXCEPTION WHEN NO_DATA_FOUND THEN dbms_output.put_line('NO_DATA_FOUND'); RETURN null;
Ça marche ça marche probablement. Mais pas si pratique, et il faut refaire le code.
Le reste est compilé normalement, sauf pour des choses spécifiques comme SDO_GEOM. Et en passant, Tibero a un analogue. Ses mains n'avaient pas encore atteint son bureau.
Les types
Dans l'un des projets, nous utilisons la puissance de OOP by Oracle hollow.
La question la plus excitante pour Tibero était à ce sujet.
Nous créons un certain type, qui est basique pour un ensemble d'autres types.
CREATE OR REPLACE TYPE t_tar_object AS OBJECT ( id NUMBER(12), smth NUMBER(12), CONSTRUCTOR FUNCTION t_tar_object RETURN SELF AS RESULT, MEMBER FUNCTION target(param IN NUMBER DEFAULT NULL) RETURN NUMBER, MEMBER FUNCTION inside(o t_tar_object) RETURN NUMBER, MEMBER FUNCTION clone RETURN t_tar_object ) NOT FINAL;
Et maintenant, nous essayons de lui créer un digne héritier.
CREATE OR REPLACE TYPE t_tar_service UNDER t_tar_object ( is_virtual NUMBER(1), CONSTRUCTOR FUNCTION t_tar_service (p_serv_obj t_tar_object, p_main_id NUMBER, p_pack_id NUMBER) RETURN SELF AS RESULT, OVERRIDING MEMBER FUNCTION target(param IN NUMBER DEFAULT NULL) RETURN NUMBER, OVERRIDING MEMBER FUNCTION clone RETURN t_tar_object ) NOT FINAL;
Le compilateur refusera de remplacer la fonction cible. Cependant, il n'y a pas de questions sur la fonction clone. Il s'est avéré que Tibero n'aimait pas OVERRIDING lorsque la méthode a des paramètres. D'accord, supprimez le mot OVERRIDING. Mais c'est alarmant, et nous écrivons des scripts de test. Jusqu'ici avec le type parent.
declare o1 t_tar_object; i1 number := 100; begin o1 := t_tar_object; o1.id := 1; i1 := o1.target;
Il semble que nous n'ayons pas laissé de choix au programme, quelle que soit la valeur de la variable i1, quelque chose devrait apparaître en sortie. Mais ... rien n'apparaît!
Je me suis immédiatement souvenu d'un grand filmCette bizarrerie ne s'arrête pas là. Aggraver l'expérience
declare o1 t_tar_object; i1 number := 100; begin o1 := t_tar_object; o1.id := 1; i1 := o1.target;
Même le fait qu'après toutes les manipulations avec les méthodes de l'objet, nous fixons de manière rigide la valeur de la variable, ne change rien - la sortie est vide.
Expérience de contrôle, testez-vous pour la folie:
declare o1 t_tar_object; i1 number ; begin o1 := t_tar_object; o1.id := 1;
Le «grand» chéri apparaît dans la sortie. Flippant, n'est-ce pas? En utilisant un coup scientifique, les gars de TMaxSoft ont découvert que si vous supprimez la nuance "NOT FINAL" de la spécification t_tar_object, alors l'objet se comportera de manière appropriée. Mais alors pourquoi avons-nous besoin d'un tel ... sans héritiers.
Il est inutile de parler davantage de la POO à Tibero. Comme, en fait, le POO à Tibero. Après cela, une autre question se pose: et le code de procédures et de fonctions qui a compilé - fonctionne-t-il correctement? Je ne sais pas encore. Une énorme quantité de code a immigré et compilé. Pour un projet qui ne contient pas les types d'exercices ci-dessus, c'est un succès certain. Mais tester la bonne exécution du code est une tâche sérieuse. Et pour être honnête, je ne m'attendais pas à la rencontrer. Je ne serai pas prêt à dire si j'aurai un projet sur ce SGBD. Mais si c'est le cas, le développement se fera sur Oracle, à l'aide d'outils normaux et avec une migration régulière vers Tibero. Écrire du code dans l'EDI sans invites contextuelles et avec des erreurs périodiques de l'interface elle-même est un plaisir en dessous de la moyenne.
Conclusions
Tibero a-t-il un avenir dans son état actuel? Pas sûr. Après tout, si vous regardez le coût des licences hors mégascale, un socket standard coûte environ 800 000. Ce qui est moins cher qu'Oracle, mais pas parfois. Et comme j'étais convaincu de ma propre expérience, jusqu'à présent, ce n'est même pas près d'Oracle.
Est-il judicieux d'utiliser le Tibero presque gratuit qui est offert maintenant? Peut-être que oui. Ils disent que lors du paiement du coût du support technique (99 000 roubles par an pour une prise), il est permis d'utiliser cette base dans des projets commerciaux. Si vous avez une équipe d'oracleistes disponibles et que vous devez créer et placer quelque chose de pas trop compliqué sur votre serveur, mais moins cher et plus rapide - une option intéressante. Vous pouvez toujours jouer la carte des sanctions, en disant aux clients en difficulté que la Corée n'est pas les États-Unis.
Dois-je traduire des projets existants d'Oracle vers Tibero? Pas question. Il n'y a aucune raison de rechercher une telle aventure. Il est plus facile de renoncer au support technique Oracle et de ne rien payer à personne.
Et si vous devez créer une nouvelle instance d'un ancien projet exécuté sur Oracle? Et par conséquent, acheter de nouvelles licences? Pensez-y ici. Il est possible que votre base migre et fonctionne de manière qualitative. Mais pensez immédiatement à soutenir deux domaines du projet, ou traduisez tout en Tibero. Nous considérons les coûts de main-d'œuvre, les risques et les avantages des licences moins chères. Comparez, décidez.
Peut-être que dans la prochaine version de Tibero, tout sera différent. Il suffit de terminer les types, de faire un IDE normal, peut-être de changer la politique de prix. Et si le SGBD est le même qu'avec les voitures, alors après 5 ans, les Coréens peuvent occuper une part de marché importante et supplanter l'hégémonie. On verra.
PS
Un sérieux avantage lors du choix d'un SGBD pour un nouveau projet peut être le travail du support technique de TMaxSoft. Je n'ai même pas acheté de licence pour un dollar, et les gars m'ont répondu très rapidement, clairement intéressés. Ils ont aidé à la fois avec des questions stupides et celles décrites ici. Le retour est excellent.