Como copiar vistas materializadas

Este foro me ha servido bastante de ayuda y este es el primer post que escribo
tengo un problema que para muchos puede ser trivial, pero no he encontrado la mejor manera de hacerlo
lo que pasa es que tengo 2 bases de datos en Oracle 8, ambas son de certificación, necesito hacer un script para ponerlo en un cron que ejecute cada noche, que copie todas las vistas materializadas de una BD a la otra.
Aunque ya existan en la BD de destino, debe de reemplazarlas o actualizarlas
espero que alguien de aquí me pueda ayudar, por lo menos dándome una pista de como puedo realizar esto
gracias de antemano a todos

1 respuesta

Respuesta
1
¿Se utiliza un dblink público o privado entre las dos BBDD?
¿Cuál es el motivo de recrear las vistas materializadas? (A nivel de datos o de modelo)
Si el motivo de recrear las vistas materializadas es debido al refresco de datos, entonces
lo más sencillo y eficaz es programar un auto-refresco en la vista materializada destino,
con un intervalo de refresco cada 24horas (también puedes refrescar bajo demanda); así
te evitas tener código PL/SQL y un Control-M programado.
Para ello ambas BBDD deben tener activados unos parámetros.
Si el motivo viene determinado porque en el BD origen se cambia el modelo de las vistas
materializadas, es decir, se quitan y ponen campos o el tipo de los mismos, entonces
sí hay que crear código PL/SQL y además programar el Control-M para invocar al procedimiento (generalmente de madrugada).
Antes de seguir, indícame el motivo, y como es la conectividad entre una BD y otra así como los tipos de esquemas...
Si es por modelo, no te preocupes que te envío el procedimiento necesario para el objetivo.
Que tal, muchas gracias por ayudarme,
Están conectadas por un DB_LINK publico
Estas BD son de 3 servidores de certificación, en una base principal llamémosle CAT todos los días se aplican los desarrollos, donde a veces se modifican los campos de las vistas materializadas o se crean nuevas vistas materializadas, esto muy seguido. Todo esto se tiene que replicar a otras BD que se llaman CAT2 y CAT3
cuando se crea una vista o se cambian los parámetros lo agrego a un script de refresco de vista, y esto lo ejecuto en un cron todas las noches, este script debo de incluir el nombre de la vista cada vez que en desarrollo mandan crear una, y a veces las tengo que quitar según lo que se haga
estoy seguro que debe de haber alguna forma que refresque, cree y borre todas las vistas de manera automática, dejando así todas las noches la misma cantidad de vistas sin intervención mía, pero no encuentro la manera.
Te agradeceré bastante si me llegas a ayudar con esto, saludos!
Que tal, siento preguntar tanto, pero todavía me falta aprender (soy estudiante)
También tengo que hacer un analice a todas las tablas de sistema, pero que superen un cierto numero de rows
y tengo que hacer otro analice al resto de tablas que estén por debajo de esta cantidad de rows, para así correr ambos scripts en paralelo
esto debe de ser más sencillo, yo lo estoy intentando hacer mediante un select con una concatenación, pero no logro separar los resultados
gracias por toda tu ayuda de antemano, saludos!
Bien, entiendo que entonces se cambia el modelo y que pueden desaparecer vistas materializadas y crearse nuevas
en la BD origen de desarrollo, y éstos cambios deben reflejarse en las 3 BBDD de destino.
Para ello, en el procedimiento PL/SQL (que estarán en las BBDD destino), habrá que realizar
un bucle según una consulta al diccionario de deficiones de Oracle de la BD origen; dicha
consulta obtendrá todas las vistas materializadas que hay en ese momento. Te pego un código
de ejemplo:
/* Este paquete se crea en las BBDD destino de la ráplica del modelo de las vistas materializadas
y que será invocado por CRON */
CREATE OR REPLACE PROCEDURE p_replica IS
--
  Begin
  --
  /* Se borran las vistas materializadas propias del esquema */
  <<lf_borrar_materializadas>>
  FOR v_mat IN (SELECT mview_name AS nombre FROM user_mviews) LOOP
  --
    EXECUTE IMMEDIATE ('DROP MATERIALIZED VIEW '||v_mat.nombre);
  --
  END LOOP lf_borrar_materializadas;
  --
  --
  --
  <<lf_crear_materializadas>>
  FOR v_mat IN (SELECT mview_name AS nombre FROM user_mviews@nombre_dblink_publico WHERE owner = 'PROPIETARIO_MVIEW_ORIGINALES') LOOP
  --
    EXECUTE IMMEDIATE ('CREATE MATERIALIZED VIEW '||v_mat.nombre||' AS SELECT * FROM '||v_mat.nombre||'@nombre_dblink_publico');
  --
  END LOOP lf_materializadas;
  --
  --
  --
  EXCEPTION
    WHEN OTHERS THEN
      raise_application_error(-20000, SQLERRM);
--
END p_replica;
/
Tendrás que sustituir nombre_dblink_publico por el nombre del dblink público que usas y PROPIETARIO_MVIEW_ORIGINALES
por el usuario del cual vas a obtener las vistas materializadas.
Para la última pregunta, se vuelve a consultar los DDs de Oracle, en este caso la consulta es muy sencilla:
Tablas con más de 499 registros
SELECT table_name FROM user_tables WHERE num_rows >= 500;
Tablas con menos de 500 registros
SELECT table_name FROM user_tables WHERE num_rows < 500;
Recuerada, cuando se consulta al DD de Oracle, se tienen vistas por usuario y por dba, las de dba son más amplias,
ya que te permiten seleccionar los usuarios que quieras generalmente con USEROWN.
En líneas generales este es el concepto.
Hola, tengo otra duda que espero que me puedas ayudar a responder, tengo el siguiente query que me lista las 10 tablas más grandes del servidor:
set hea off     
set feedback off                                                                                                                                                                                        
set pagesize 1000                                                                                                                                                                                       
set linesize 200
spool menor10.sql
select 'analyze table ' || segment_name || ' compute statistics;'  from (
                select segment_name,sum(bytes)
                from user_segments s
                where segment_type in ('TABLE','TABLE PARTITION')
                group by segment_name
                order by sum(bytes) desc
              )
where rownum < 11
Si funciona, pero me muestra de todos los esquemas, lo que yo necesito es saber todas las tablas más grandes pero nada más del esquema "julio".
Espero que me puedas ayudar, estaré eternamente agradecido si me respondes con prontitud, gracias!
Te indico que user_segment hace referencia al usuario donde estas consultando, deberías consultas sobre el DD dba_segment y poner la condición OWNER = 'Julio'
Con esto accedes a todas las tablas de todos los usuarios y puedes filtrar por el usuario deseado.
Para poder consultar sobre los DDs del dba, debes tener el siguiente permiso en tu usuario: SELECT ANY DICTIONARY
Para otorgarlo (en caso de que no lo poseas), accede al sys/pwd as dba y ejecuta:
GRANT SELECT ANY DICTIONARY TO usuario_de_consulta;
Indícame si te sirve.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas