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 0
Mar 092013
 

Dnešní rychlotip s číslem 20 je věnován vcelku neznámému, ale o to více užitečnému, příkazu CREATE SCHEMA.  Možná to má lehce matoucí název – nemá to relaci na vytvoření schéma jako takového a klasicky schéma je vytvořeno pomocí CREATE USER. Příkaz CREATE SCHEMA slouží k vytvoření několika objektů (tabulek, view a grantů) v jedné transakci. Což se typcky hodí při nějakém updatu systému/nasazení RFC – kdy je třeba nasadit více tabulek – pomocí CREATE SCHEMA je od Oracle zaručeno, že to proběhne “jako transakce” – tedy všechno nebo nic. Normálně je CREATE TABLE příkaz typu DDL, takže se při releasu může povéct založit jen nějaké tabulky a ostatní vyhodí chybu – což bohužel vykazuje nějaký effort na srovnaní nebo to všechno vydropovat, vylézt zpět na strom a spustit to celé znovu.

Tedy jednou větou – CREATE SCHEMA umí v jedné transakci založit více objektu v jedné transakci, konkrétně:

  • CREATE TABLE
  • CREATE VIEW
  • GRANT

Podporovaných DDL je opravdu málo a navíc neexistuje inverzní operace DROP SCHEMA, ač v SQL-1999 standard tento příkaz podporuje.

Jediné omezení je na CRETE TABLE – parallel je povoleno, ale ve skutečnosti parallně tabulky v CREATE SCHEMA nejsou zakládány a běží to seriově.

CREATE SCHEMA AUTHORIZATION dot
CREATE TABLE TEST_A (A NUMBER)
CREATE TABLE TEST_B as select 1 FROM DUAL
CREATE VIEW TEST_C as select * from all_objects
GRANT SELECT ON TEST_A TO SCOTT;

Synaxe je jednoduchá CREATE SCHEMA AUTHORIZATION <user_schema> a pak seznam tabulek, view a grantu bez středníku, středník až na konci, který zavírá statement CREATE SCHEMA.

Takže po spuštění:

SQL Error: ORA-02425: nepodařilo se vytvořit tabulku
ORA-00998: tento výraz je třeba pojmenovat alternativním jménem sloupce
02425. 00000 - "create table failed"

Protože jsem jelito a hajdalák a v TEST_B selectuji jedničku z dualu a nedal jsem tam alias, nicméně alespoň důkaz, že opravdu CREATE SCHEMA funguje a nezaložila se tabulka TEST_A ani nic jiného:

Create schema - Fail

Create schema - Fail

Takže po opravě:

CREATE SCHEMA AUTHORIZATION dot
CREATE TABLE TEST_A (A NUMBER)
CREATE TABLE TEST_B as select 1 as haf FROM DUAL
CREATE VIEW TEST_C as select * from all_objects
GRANT SELECT ON TEST_A TO SCOTT;

Je výstup následující:

schema AUTHORIZATION created.

A nyní test, že se všechno založilo i nagrantovalo:

Create schema- Success

Create schema- Success

Pro nasazovací scripty šikovná věcička, co?

 Posted by at 23:08

  2 Responses to “Rychlotip #20 – CREATE SCHEMA”

  1. I have report I am anilyzang. Its an oracle standard report. If I check the log file for this report , it shows me the ORA-00942 error in the beginning but successfully completes the report. But this report takes a long time to run around 180 minutes to complete. DO you think this error may be causing it to delay. SHould be grant any connect or select access to the views/tables will help reducing the time to run this report. Any help is appreciated.Thanks

  2. Hi, nice to see you on my blog – pretty nice see some guy from different country. But I m sorry I can not help you if you do not specify your trouble. I do not know what you mean by “Oracle standard report” there are a thousands and thousands reports from Oracle. “DO you think this error may be causing it to delay.” Highly probable – NOT. Oracle (self) does not any treshold to consider table as not existing after some delay. But missed grand on table of course can raise a ORA-00942 (if table exists, highly probably you do not have access or missing schema name or something like that). But fix the ORA-00942 will NOT SPEED UP your report. Probably it will slow down your report – now table will exists. Raise ORA-00942 (and this part probably does not working) is much FASTER then found the table and do some stuff.

 Leave a Reply

(required)

(required)

(required)

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>