From lost to the river.

Toni Tassani's blog about books, comics, agile, software development, java, Linux, Oracle, Barcelona and whatever. In English, Catalan or Spanish
ORA-24247: network access denied by access control list (ACL)
UTL_HTTP
. I això funcionava perfectament a la 10g. El més fort és que fent servir un procediment anònim funcionava i amb un procedure no.declare
l_http_req utl_http.req;
begin
l_http_req := utl_http.begin_request ('http://alapamui.blogspot.com/', 'POST');
utl_http.end_request(l_http_req);
end;
/
create or replace procedure test_http is
l_http_req utl_http.req;
begin
l_http_req := utl_http.begin_request ('http://alapamui.blogspot.com/', 'POST');
utl_http.end_request(l_http_req);
end;
/
begin
test_http;
end;
/
UTL_HTTP
podia accedir a qualsevol URL, però a la 11g han incorporat un mecanisme més fi basat en ACL (Access Control Lists).BEGINSi el que cal és accedir a una pàgina per HTTPS, cal configurar també els certificats a l'Oracle o obtindreu un error com el següent:
DBMS_NETWORK_ACL_ADMIN.create_acl (
acl => 'alapamui.xml',
description => 'Alapamui ACL',
principal => 'ALAPAMUI',
is_grant => TRUE,
privilege => 'connect',
start_date => SYSTIMESTAMP,
end_date => NULL);
COMMIT;
END;
/
BEGIN
DBMS_NETWORK_ACL_ADMIN.assign_acl (
acl => 'alapamui.xml',
host => 'alapamui.blogspot.com',
lower_port => NULL,
upper_port => NULL);
COMMIT;
END;
/
ORA-29024: Certificate validation failure
orapki
.
SEQUENCES
són que no estan directament associades a una taula i que pot ser que generin números que ja existeixen i donaran errors de clau duplicada.EMPLEATS
i DEPARTAMENTS
, els hi donarem els noms curts EMP
i DEP
, i les seves seqüències associades seran SEQ_EMP
i SEQ_DEP
.MET_TABLES(table_name, short_name)
, per exemple. Així fem nosaltres la feina que no ens fa l'Oracle automàticament.despendoleitor.sql
, li dèiem) que omplia aquesta taula de metadades amb dos columnes més: max_value
i current_seq
. La primera columna l'omplia amb el SELECT MAX(*)
per cada taula i la segona amb el valor que retornaria un NEXTVAL
de la seqüència associada (obtingut directament des de USER_SEQUENCES
).DROP
i un CREATE
de la SEQUENCE
amb un valor per sobre del màxim.ALTER
de la seqüència per modificar l'INCREMENT BY
, fer-li un NEXTVAL
, i restaurar-li l'INCREMENT BY
que tenia. També desactivem el CACHE
abans de fer el NEXTVAL
i desprès el restaurem, però això no seria tan important.CREATE OR REPLACE PROCEDURE sequence_updater(
p_owner IN VARCHAR2
,p_sequence_name IN VARCHAR2
,p_last_number IN NUMBER
)
IS
v_last_number NUMBER;
v_increment_by NUMBER;
v_cache_size NUMBER;
v_new_increment NUMBER;
v_last_value NUMBER;
v_aux NUMBER;
BEGIN
SELECT last_number, increment_by, cache_size
INTO v_last_number, v_increment_by, v_cache_size
FROM all_sequences
WHERE sequence_owner = p_owner
AND sequence_name = p_sequence_name;
v_new_increment := p_last_number - v_last_number;
IF v_new_increment != 0 THEN
EXECUTE IMMEDIATE 'ALTER SEQUENCE '|| p_owner ||'.'||p_sequence_name
|| ' INCREMENT BY '|| v_new_increment ||' NOCACHE';
EXECUTE IMMEDIATE 'SELECT '|| p_owner ||'.'
|| p_sequence_name ||'.nextval FROM DUAL' INTO v_aux;
EXECUTE IMMEDIATE 'ALTER SEQUENCE '|| p_owner ||'.'||p_sequence_name
|| ' INCREMENT BY '||v_increment_by ||' NOCACHE';
LOOP
EXECUTE IMMEDIATE 'SELECT '|| p_owner ||'.'
|| p_sequence_name ||'.currval FROM DUAL' INTO v_last_value;
EXIT WHEN v_last_value >= (p_last_number - 1);
EXECUTE IMMEDIATE 'SELECT '|| p_owner ||'.'
|| p_sequence_name ||'.nextval FROM DUAL' INTO v_last_value;
END LOOP;
IF v_cache_size != 0 THEN
EXECUTE IMMEDIATE 'ALTER SEQUENCE '|| p_owner ||'.'
||p_sequence_name || ' CACHE '|| v_cache_size;
ELSE
EXECUTE IMMEDIATE 'ALTER SEQUENCE '|| p_owner ||'.'
||p_sequence_name || ' NOCACHE';
END IF;
END IF;
END sequence_updater;
/
EXEC SEQUENCE_UPDATER('NOM_DE_TAULA', 'TAB_SEQ', 3824);
SEQUENCE_UPDATER
. Imagino que amb el data pump també es pot fer una exportació de només les seqüències, però crec que serà més ràpid l'execució del script.SERIAL
, Microsoft SQL Server els IDENTITY
i MySQL té l'atribut AUTO_INCREMENT
. Hi ha una comparació de mecanismes de generació de claus força interessant, que també explica cóm proposa l'estàndard que s'hauria d'implementar (que les anomena IDENTITY
).SEQUENCE
, que s'ha de fer servir per obtenir els valors abans de fer un INSERT
amb l'operador NEXTVAL
.SEQUENCE
determinada amb una taula, o no fer servir cap. Per aquesta raó és fàcil que es donin casos anòmals. Pot succeir que la taula T(id, camp)
contingui registres amb els valors per id
1, 12, 23 i 53, i que la seqüència que s'acostuma a fer servir per les seves insercions tingui el valor 24 per què, per exemple, algú ha inserit el valor 53 sense fer servir la seqüència. Podrem fer insercions fent servir la seqüència fins que s'arribi al valor 53, que ens donarà un error al trobar un valor duplicat.SEQUENCES
i valors a les taules és més freqüent del que sembla, i no té una solució general. De fet, aquest problema es pot produir si has fet una exportació d'una base de dades mentre estava en activitat, ja que primer exporta les metadades (i les seqüències ho són) i després les dades i fa les dues operacions amb bloquejos diferents.SEQUENCES
.