Warning: Declaration of Suffusion_MM_Walker::start_el(&$output, $item, $depth, $args) should be compatible with Walker_Nav_Menu::start_el(&$output, $item, $depth = 0, $args = Array, $id = 0) in /DISK2/WWW/plsql.cz/www/wp-content/themes/suffusion/library/suffusion-walkers.php on line 39
Jun 212014
 

Ahoj, nedávno se mi stala taková nepříjemná věc, kterou bylo upgrade php verze od mého hostingu, což vedlo na rozhození v IE a na čínské znaky v Chromech, Firefoxech a jiných náhrážkách.  Když už jsem musel řešit upgrade PHP, rovnou jsem se rozhodl upgradovat i verzi WordPressu a tudíš přecházím i na nové theme. Vybral jsem něco trošku jiného, tak se snad bude líbit ;)  Což berte jako omluvu za předchozí dny a možná i budoucí, kdy to budu trošku upravovat a ohýbat podle svého gusta.  Jsem ted trošku busy, ale napíšu jsem teda i v pruběhu toho nějaký ten článek – i když jsou měsíce, kdy blog vypadá mrtvě, tak normálně žiju, nic mi nepřejelo.

Dále jsem zavřel komentáře ke všem článkům. Se změnou template by to mohlo vypadat na nedemokratický režim. Pravdou však je, že počet spamových viagra komentářů (i tisíce denně) již přerostl rozumnou úroveň a já jsem se svou prostatou vcelku spokojen.. pokusím se implementovat nějěký human-check a komentáře zase otevřít.

 Posted by at 11:20
Feb 222014
 

Představení další novinky - byla vylepšena funkce SYS_CONTEXT. Dle kapitoly Changes in This Release for Oracle Database SQL Language Reference v manuálu Oracle® Database SQL Language Reference došlo k přidání nového namespace a to konkrétně SYS_SESSION_ROLES. Tedy už jsou nyní dva – USERENV a nová SYS_SESSION_ROLES, která umožňuje zjistit zda-li je role aktivní nebo neaktivní.  Příklad:

sqlplus / as sysdba;
create role developer_role;
grant developer_role to apex_workout;

Nalogování pod apex_workout a :

SET ROLE ALL EXCEPT DEVELOPER_ROLE;

Dříve to bylo zjstitelné z SESSION_ROLES pohledu. Takže spíše než novinka lehce jednodušší a rychlejší přístup. Co stojí za zmínku je, že v případě neexistující role funce vrací FALSE – tzn. to samé jako pro vypnutou roli.

Začal jsem schválně názvem kapitoly ve které se mluví o této novince. Ovšem již tam není zmínka o tom, že v SYS_CONTEXT byl vylepšen namespace USERENV a jsou tu nové atributy. Od pohledu mi připadal seznam atributů delší, takže jsem to začal zkoumat, jinak to však neni uvedeno jako změna, což je škoda, některé nové atributy jsou příjemné. Takže nové atributy:

  • CDB_NAME – jméno CDB, pokud to není multitenant container database tak NULL
  • CLIENT_PROGRAM_NAME - jméno klientského programu
  • CON_NAME - jméno containeru, pokud to není multitenant databáže tak DB_NAME
  • DB_SUPPLEMENTAL_LOG_LEVEL – vrací level v případě supplemental loggingu, jinak null. Možné hodnoty jsou stejné jako supplemental loggingu, tedy ALL_COLUMN, FOREIGN_KEY, MINIMAL, PRIMARY_KEY, PROCEDURAL a UNIQUE_INDEX
  • IS_APPLY_SERVER - pro Oracle Data Guard – true na apply server, jinak false
  • ORACLE_HOME – vrací ORACLE_HOME.  Sexy!
  • PLATFORM_SLASH - oddělovač adresářové cesty na dané platformě
  • SHEDULER_JOB - Y = je to spuštěno v dbms_scheduler,  N – není to spuštěno v dms_scheduler. Hodne sexy, předtím se to řešilo taky pomocí kontextu jestli to má nebo nemé bg_job_id či fg_job_id

U mě to vypadá nějak takto:

