Tanto en el lenguaje SQL, como en el lenguaje PLSQL. La precedencia de operadores es la siguiente:
Lo aconsejable es utilizar paréntesis para ver explícitamente lo que se quiere y facilite el entender.
Para más información en: Oracle
Mostrando entradas con la etiqueta PLSQL. Mostrar todas las entradas
Mostrando entradas con la etiqueta PLSQL. Mostrar todas las entradas
viernes, 24 de junio de 2011
domingo, 17 de abril de 2011
Activar/desactivar todas las constraints de todas las tablas. Oracle.
«Si lo que buscas es cómo activar, desactivar u obligar UNA constraint; mira la entrada: Modificar el estado de una constraint»
Para activar o desactivar todas las constraints de las tablas de un esquema he creado dos procedimientos.
El procedimiento dis_all_cons se encargará de desactivar todas las constraints de las tablas de un usuario determinado, por defecto el usuario que invoca el procedimiento.
El usuario que ejecuta el procedimiento debe de ser capaz de tener acceso a las tablas del esquema en cuestión y poder realizar un ALTER sobre ellas.
El procedimiento intentará desactivar las constraints en cascada, así que si existen tablas en otro esquema que hacen referencia (foreign key) a una del esquema del que queremos desactivarlas (primary key) también las desactivará, y si no tenemos permisos fallará. El procedimiento que las activa ena_all_cons no tiene en cuenta a estas constraints que se encuentran en otros esquemas. Espero hacerlo en algún momento, ya que no sé cómo hacer una activación en cascada fácilmente.
Podemos consultar previamente la información de las constraints de las tablas del esquema que queremos modificar y ver su estado entre otras cosas.
Ejemplo utilizando el esquema SCOTT
Ejemplo utilizando el esquema SCOTT
select table_name,constraint_name,constraint_type,status,r_constraint_name
from all_constraints
where owner='SCOTT';
from all_constraints
where owner='SCOTT';
create or replace procedure dis_all_cons
( p_owner varchar2 default USER
)
from all_constraints
where owner=p_owner
and status<>'DISABLED'
and ( (constraint_type in ('P')
and table_name not in
(select table_name
from all_tables
where owner=p_owner
and iot_type is not null
)
)
or constraint_type in ('C','U','R')
)
)
loop
execute immediate 'alter table '||p_owner||'.'||reg.table_name||' DISABLE constraint '||reg.constraint_name||' cascade';
end loop;
end dis_all_cons;
/
------------------------------------------------------------------------------------------
create or replace procedure ena_all_cons
(
p_owner varchar2 default USER
)
( p_owner varchar2 default USER
)
--Uso: dis_all_cons[('esquema')];
--dis_all_cons; --desactiva las constraints del esquema de quien ejecuta
--dis_all_cons('HR'); --desactiva las constraints del esquema HR
--dis_all_cons; --desactiva las constraints del esquema de quien ejecuta
--dis_all_cons('HR'); --desactiva las constraints del esquema HR
--el procedimiento se ejecutará con los permisos de quien lo invoca
authid current_user
as
begin
--obtenemos nombre de la tabla y nombre de la restricción
--pertenecientes al usuario especificado
--que no estan desactivadas
--primary key que no sean de tablas organizadas por indice
--o cualquier otra constraint q sea del tipo C ó U ó R
for reg in (select table_name,constraint_namefrom all_constraints
where owner=p_owner
and status<>'DISABLED'
and ( (constraint_type in ('P')
and table_name not in
(select table_name
from all_tables
where owner=p_owner
and iot_type is not null
)
)
or constraint_type in ('C','U','R')
)
)
loop
execute immediate 'alter table '||p_owner||'.'||reg.table_name||' DISABLE constraint '||reg.constraint_name||' cascade';
end loop;
end dis_all_cons;
/
------------------------------------------------------------------------------------------
create or replace procedure ena_all_cons
(
p_owner varchar2 default USER
)
--Uso: ena_all_cons[('esquema')];
--ena_all_cons; --activa las constraints del esquema de quien ejecuta
--ena_all_cons('HR'); --activa las constraints del esquema HR
authid current_user
as
begin
--obtenemos nombre de la tabla y nombre de la restricción
--pertenecientes al usuario especificado
--que no estan activadas
--primary key que no sean de tablas organizadas por indice
--primero se activan todas las primary key
for reg in (select table_name,constraint_namefrom all_constraints
where owner=p_owner
and status<>'ENABLED'
and constraint_type in ('P')
and table_name not in
(select table_name
from all_tables
where iot_type is not null
)
)
loop
execute immediate 'alter table '||p_owner||'.'||reg.table_name||' ENABLE constraint '||reg.constraint_name;
end loop;
--se activan el resto de constraints
--de tipo C,U y R
for reg in (select table_name,constraint_namefrom all_constraints
where owner=p_owner
and status<>'ENABLED'
and constraint_type in ('C','U','R')
)
loop
execute immediate 'alter table '||p_owner||'.'||reg.table_name||' ENABLE constraint '||reg.constraint_name;
end loop;
end ena_all_cons;
/
El uso de estos procedimientos queda bajo responsabilidad de quien los utilice.
sábado, 16 de abril de 2011
Activar/desactivar todos los disparadores de todas las tablas. Oracle.
Si solo se quiere desactivar un disparador o todos los de una sola tabla, ver el post «Activar/desactivar disparadores»
Para poder desactivar o activar todos los disparadores —triggers— de todas las tablas de un esquema determinado en Oracle, creamos el siguiente procedimiento que realizará la tarea. (distinto es, triggers de los cuales se es propietario)
Para poder desactivar o activar todos los disparadores —triggers— de todas las tablas de un esquema determinado en Oracle, creamos el siguiente procedimiento que realizará la tarea. (distinto es, triggers de los cuales se es propietario)
create or replace procedure ena_dis_all_tri
( p_opcion varchar2 default 'DISABLE'
, p_owner varchar2 default USER
)
/*
-- procedimiento que activa o desactiva todos los disparadores de todas las tablas del esquema especificado
-- recibe dos parametros opcionalmente:
-- p_opcion (enable, disable).
-- p_owner esquema/usuario al que le desactivamos/activamos los triggers de sus tablas.
-- valores por defecto de los parametros:
-- p_opcion=disable p_owner=user
-- Uso: ena_dis_all_tri[([p_opcion=>'p_opcion'][,p_usuario=>'p_usuario'])]
-- Ejemplos:
-- ena_dis_all_tri; --desactiva los triggers del usuario que ejecuta
-- ena_dis_all_tri(p_opcion=>'enable'); --activa los triggers del usuario que ejecuta
-- ena_dis_all_tri(p_usuario=>'hr'); --desactiva los triggers del usuario hr
-- ena_dis_all_tri(p_opcion=>'enable',p_usuario=>'hr'); --activa los triggers del usuario hr
*/
as
--variable auxiliar
v_aux number;
--cursor que nos dará el nombre de las tablas
--que hay que activar/desactivar todos los triggers
cursor cur is
select table_name
from all_triggers
where table_owner=upper(p_owner)
and status<>p_opcion||'D';
begin
into v_aux
from all_users
where username=upper(p_owner);
if v_aux=0 then
raise_application_error(-20000,'El usuario "'||p_owner||'" no existe.');
end if;
raise_application_error(-20001,'Opción "'||p_opcion||'" no válida. Usar: "ENABLE" o "DISABLE"');
end if;
execute immediate 'alter table '||p_owner||'.'||reg.table_name
||' '||p_opcion||' all triggers';
end loop;
end ena_dis_all_tri;
/
cursor cur is
select table_name
from all_triggers
where table_owner=upper(p_owner)
and status<>p_opcion||'D';
begin
--------------esta partes es opcional, solo sirve para realizar unas comprobaciones
--comprobamos de que no se ha introducido mal el nombre de usuario
select count(username)into v_aux
from all_users
where username=upper(p_owner);
if v_aux=0 then
raise_application_error(-20000,'El usuario "'||p_owner||'" no existe.');
end if;
--comprobamos de que no se ha introducido mal la opcion
if upper(p_opcion) not in ('ENABLE','DISABLE') thenraise_application_error(-20001,'Opción "'||p_opcion||'" no válida. Usar: "ENABLE" o "DISABLE"');
end if;
--------------fin parte opcional
--ejecutamos la tarea
for reg in cur loopexecute immediate 'alter table '||p_owner||'.'||reg.table_name
||' '||p_opcion||' all triggers';
end loop;
end ena_dis_all_tri;
/
Se ha realizado en una base de datos Oracle 10.2.0.1
El procedimiento se ejecutará con los permisos del usuario que cree el procedimiento. Debe tener privilegio CREATE ANY TRIGGER para poder visualizar los triggers en la vista ALL_TRIGGERS o tener acceso a las tablas. Además, permiso ALTER sobre las tablas y sobre los triggers, éste último porque pueden existir triggers asociados a las tablas del esquema creados por otro usuario.
El procedimiento se ejecutará con los permisos del usuario que cree el procedimiento. Debe tener privilegio CREATE ANY TRIGGER para poder visualizar los triggers en la vista ALL_TRIGGERS o tener acceso a las tablas. Además, permiso ALTER sobre las tablas y sobre los triggers, éste último porque pueden existir triggers asociados a las tablas del esquema creados por otro usuario.
grant alter any trigger,Comprobar la información con la siguiente SELECT:
alter any table,
create any trigger to usuario;
select owner,trigger_name,table_name,status
from all_triggers
where table_owner='USUARIO';
El uso del procedimiento queda bajo responsabilidad de quien lo utilice.
Suscribirse a:
Entradas (Atom)