Asi bych čekal obrácené lomítko jako path-separator, tuhle instanci mam na Windows. Osatní sedí – nemám Oracle Data Quard, na téhle instanci ani supplemental logging a multitenant db na téhle instnaci také nemám. Hodně se mi líbí atributy SCHEDULER_JOB, CLIENT_PROGRAM_NAME, ORACLE_HOME a PLATFORM_SLASH. Všechno je pouze lehčí cesta než koukání do views (v$database, v$sesssion..). Pochopitelně mimo věcí souvisejících s  multitenant databází (CDB_NAME, CON_NAME) a PLATFORM_SLASH - zde mi nanapadá z hlavy žádné view ze kterého bych to byl schopen vytřískat. So, šikovná věcička.

 Posted by at 02:12
Feb 192014
 

Oracle nově vylepšil ALTER TABLE statement a vylepšil práci s PARTITIONS (i se subky). Nově je možné v jendom příkazu pracovat s více PARTITONS najednou:

  • Přidat jednu/více range, list a system partitions do tabulky
  • Pridat jednu/více range či list subpartitions do partition
  • Rozdělit partition či subpartition na dvě a více partitons či subpartitions – týká se list a range
  • Spojit partition či subpartition na dvě a více partitons či subpartitions – týká se list a range
  • Truncatovat jednu nebo více partition nebo subpartition
  • Truncatovat jednu nebo více partition nebo subpartition

Řadím do spíše do těch užitečnějších vylepšení.  Na zkoušku, že to funguje a na zapamatování, že něco takového je nyní možné – truncate, to je nejednodušší ;) Nicméně implementace a syntaxe je velice podobná pro všechny tyto změny, na 11.2g to vypadalo takto:


Nyní na 12.1c:

Tedy list oddělený čárkama. Takže na zkoušku nějaká tabulka s partišnama a truncate více partitions najednou. Ze studijních důvodů použiji system partitions ;) – těch způsobů jak tabulku partišnovat (top-level) je 7 (co, vím – tzn. minimálně), ale typicky se mluví jen o těch hash, list, range. Zrovna systémové partišnování není moc známé (a ani používané).

CREATE TABLE TBL_TEST_TRUNCATE (slova VARCHAR2(20))
PARTITION BY SYSTEM (
PARTITION p1,
PARTITION p2,
PARTITION p3
);

INSERT INTO TBL_TEST_TRUNCATE PARTITION(p1) VALUES ('Lupíčky');
INSERT INTO TBL_TEST_TRUNCATE PARTITION(p2) VALUES ('Hébičky');
INSERT INTO TBL_TEST_TRUNCATE PARTITION(p3) VALUES ('Kulíškové');
INSERT INTO TBL_TEST_TRUNCATE PARTITION(p2) VALUES ('Kozy');
commit;

A truncate:

ALTER TABLE TBL_TEST_TRUNCATE TRUNCATE PARTITION p1,p2;

Možná za zmínku stojí napsat, že je možné psát TRUNCATE PARTITION i TRUNCATE PARTITIONS. Ať s nebo bez s je možné truncatovat jednu čí více partitions. Oracle tomu řiká “sytnax clarity” a doporučení je psát to bez s nakonci pokud truncatuju jednu a opačně.

 Posted by at 12:46
Feb 012014
 

Jedna z nejužitečnějších věcí, které máme nově k dispozici. Nyní je ve 12c možnost v SQL selectu uvést WITH sekci a v ní nově PL/SQL funkci, což je mazec ;) Rozhodl jsem se rozhodit to do dvou postů – protože je to samé možné udělat i s UPDATE, DELETE, INSERT i MERGE – ovšem je na to třebas nový hint WITH_PLSQL.

Zkrátka – nyní lze definovat PL/SQL funkce přímo v SELECTu. Nejprve možná pro připomenutí, jak vypadá klasické WITH:

with pojmenovano as
(select dummy as my_dummy from dual)
select
my_dummy
from pojmenovano;

A takto se tam dá naférkovu nyní natláskat PL/SQL funkce:

with function with_result(x varchar2) return varchar2
is
begin
return x|| ' - x';
end;
select
with_result(dummy) as with_result_on_dummy
from dual;

To by bylo asi vše k WITH a PL/SQL funkci. Ohledně omezení – platí stejná jako pro pro volání standardní funkce v selectu z databáze. Příště určitě WITH_PLSQL hint a jak se to dá použít v DML.

 Posted by at 11:52
Jan 272014
 

Další z novinek ;) Tentokrát to bude velice krátké, pro dnešek jsem vybral novou funkci, která je dostupná ve dvanácce a jmenuje se STANDARD_HASH. A její účel asi nikoho nepřekvapí – vrací zahashovaný vstup s tím, že k dispozici jsou následující algoritmy pro hash:

  • SHA1 (deafult) – 160bitů. Je třebas připomenout, že SHA1 byla z kryptografického hlediska (nikoliv uživatelského) prolomena a kolizi jsme schopni nalézt dříve než v teoretických 2^80, konkrétně podle wikipedie v 2^61. Což je pouze prolomeno z té teoretické části, z praktické je to pořád ještě nepoužitelné. Nicméně jak nám řikali někdy na vejšce, je třebas po tomhle důkazu od této funkce pomalu ustupovat. Microsoft to hodlá udělat v 2017.
  • SHA256, SHA384, SHA512 – 256, 385, 512 bitů. Tyto hashe ještě nebyly žádným způsobem nabořeny takže “clear” i pro tu největší bezpečnost. Pochopitelně to něco stojí, o proti SHA1 je to cca 20-25% výkonu (podle wiki, vnitřní implementaci Oracle jsem neměřil)
  • MD5 - 128bitů. Kryptograficky i uživatelsky prolomená z pohledu kolizí. Kolize jsme schopni hledat skoro v runtime pro libovolný vstup. Není to tak dlouho, co to bylo dokázáno a konkrétně za tím stál čech pracující na MatFyzu – Vlastimil Klíma a pokud si dobře pamatuju, tak paralelně s ním bořil MD5 tým Wangové v Číně, ale to neni tak podstatné – nebyli první a Wang se jmenuje půlka Číny ;) Určitě se hodí pro výpočty, kde nám nejde úplně o bezpečnost, patrně to bude sprinter (podle wiki až dvakrát rychlejší než SHA*)

Oracle pochopitelně nepřišel s HASHema až nyní, ale byly k dispozici již dříve – ale pouze jako procedury v PL/SQL balících DBMS_CRYPTO a DBMS_OBFUSCATION_TOOLIKIT. V SQL byla pouze silně kolizní ORA_HASH (32bit). Takže nyní plně v “pure” SQL pomocí funkce STANDARD_HASH (a opět chybí sůl). Příkla z duálu:

select
standard_hash('Budlíky') as default_sha1,
standard_hash('Budlíky','SHA1') as default_explicit_sha1,
standard_hash('Budlíky','MD5') as MD5,
standard_hash('Budlíky','SHA256') as SHA256,
standard_hash('Budlíky','SHA384') as SHA384,
standard_hash('Budlíky','SHA512') as SHA512
from dual;

Výsledek:
Poznámky:

  • Vrací typ RAW
  • Nelze použít na LOBy a LONGy

To by mohlo být vše ;) Ještě link na přednášku Vlastimila Klímy pár měsíců po té, co prolomil md5. Přednášku jsme měli někde na FELu v rámci CryptoFestu : Video z AVC ČVUT.

 Posted by at 23:32
Jan 262014
 

Jednou z novinek 12náctky je i adaptivní exekuční plán – ještěj sem neměl čas se do toho ponořit, ale je to jedna z novinek na kterou jsem se hodně těšil ;). Narazil jsem náhodou na video, jehož spoluautorem je Tomas Kyte, a které to velice pěkně ukazuje. Určitě stojí za to si to vyzkoušet sám, ale video je opravdu kvalitní, těch 6 minut času za to stojí, so enjoy:

 Posted by at 03:57
Jan 262014
 

Dlouho jsem tu neukázal nějakou novinku a sám si ani nehrál – když pominu zklamání z novinky, která slibovala více indexů nad stejným setem sloupců. Přiznám se, že se mi moc nelíbí :/. Před vydáním v novinkách Oracle sliboval možnost více indexů nad stejnými sloupci, pokud budou mít jiné attributy – nedávno jsem koukal na implementaci a jiné atributy jsou chápány jako – jiný typ bitmap/b*tree, jiné partišnování, a unikátní/neunikátní. Čekal jsem víc – jako, že bude stačit, když se budou lišit tablespacem, kaluzulí paralllel apod. Navíc visible může být jen jeden (čekal jsem, že CBO si bude on-line vybírat lepší). Takže nakonec – seriously – nic moc.

Ale to byla jen taková stížnost. Dnes zařazuji do novinek něco, čemu Oracle řiká WHITE LIST, ale v manuálu je lepší hladat ACCESSIBLE BY klauzule.

O co jde? Určitě jste někdy pracovali na systému, který je otevřený a semtam je třeba opravit data, něco naspouštět, něco ohnout. Čapnout nějký kus kódu do clipboardu, hodit to žábě nebo (PL/)*SQL Developeru a spustit to. Nebo prostě spustit nějakou funkci z ruky. A nikdo z nás není neomylný, takže kdybych měl udělat top-list chyb bylo by to něco jako:

  • Špatně zadané parametry
  • Špatný čas (pitomý lock), neodhadnutí performace atd.
  • Špatné schéma

A jedna z typicky dalších chyb je, že programátor něco pustí a už nepustí nějakou další část, která je z buisness logiky důležitá. Spustíte proceduru, která sype data do tabulky a neuvědomíte si, že večer předtím běží job, který nad to tabulkou zakládá partitions. Spustíte procku na úpravu objednávky a neuvědomíte si, že když to spuští orgininál aplikace, že to někam loguje atd..

Oracle ACCESSIBLE BY klauzule umožňující nadefinovat procky/funkce/triggery/typy pouze ze kterých je možné daný kód pustit. Takže příklad, mějme funkci, která dejmetomu upravuje zákazníka:

create or replace procedure prc_print_ha accessible by (prc_call_with_log)
as
begin
dbms_output.put_line('Zde by se upravoval zákazník');
end;

Co je nového je červeně označená nová klauzule accessible by, která říká že jediný, kdo může vyvolat funkci prc_print_ha je prc_call_with_log (pro takovéto syntax clarity před to je vhodné napsat slovo procedure, aby bylo na první pohled vidět).  Takže když vyvolám z ruky (ve stejném schématu) samostatnou funkci prc_print_ha:

begin
prc_print_ha;
end;

Tak díky nastavenému white listu jsem vyfuckován:

Error report:
ORA-06550: řádka 2, sloupec 1:
PLS-00904: insufficient privilege to access object PRC_PRINT_HA
ORA-06550: řádka 2, sloupec 1:

Takže následuje založení procedury, která se jmenuje prc_call_with_log.  Ano, můžu založit až ex-post. Když zakládám proceduru/funkci s accessible by kaluzulí, tak nemusí programové jednotky ve white listu ještě existovat a přesto se to správně zkompiluje.

create or replace procedure prc_call_with_log as
begin
dbms_output.put_line('!zde se upravuje zákazník by '||user);
prc_print_ha;
dbms_output.put_line('done');
end;

A pokud nyní zavolám prc_call_with_log, tak jsem v cajku. Prc_call_with_log má právo volat prc_pring_ha a tedy výsledek na output je:

!zde se upravuje zákazník by AZOR
Zde by se upravoval zákazník
done

A tedy není žádná možnost upravit zákazníka (Zde by se upravoval zákazník) aniž bych to nezalogoval (!zde se upravuje zákazník by AZOR; done). Moc šikovná věcička! Která doufám, že bude hojně využivána. Těch chyb vzniklých spuštěním pouze části kódu aplikace z ruky už jsem viděl dost ;) Co k tomu říct? Je možné v accessible by vyjmenovat i procedury/funkce/triggery/typy/package z jiného schématu, pak je třebas schéma explicitně uvéct, něco jako accessible by (procedure azor3.haf, package uservasik.pck_metal). Co je ještě zajímavé je, že to vyfuckuje i SYSa – ani SYS nemá tu sílu pustit funkci s white listem jinak než přes vyjmenované jednotky ve white listu (a pochopitelně případný alter programové jednotky a změnu white listu).

 Posted by at 03:27