Administración, tips, SQL y utilidades sobre bases de datos Oracle

Administración, tips, SQL y utilidades sobre bases de datos Oracle Dataprix 30 Marzo, 2022 - 21:18

Tips sobre bases de datos Oracle

Recopilación de información, utilidades y dudas sobre bases de datos Oracle.

Administración, rendimiento, SQL, vistas materializadas, conexiones, backups..

Base de datos

Agrupaciones, sentencia group by de Oracle

Agrupaciones, sentencia group by de Oracle Yamil 18 May, 2010 - 22:56

Saludos a todos,

Quiesiera saber si en oracle se puede hacer un agrupamiento de un campo de una lista sin tener que agregar la lista completa, por ejemplo:

 

select nombre, direccion, depatamento, salario from empleados

 

Quieres decir hacer algo como esto?

select nombre, direccion, departamento, salario 
from empleados 
group by nombre

No se puede porque el group by te hace una agrupación por los campos que le indicas, y el resultado es de un sólo registro por agrupación. Si tu agrupas por nombre, y un mismo nombre tiene más de una dirección no puedes mostrarlo todo en el mismo registro. Todo lo que puedes mostrar han de ser datos agregados de los registros que componen la agrupación.

 

En respuesta a por Carlos

Saludos Carlos,

A lo que me refiero es a la posibilidad de hacer un group by solo por uno de los campos contenidos en la sentencia select, en el caso de sql/server sise puede hacer, por ejemplo la sentencia siguiente en oracle:

 select id_persona, identificacion,nombre_completo,tipo_persona

 

from cl_personas

group

by tipo_persona

esta sentencia me presenta el siguiente error en oracle :  ORA- 00979: Not a group by expression. Pero en SQL/Server si se puede hacer. Hay alguna forma de hacerlo en Oracle..?

En respuesta a por Yamil

Entonces he entendido bien lo que preguntabas, y mi respuesta anterior es válida.

Lo que no me cuadra es que me digas que en SQL Server esta sentencia te funciona, ya que debería darte un error parecido porque estás agrupando registros a un nivel (tipo_persona) e intentas sacar datos de un nivel más detallado (al pedir identificacion y nombre_completo), cuando de estos niveles sólo puedes obtener datos a nivel agregado con operaciones como COUNT, MIN, MAX, SUM, etc.

El funcionamiento general de las agrupaciones con GROUP BY es muy similar en casi todos los motores de bases de datos relacionales, ya que viene marcado por el estandar SQL. Tiene que haber alguna diferencia con la sentencia que has ejecutado en SQL Server para que en una BD te falle y en la otra no.

Auditoría de la base de datos, seguimiento y seguridad

Auditoría de la base de datos, seguimiento y seguridad Carlos 20 May, 2010 - 13:50

Abro este tema de auditoría en bases de datos Oracle para comentar cualquier cuestión relacionada con la activación y utlización de la auditoría de Oracle para hacer un seguimiento de determinadas consultas, usuarios, objetos, conexiones, etc. con el fin de mejorar el rendimiento de la base de datos, o también por cuestiones de seguridad.

Comienzo incluyendo este documento que explica bastante bien cómo utilizar la auditoría

Auditoria Oracle 10g from Silvana Cecilia Vire

En respuesta a por Carlos

Ahora tengo otra duda, resulta que tengo en la bd de oracle 10g algunos procesos que me están consumiendo casi la totalidad de la memoria, por ponerte un  ejemplo de 16 Gigas me queda en 100,200 ó 300 megas, y no puedo determinar que proceso es el que se me está comiendo la memoria. Te agradecería si tienes por ahi algún scripts que saque esta información.

Por otro lado, una consulta mas, tengo una bd oracle10g 10.2.0.3 r2,  y una aplicación desarrollada en forms 6i y report 6i y  tengo problemas de rendimiento, hay alguna forma de averiguar si es problema de la base de datos o de la aplicación o del servidor, tenemos una estructura RAC de oralce, un arreglo cx-310 de 15 rmp  y 2 server o nodos PE 2950 cada uno con 16 Gigas de RAM

Gracias.

En respuesta a por Yamil

Yamil, para lo que comentas te recomiendo activar la auditoría y/o utilizar herramientas de monitorización de la base de datos.

En el primer caso ten en cuenta que la base de datos siempre intentará utilizar toda la memoria disponible que tenga. Si es demasiada, y el servidor necesita parte de esa memoria para dar servicio a otros procesos tendras que reducirla modificando los parámetros de memoria de la BD.

Antes de utilizar herramientas externas, te recomiendo que utilices los recursos y asistentes proporciona Enterprise Manager para controlar las áreas de memoria de la BD, enlazo un artículo de mailxmail que da algunos apuntes sobre cómo hacerlo.

Otras herramientas como Toad for Oracle, o NimBUS también te pueden ayudar.

En Recopilación y consultas útiles de Oracle tienes también alguna consulta para saber directamente algunos datos de la memoria:

•• Consulta Oracle SQL para conocer la memoria Share_Pool libre y usada
select name,to_number(value) bytes
from v$parameter where name ='shared_pool_size'
union all
select name,bytes
from v$sgastat where pool = 'shared pool' and name = 'free memory'
•• Consulta Oracle SQL para conocer los aciertos de la caché (no debería superar el 1 por ciento)
select sum(pins) Ejecuciones, sum(reloads) Fallos_cache,
trunc(sum(reloads)/sum(pins)*100,2) Porcentaje_aciertos
from v$librarycache
where namespace in ('TABLE/PROCEDURE','SQL AREA','BODY','TRIGGER');

Y a un nivel más avanzado, el artículo Monitoring Oracle SGA and PGA Memory Changes, de Burleson Consulting también te puede ser útil.

 

Sobre los problemas de rendimiento que comentas en el segundo párrafo, aparte de monitorizar la BD tendrás que monitorizar otros procesos a nivel de sistema, y comparar. Al tener Oracle en RAC aún lo tienes más complicado. Si la instalación de RAC se ha hecho desde cero, no creo que te de problemas, pero se me ocurre que si se ha hecho una migración desde una BD que no estaba en RAC podrías tener, por ejemplo, algún problema de sincronización en la generación de claves primarias o secuencias.

buenas noches me piden  generar una auditoria que identifique

las conexiones de un usuario e indique las sentencias ejecutadas por el,

 indicando fecha y hora de las conexiones.  le agradeceria su pronta

ayuda

En respuesta a por salome

Salome, en la presentación que he adjuntado al abrir el tema encontrarás información sobre cómo activar la auditoría y realizar el seguimiento de las conexiones del usuario que te solicitan, o utilizar el paquete DBMS_FGA para realizar un seguimiento con mayor nivel de detalle, ya verás que hay muchas posibilidades.

En este comentario también comenté algo sobre la auditoría, puede que algo te sirva.

Enlazo además el artículo Auditoría de una base de datos Oracle ¿qué es? ¿para qué sirve? ¿cómo se activa?, de AJPDsoft, que también explica bastante bien, y en una sóla página, cómo funciona la auditoría .

Por ejemplo, una sentencia sencilla para consultar las conexiones de un usuario a partir de una fecha con la auditoría activada sería esta:

select os_username, username, terminal, timestamp, logoff_time, comment_text
from dba_audit_trail
where username = 'usuario' 
and trunc(timestamp) > '20100430'
order by timestamp desc;

Hola muchachos ando realizando un monitoreo a la base de datos donde ando viendo las personas que modifican los objetos de la base "DDL".

El tema aqui es que cuando alguien modifica externamente los objetos que no son por medio de un cliente si no dentro del servidor no puedo ver a detalle los datos del ususario.

Uds tendran algo entre sus cursidades ..?

Buenas tardes, necesito saber el id de la sesion de Oracle que está activo en determinado momento que corre un proceso.

Es decir, si yo consulto la vista:

select sid from v$session
where username : 'DESA'

Si hay varias sesiones abiertas, me devuelta tantos sid como sesiones abiertas haya y lo que necesito en realidad es un único valor de sid que me muestra univocamente la sesion utilizada, es esto posible?

Muchas Gracias,
Saludos,
Osk

En respuesta a por osk (no verificado)

 Que tal osk, prueba con el siguiente query

SELECT SS.SID, P.PROGRAM, P.PGA_USED_MEM, P.PGA_MAX_MEM, S.SQL_TEXT, SS.SID

FROM V$SQL S, V$SESSION SS, V$PROCESS P WHERE S.SQL_ID = SS.SQL_ID 

AND P.ADDR = SS.PADDRAND

AND SS.USERNAME = ' TU USUARIO'

Con esto puedes ver el query que corre cada sesion de tu usuario y puedes determinar cual es la sesion que necesitas

Espero te sirva, Saludos.

 

Hola que tal,

Tengo una necesidad pero no se si se pueda llevar a cabo. 

Es posible tener algun log o información para un procedimiento almacenado o paquete, donde me muestre en que momento se ejecutó el PKG o PROC con la información que recibió y la información que envió (si es del caso).

De antemano muchas gracias por la ayuda que me puedan brindar.

Saludos, 

Buen dia,

Podrian apoyarme con la siguiente solicitud, hemos presentado problemas de espacio con los file system, creemos que programar depuraciones desde EBS podria ayudar a liberar espacios, pero para definir los periodos de depuración, me solicitan un analisis para saber la carga diaria es decir cuantos outputs, archivos temporales etc, se generan diariamente y el espacio que ocupan, esto para definir la programacion,  tienen algun metodo para sacar estas estadisticas o como podria recopilar la informacion que me solicitan.

De antemano mil gracias por su apoyo

Buen día Carlos:

 

Eh visto tu blog en está página y me ha parecido interesante, te comento que eh ingresado a una institución financiera como DBA.

 

Debido a multiples limitaciones que existen conn el tema de acceso hacia la Base de datos de desarrollo, la cual tengo que administrar en un futuro.

 

Me gustaría preguntarte si existe alguna herramienta que me permita monitorear los cambios a los objetos de la  base (tablas, stores, funciones, paquetes, etc), aquí en el área realizan cambios sin aviso y de ultimo momento. Por lo que la auditoria unificada en el servidor de la base no es opción por n limitaciones que existen.

 

No puedo instalar nada en el servidor ya que es solaris y por lo que eh escuchado, todo el tema de hardware o almacenamiento es muy caro. Si puedo implementar alguna aplicaciòn que me permita auditar sería en mi laptop y que se conecte al servidor con el usuario que ya tengo temporalmente.

 

Saludos y muchas gracias.

 

Abraham Santamaría.

En respuesta a por Abraham Santamaría (no verificado)

Hola Abraham

Lo normal es utilizar la auditoría que proporciona la base de datos porque el servidor de base de datos es el que centraliza los cambios. Cualquier otra cosa tendría que estar consultando constantemente los objetos auditados para comprobar si han cambiado. No te digo que no exista alguna utilidad que haga algo así, pero yo no la conozco.

Lo que sí hay son aplicaciones que recogen cambios consultando en los logs del servidor, en lugar de hacer consultas contra la base de datos, y así no interfieren en el funcionamiento, pero igualmente si quieres que los cambios se salven en los logs has de tener activada la auditoría de la base de datos.

Otra opción, si el problema es el espacio, sería activar la auditoría, y lanzar consultas contra la base de datos, pero recoger y almacenar los resultados en otra máquina de la red, o un ordenador, o un portátil, eso sí que seguro que lo hacen herramientas de administración de bases de datos Oracle.

Saludos,

Cancelar consulta después de esperar cierto tiempo sin respuesta.

Cancelar consulta después de esperar cierto tiempo sin respuesta. Esteban 12 Julio, 2016 - 00:29

Hola a todos soy nuevo en el Foro, antes que todo para felicitar a los administradores de esta pagina, es bastantemente buena(de aqui he tomado algunas soluciones o indicios para solucionar problemas) :).

 

Tengo un tema con un procedure en Oracle, en el cual he buscando información al respecto y no logro dar con alguna solución, paso a explicar lo siguiente:

 

Quiero hacer la cancelación de una consulta dentro de un store, si esta no se lleva en cierto tiempo, es decir ejecuto la consulta(ejemplo):

 

select * from empleados (con o sin condiciones) y si esta no se lleva acabo(que regrese datos) en un lapso de tiempo por decir algo en 10 segundos realice alguna otra tarea.

 

Esto lo estoy ocupando en realidad para una consulta del tipo 

select UTL_HTTP.REQUEST('http://192.168.1.168:8080/validoPagina') into XVALOR from dual;

 

que se encuentra en un procedure que es ejecutado por un JOB cada cierto tiempo y esta devuelve valores en caso de que el web application este "Arriba" , pero he notado que aun y cuando esta arriba el WEB APPLICATION(tomcat) esta consulta se queda en realidad esperando una respuesta y empieza a correr el tiempo, desde 1... hasta que la cancelo graficamente por el toad, aclaro este parte es exporadita, por lo regular siempre regresa datos y cuando la aplicación o el servidor se encuentra "fuera" siempre regresa un error del tipo 404, ya sea que regrese datos "buenos" o el error 404 siempre en menos de 2 segundos, pero las veces que no lo hace, esta consulta se queda esperando respuesta por mucho tiempo.

 

Posible solución que pude haber implementado:

Dentro del Procedure, tomar una fecha inicial y una fecha final, de ahi sacar el diferencial del tiempo y hacer "otras" tareas.

 

No se lleva acabo esta solución, por que simplemente si la consulta se queda indefinidamente esta no podra obtener la fecha final y hacer la diferencia para poder hacer la otra tarea.

 

No se si exista alguna excepción por tiempo en el cual si cumple 5,6, o 15 segundos y aun no ha salido de hacer su tarea esta se levante realizando otra tarea(un envio de mail tarea que ya hace en caso de que conteste un 404).

 

He visto algunas cosas como el alter kill session, pero creo no es muy viable, o el hecho de mover el tiempo de respuesta o conexión hacia la BD, pero igual no es opción, por que hay consultas(joins) muy grandes que estan necesitan almenos unos 10s o mas para regresar datos.

 

Agradeceria si me pudieran orientar con algo o como solventar este issue, por mi parte seguire buscando algo al respecto.

 

Hola Esteban

Yo creo que la opción de acotar el tiempo de respuesta te puede ir muy bien, y si otras consultas necesitan un tiempo mayor podrías crear una sesión sólo para lanzar este procedure, y modificar los parámetros sólo para esta sesión.

Con Alter Session puedes definir un Timeout para las consultas, te copio una parte de la referencia de SQL para ALTER SESSION:

RESUMABLE Clauses

These clauses let you enable and disable resumable space allocation. This feature allows an operation to be suspended in the event of an out-of-space error condition and to resume automatically from the point of interruption when the error condition is fixed.

ENABLE RESUMABLE

This clause enables resumable space allocation for the session.

TIMEOUT TIMEOUT lets you specify (in seconds) the time during which an operation can remain suspended while waiting for the error condition to be fixed. If the error condition is not fixed within the TIMEOUT period, then Oracle Database aborts the suspended operation.

 

De todas maneras yo revisaría igualmente el parámetro IDLE_TIMEOUT de la base de datos, que si está a 0 no limita por Timeout las consultas, cosa que a veces puede provocar problemas. Si lo ajustas a un tiempo razonable, siempre teniendo en cuenta los tiempos máximos de las consultas que se hagan en producción, te aseguras de que ninguna consulta se quede 'colgada' demasiado tiempo.

 

Saludos,

En respuesta a por Carlos

Hola Carlos, 

 

Agradezco tu interes por ayudarme, esto es a lo que me refiero, con que dan buenas pistas para poder resolver nuestros issues, en efecto estuve revisando el Alter session ENABLE RESUMABLE  timeout y pienso que es una muy buena opción y de hecho bastante sencilla, segun lo que entendi de este tipo de instrucción realiza una reanudación tras un "Error" o bien tras algo que sucedio con la instrucción que se estaba ejecutando, si bien no conocia esta funcionalidad( y desconozco muchas mas) me ayudo :) .

 

Sin mas lo que hice fue colocar la siguiente sentencia en mi store:

execute immediate 'ALTER SESSION ENABLE RESUMABLE TIMEOUT 10';

Antes de esto tuve que darle permisos:

 GRANT RESUMABLE TO USUARIO;

 

Hasta este punto mi JOB junto con el STORE esta trabajando sin problemas y realiza los trabajos como se tienen planeados, solo falta que haga su tarea cuando esta tarde mas de los 10 segundos que le coloque.

 

Y de nueva cuenta te felicito por tu conocimiento y tu interes por ayudar a los demas, si puedes recomendarme algunas lecturas para poder ir aprendiendo mas te lo agradeceria.

 

Saludos!!!.

En respuesta a por Esteban

Hola Esteban

 

Me alegro de poder servirte de ayuda, y gracias a ti por compartir tu experiencia, la idea es que entre todos podamos tener un buen repositorio de recursos.

Espero que la solución funcione correctamente cuando se produzca la espera.

Sobre recomendaciones, entiendo que sobre administración de Oracle, te enlazo este manual de recopilación, que es como un índice de las mejores publicaciones sobre Oracle en Dataprix.

Verás que la mayoría son de hace tiempo, de la época en que yo trabajaba más con Oracle, pero seguro que casi todas aún sirven.

Saludos!

Como crear jobs, que se ejecuten todos los dias en Oracle plsql

Como crear jobs, que se ejecuten todos los dias en Oracle plsql dmartinez 6 Marzo, 2014 - 18:16

 necesito crear un jobs en plsql que se ejecute todos los dias, ese job debera contener 7 stored procedure como haria
gracias

En respuesta a por Anonimo (no verificado)

 Supongo que te refieres a Oracle BI Scheduler Job Manager, de las herramientas de administración de Oracle BI. Si lo tienes instalado, enlazo el capítulo Using Oracle BI Scheduler Job Manager de la documentación de Oracle 11g.

Si no tienes Oracle BI, en el tema Jobs y programación de tareas comentábamos algunas opciones para crear y controlar jobs que ejecuten procedimientos de PL/SQL.

 

Buenas tardes,

queria saber si dentro de un solo procedure puedo incluir el truncate de tres tablas a la vez de la sieguiente manera:

 

CREATE OR REPLACE PROCEDURE ESQUEMA.PRUEBA_BORRADO IS BEGIN execute immediate 'truncate table ESQUEMA.1'; execute immediate 'truncate table ESQUEMA.2'; execute immediate 'truncate table ESQUEMA.3'; execute immediate 'truncate table ESQUEMA.4';

END;

/

 

Gracias.

Como definir una variable para usarla en varios querys sin escribir el mismo dato???

Como definir una variable para usarla en varios querys sin escribir el mismo dato??? ellidr 5 Noviembre, 2014 - 19:06

Buen día soy novato en esto de las bases de datos y quiero aprender de este gran foro ojala puedan a poyarme u orentarme el detalle es que realizo el alta de un usuario pero se repite muchas veces entonces quiero saber como puedo definir el usuario una vez y que se ponga en todos los campos donde se nececite aqui esta un ejemplo.

SELECT *
FROM USUARIOS
WHERE COD_USUARIO= 'C3131872';

--Aqui quiero insertar el mismo dato C3131872 pero no quiero estar escribiendo o pegando lo mismo

INSERT INTO USUARIOS(COD_USUARIO, COD_PER_FISICA, ES_PRINCIPIANTE, PALABRA_PASO, EST_ACTIVO, IMPRESORA, NUM_LLAMADAS)
VALUES ('C3131872','C3131872', 'N', 'C3131872', 'S', null, null);

hay manera de solo definir C3131872 y que automaticamente se ponga en esos campos?? ya use el & pero sale lo mismo tengo que escribir 3 veces lo mismo

De antemano muchas gracias

Podrías utilizar una select para hacer el insert directamente con los valores que contiene la tabla origen de usuarios:

insert into usuarios 
 (COD_USUARIO, COD_PER_FISICA, ES_PRINCIPIANTE, PALABRA_PASO, EST_ACTIVO, IMPRESORA, NUM_LLAMADAS)
select cod_usuario,cod_usuario,'N',cod_usuario,'S', null,null
from usuarios1
where cod_usuario in ('C3131872', ... )

 

Si no existiera, te tendrías que crear una tabla usuarios1 con al menos el campo COD_USUARIO, e insertar en ese campo los códigos de los usuarios que quieras crear luego.

 

Concatenar cadenas en Oracle

Concatenar cadenas en Oracle Carlos 12 May, 2014 - 10:59

Concatenar cadenas en Oracle no tiene ningún secreto, el operador que se utiliza es el string '||' (doble barra vertical) siguiendo el estandar de sintaxis de SQL, pero lo comento aquí como apunte porque en otros motores de base de datos, como SQL Server, o DB2, la concatenación se hace con otros operadores, concretamente '+' en SQL Server y 'CONCAT' en IBM DB2.

La concatenación en Oracle es tan sencilla como insertar el operador entre las dos cadenas a concatenar (bueno, el método es el mismo en todas las bases de datos, lo único que puede cambiar es el operador):

SELECT 'Mi nombre completo es ' || nombre || ' ' || apellidos
FROM usuarios WHERE id_usuario=8;

La sintaxis es muy simple, pero con un poco de imaginación, o de práctica, puede ayudar a crear sentencias complejas, o incluso scripts de administración que utilicen el diccionario de datos para crear las instrucciones necesarias para realizar operaciones sobre una lista de objetos de la base de datos, seleccionados dinámicamente.

Apuntar también que en SQL Server la utilización del operador '+' para concatenar puede traer algún que otro problemilla cuando tú quieres concatenar y el analizador de SQL entiende que lo que quieres es sumar números.

 

Es cierto, yo he trabajado siempre con Oracle, y al tener que contatenar una vez con SQLServer utilizando el + me paso lo que comentas, que tenía errores porque SQL intetaba sumar en lugar de concatenar.

Creación de esquemas en Oracle

Creación de esquemas en Oracle Carlos 12 Junio, 2009 - 17:55

Este tema es para recoger comentarios acerca de la creación de nuevos esquemas en Oracle, creación de tablespaces, usuarios, asignación de permisos, etc.

En respuesta a por Esper (no verificado)

Entonces puedo entender que la conexion seria  la siguiente.

Usuario: APP

Password: APPPWD

Base de Datos: APPDAT

Estos seran mis parametros desde mi toad o pl/sqldev no es asi? o me equivoco?

 

Saludos.

Henry

En respuesta a por Anonimo (no verificado)

Los datos del usuario y el password serían correctos, pero APPDAT es el tablespace, que no tiene nada que ver con el nombre de la base de datos.

El tablespace es el lugar donde se crean los objetos de uno o varios usuarios, y una base de datos tiene varios tablespaces. En este caso, al crear el usuario, le dices que todos los objetos (tablas, índices, procedures, etc.) que cree este user lo haga por defecto sobre el tablespace APPDAT.

El nombre de la base de datos lo puedes encontrer en el fichero tnsnames.ora, que estará en el directorio donde se haya instalado esta base de datos.

Es recomendable crear un tablespace para cada usuario que vaya a crear objetos, pero si te lo quieres ahorrar, si no especificas nada la base de datos utiliza el tablespace USERS como tablespace por defecto para cada nuevo usuario que se crea.

El esquema lo componen todos los objetos propiedad de un usuario, en el ejemplo el User APP será el Owner de todas las tablas, índices, secuencias, etc que cree, y todos estos objetos formarán su esquema.

Carlos Fernández

Analista de sistemas

En respuesta a por Carlos

[quote=carlos]El esquema lo componen todos los objetos propiedad de un usuario, en el ejemplo el User APP será el Owner de todas las tablas, índices, secuencias, etc que cree, y todos estos objetos formarán su esquema. [/quote]

Es decir, que por defecto, los objetos que crea un usuario pasan a ser directamente de su propiedad y parte de su esquema.

El tablespace es el lugar físico donde se almacenan objetos de la base de datos. Cada usuario tiene asignado un tablespace por defecto donde se almacenan todos los objetos que crea, si no especifica otro tablespace en la sentencia de creación.

En un mismo tablespace se pueden almacenar objetos de diferentes esquemas. Un buen ejemplo es el Tablespace USERS, que es donde por defecto se crean los objetos de los nuevos usuarios de la base de datos. Un usuario también puede crear objetos en diferentes tablespaces, sólo ha de especificar el tablespace que quiera en la sentencia de creación.

Con estas aclaraciones espero que puedas seguir sin problemas lo que se va haciendo en Cómo crear un nuevo esquema en Oracle paso a paso

 

Tengo una Instancia en Oracle 10g, con varios esquemas, y necesito que uno de ellos pueda ver y consultar todas las tablas de todos los otros usuarios o esquemas.

¿como puedo hacer esto?

En respuesta a por José (no verificado)

Para conceder permisos de consulta a este usuario sobre todas las tablas de los demás esquemas lo mejor es que utilices el diccionario de datos para crear los permisos. Entra con un usuario de sistema (SYS o SYSTEM) que 'vea' todas las tablas y ejecuta una sentencia como esta:

select 'Grant select on '|| t.owner||'.'||t.table_name ||' to usuario;'
from all_tables t
where owner not like '%SYS%';

Si quieres, en el artículo Construcción de scripts con ayuda del diccionario puedes consultar cómo crear un script con estas sentencias y lanzarlo desde la linea de comandos.

Otra opción sería asignar al usuario el rol SELECT_CATALOG_ROLE, o darle permisos de SELECT ANY DICTIONARY, pero con la que te propongo puedes restringir los permisos a lo que quieras en la misma select si, por ejemplo, no te interesa que el usuario tenga acceso a las tablas de sistema.

Carlos Fernández

Analista de sistemas

En respuesta a por Carlos

Carlos, que tal, evidentemente sabes bastante de oracle. Tengo 1 esquema creado para dos usuarios:

 

Esquema: x

Usuario: Y

Usuario: YY

 

Uso un soft que se conecta a la base de datos, es un soft de piping, pero la pregunta es, como se conectan estos dos usarios

a la base de datos??? les instalo cliente de oracle, pero cuando pongo en sqlplus, el nombre de usurario: Y y la pass asignada me dice que no tiene privilegios, error ORA-01031? via toad es mejor??

 

Slds compas y gracias de antemano

En respuesta a por Manuel (no verificado)

Hola Manuel, la mejor prueba es lo que hagas desde SQLPLUS.

Si te da ese error significa que estos usuarios no tienen permisos para conectar a este esquema. Supongo que especificas el esquema en la conexión, no?
En tu caso:

$ sqlplus Y/passwd@x

Si esto está bien también podría ser que los usuarios no tuvieran permisos de conexión. Asegurate de haberles asignado antes los roles CONNECT y RESOURCE con un usuario DBA de la BD:

GRANT "CONNECT" TO "Y";
GRANT "RESOURCE" TO "Y";

En respuesta a por Anonim. (no verificado)

En Recopilacion de scripts y consultas utiles de Oracle puedes encontrar varias consultas SQL que te pueden ayudar a utilizar el diccionario de datos de Oracle para obtener este tipo de información.

Esta, por ejemplo, creo que te podría servir:

SELECT owner,
       decode(partition_name, null, segment_name, segment_name || ':' || partition_name) name,
       segment_type, tablespace_name,bytes,initial_extent,
       next_extent, PCT_INCREASE, extents, max_extents
FROM dba_segments
WHERE owner= 'EL_ESQUEMA_QUE_ME_INTERESA' And extents > 1 order by 9 desc, 3

Con esta consulta recuperas los datos de los objetos del esquema 'EL_ESQUEMA_QUE_ME_INTERESA', incluyendo el tablespace donde se crean. Puedes adaptarla o simplificarla a tu gusto.

a ver si comprendo ???

1 tablespace es el espacio en los que los usuarios graban sus datos e indices

y el schema ???

acaso es un usuario propietario de los objetos usados en dicho DB ???

Me encantó el post, me fue muy util.

Tengo un tablespace con dos datafile y ¿como puedo eliminar uno de ellos y hacer el otro extensible? 

La versión de Oracle que uso es la 9.2.0.1.0. He visto que en Oracle 10g es realmente facil. 

 

Muchas gracias por todo.

 

 

Hola

Tengo un usuario USR1 con su esquema ESQ1, como puedo crear un USR2 que vea ese mismo esquema ESQ1 y que las consultas no me pidan el nombre del esquema, por ejemplo:

Select * from ESQ1.tabla1;

Saludos

Gran post, tengo una duda sobre este tema.

Ya he creado varios esquemas dentro de una misma base de datos cada uno con sus propios objetos y privilegios, solamente quiero saber como monitorear los recursos de memoria que utiliza cada usuario, un ejemplo tengo los esquemas A y B, despues de la creacion del esquema B, se ha mostrado algo de irregularidad en el esquema A como jobs que se quedan colgados y no se ejecutan o se tardan mas de lo normal. En el esquema B tengo el privilegio de sistema UNLIMITED TABLESPACE por que no podia crear objetos en los tablespace que le tenia asignado a B, no se si esto afecte al esquema de A.

Saludos

En respuesta a por OMARE (no verificado)

[quote=OMARE]Gran post, tengo una duda sobre este tema.

Ya he creado varios esquemas dentro de una misma base de datos cada uno con sus propios objetos y privilegios, solamente quiero saber como monitorear los recursos de memoria que utiliza cada usuario, un ejemplo tengo los esquemas A y B, despues de la creacion del esquema B, se ha mostrado algo de irregularidad en el esquema A como jobs que se quedan colgados y no se ejecutan o se tardan mas de lo normal. En el esquema B tengo el privilegio de sistema UNLIMITED TABLESPACE por que no podia crear objetos en los tablespace que le tenia asignado a B, no se si esto afecte al esquema de A.

Saludos

 

Otra duda Como puedo ver varios TABLESPACE con un usuario ademas del que se asigna por default al usuario sin tener el privilegio de UNLIMITED TABLESPACE, saludos

 

 

En respuesta a por OMARE

Cada usuario tiene definido el tablespace por defecto donde se crean sus objetos si este no especifica nada. Para crear objetos en otros tablespaces sólo hay que dar al usuario los permisos necesarios y especificar el tablespace en la sentencia de creación del objeto.

En lugar de darle el privilegio UNLIMITED TABLESPACE al user, puedes asignar una cuota a cada TABLESPACE que vaya a utilizar. Sería algo así:

CREATE USER mi_usuario
IDENTIFIED BY mi_password
DEFAULT TABLESPACE mi_tablespace
QUOTA 20M ON otro_tablespace
QUOTA UNLIMITED ON otro_tablespace_mas;

Hola Carlos, necesito crear un usuario para producción que tenga acceso a tablas, vistas, procedimientos y otros objetos de otro esquema sin necesidad de nominar los objetos anteponiendo el esquema. Se que se puede hacer con scripts creando sinonimos y dando permisos al usuario en el esquema. La idea es que se desarrolle con un usuario que tiene ciertos privilegios que no puede tener el usuario de producción ¿cúal es la dinámica habitual? Gracias

En respuesta a por Atman (no verificado)

El procedimiento que yo conozco es el que puedes consultar en el post Utilización de sinónimos para compartir objetos. Se trataría simplemente de crear un script que para cada objeto que quieras 'enmascarar' cree un sinónimo público con sólo su nombre.

La variante que propone ljmunozc de crear un trigger que altere la sesión para 'situar' al usuario en ese esquema me parece muy ocurrente, gracias por la aportación, aunque todo lo que tenga que ver con triggers hay que manejarlo con mucho cuidado, hay que tener siempre en cuenta que se le está cambiando automáticamente la sesión al usuario.

Si lo pruebas ya nos explicarás qué tal funciona.

Atman, mientras te constesta Carlos puedes consultar una variante aquí

Por cierto además de tablas y vistas ¿hay que crear sinónimos para todos los objetos del esquema: procedimientos, funciones, etc.?

 

Hola Carlos Tengo nivel súper básico, tengo que crear varios esquemas, cada uno con varias tablas, entiendo que creas un tablespace, después el usuario, ese usuario lo asignas al tablespace, mi duda es donde entra el schema, cómo asignas un schema a un tablespace?

Hola Carlos, necesito crear un usuario igualito a otro ya existente, es decir, mismas tablas, misma data, etc... Como lo hago? Cual es el mejor camino?

Crear una base de datos ORACLE

Crear una base de datos ORACLE Caro Spengler 13 Marzo, 2012 - 20:10

 Hola,

 

Queria saber si alguien me puede indicar como crearme una base de datos ORACLE en mi PC.

tengo instalada la Virtual Box que la descargue en metalink pero me tira error. 

Queria saber si me tengo que instalar un cliente antes, otro S.O, etc. Mi pc tiene windows 7. 

 

Muchas gracias!!
 

Pero qué te da error, Virtual Box o la base de datos? Qué error es? A lo mejor se puede solucionar.

También es importante saber la versión de base de datos que quieres utilizar, una vez que lo tengas claro es cuestión de descargar la versión correcta desde la web de Oracle. Para la XE 11g, por ejemplo, desde esta página de descarga de Oracle XE

También deberías consultar los requerimientos en la documentación de Oracle. Para la misma XE los tienes en esta página:

http://docs.oracle.com/cd/E17781_01/install.112/e18803/toc.htm#CIHFEBGE

Te enlazo también un video de una instalación en Linux, los temas específicos de SO cambian, pero el asistente del instalador funciona igual: Creando Base de Datos Oracle 11g desde cero - Paso a Paso

 

 

Buenas, gente, si alguien me puede ayudar...

tengo una maquina virtual con solaris 10

 

 

 

uname -a SunOS unknown 5.10 Generic_142910-17 i86pc i386 i86pc al intentar crear una base nueva me da el siguiente error...  

 

 

SQL> @/u02/oradata/emiDB/crea_base.sql SP2-0734: inicio "SQLPLUS "/..." de comando desconocido - resto de la linea ignorado. Instancia ORACLE iniciada.   Total System Global Area  423624704 bytes Fixed Size                  1280588 bytes Variable Size             125830580 bytes Database Buffers          293601280 bytes Redo Buffers                2912256 bytes CREATE DATABASE emiDB * ERROR en linea 1: ORA-01092: ORACLE instance terminated. Disconnection forced     el script es el siguiente- # cat crea_base.sql SQLPLUS "/ as SYSDBA" STARTUP NOMOUNT CREATE DATABASE emiDB LOGFILE '/u02/oradata/emiDB/log1emiDB.ora' SIZE 4M, '/u02/oradata/emiDB/log2emiDB.ora' SIZE 4M, '/u02/oradata/emiDB/log3emiDB.ora' SIZE 4M, '/u02/oradata/emiDB/log4emiDB.ora' SIZE 4M EXTENT MANAGEMENT LOCAL sysaux datafile '/u02/oradata/sysaux.dbf' size 300M autoextend on next 16M maxsize unlimited MAXDATAFILES 100 DATAFILE '/u02/oradata/emiDB/SYSemiDB.ora' SIZE 50M DEFAULT TEMPORARY TABLESPACE temp TEMPFILE '/u02/oradata/emiDB/temp.ora' SIZE 50M UNDO TABLESPACE undo DATAFILE '/u02/oradata/emiDB/undo.ora' SIZE 50M NOARCHIVELOG CHARACTER SET WE8ISO8859P1;    Gracias... 

 

 

En respuesta a por cydemmy

 Que tal, has intentado con el dbca, intenta con esta instruccion:

 

dbca -silent -createDatabase -templateName General_Purpose.dbc -gdbName emiDB -sid emiDB -sysPassword password -systemPassword password

 

Te explico, con este metodo invocas el asistente dbca el cual es el encargado de configurar una base de datos, las opciones que se ejecutan en esta linea son:

 

-silent /*invoca el asistente en modo consola*/

-createDatabase /*da la instruccion de crear una base de datos*/

-templateName GeneralPurpose.dbc /* usa la plantilla de proposito general*/

-gdbName /*es el nombre que le daras a tu base de datos*/

-sid /*es el nombre del sid*/

-sysPassword y -systemPassword /* son los pass para los usuarios sys y system respectivamente*/

 

Tiene mas opciones pero con esto es mas que suficiente para crear una base de datos de pruebas, los parametros de memoria, sesiones, procesos y demas son los que te dan por default.

 

Saludos

Yo tengo en mi PC instalado Oracle 11G, pero no puedo acesarla porque se me olvido el password o contraseña. Yo quisiera saber si se pudiera borrar o deshacer ese password volverle a instalar el password nuevo sin tenerque borrar toda la base de datos y sus esquemas

Ok esta bien tu sintaxis pero no tienes un ejemplo como pasarlo a linea de comando de linux en el VBox utilizando SQL PLUS

Cuestiones sobre concesión de permisos y seguridad en Oracle

Cuestiones sobre concesión de permisos y seguridad en Oracle Carlos 24 Febrero, 2010 - 18:34

Abro este tema a propósito del artículo Grants with grant option, la propiedad transitiva en la concesión de permisos para comentar cualquier cuestión sobre el mismo, o temas relacionados con la seguridad, los roles y la concesión de permisos en Oracle.

En respuesta a por Carlos

Buenas tardes,

 

En Oracle 10, desde el usuario "aplicacion1" ejecuto el comando  --> grant SELECT_ANY_TABLE to aplicacionadmin ;

Y me devuelve:

ORA-01919: el rol 'SELECT_ANY_TABLE' no existe

 

La idea es que desde aplicacionadmin se pueda realizar tareas de mantenimiento sobre todas las tablas de aplicacion1 y aplicacion2 asi como poder importar y exportar el esquema de cada uno de ellos teniendo su contenido en un tablespace en comun (TB_APLICACION)

 

¿Como puedo hacer esto?

 

Gracias

En respuesta a por Carlos

Buenas tardes Carlos:

Lo que yo quisiera es dar privilegios a un usuario de select, update, insert y delete sobre todos los objetos de un esquema, mas no para todos los objetos de la BD.

Es decir no quierdo darle por ej:

grant select any table to eramirez;

Porque ahi le estoy diciendo que haga select sobre cualquiera tabla y yo solo quiero el select sobre todas las tablas de un esquema determinado. Es posible eso?

 

Muchas gracias por tu atención.

 

 

Hola, necesito crear una tabla en una session, donde esta tabla hace referencias a otras tablas que estan en otra session, me tira un error: previlegios insuficientes

En respuesta a por Anonimo (no verificado)

Seguramente es porque el usuario User1 que quiere crear la tabla TabA no tiene permisos asignados sobre la tabla TabB del otro esquema User2 a la que se hace referencia.

Para solucionarlo deberías conectarte con el User2 o un usuario de sistema y asignar los permisos necesarios al User1:

GRANT SELECT ON User2.TabA TO User1;

Carlos Fernández

Analista de sistemas

En respuesta a por Carlos

buen dia,

necesito de su colaboracion con los siguiente,

tengo tres usuarios y uno de ellos es un esquema (usuario1, usuario2, esq_usuario3),

como hago para crear roles y dar los siguientes privilegios:

1- el usuario1 puede consultar, actualizar, borrar, alterar, crear tablas o vistas en esq_usuario3

2- el usuario2 solo puede consultar las tablas y vistas del esquema esq_usuario3 tanto las actuales como las que se vayan creando, pero el usuario2 no puede actualizar, borrar, alterar ni crear tablas o vistas en esq_usuario3

3- el usuario1 no puede actualizar, borrar, alterar, crear tablas o vistas en ningun otro esquema diferente a esq_usuario3

En respuesta a por Anonimo (no verificado)

Sobre el punto 1, en principio, con Oracle no puedes dar a un usuario permisos de creación sobre un esquema del que no es propietario, o crea tablas en su propio esquema, o le das permisos para crear tablas en todos los esquemas.

Lo que te podría servir es utilizar el sistema de autenticación proxy que permite a un usuario autenticarse, pero obteniendo los permisos de otro usuario. Es decir, podrías dar al usuario1 permisos para autenticarse con los permisos del propietario de esq_usuario3 con una sentencia como esta:

ALTER USER usuario3 GRANT CONNECT THROUGH usuario1;

Entonces, al conectar con usuario1 tendrías permisos para crear tablas en el esquema del que usuario3 es OWNER.

 

Sobre el punto 2, ya sea con permisos directos o creando roles, que yo sepa no puedes definir en una sola sentencia que un usuario tenga sólo permisos de SELECT sobre todas las tablas y vistas de otro esquema, tienes que asignar los permisos específicamente para cada tabla o vista. No es complicado, pero te obliga a actualizar los permisos cada vez que se crea un objeto nuevo en el esquema, que es lo que entiendo que querías evitar.

Aqui comentábamos ya este tema, pero igualmente te copio un script para creación de un rol con permisos para los objetos de un usuario concreto que también te puede ser útil para la asignación de permisos. Recuerda revisarlo y adaptar los permisos para tus necesidades, como por ejemplo dejar sólo permisos de consulta para las tablas:

CREATE ROLE schem_b_user;

BEGIN
  dbms_output.enable(1000000);

    FOR x IN ( SELECT owner,
                      object_name,
                      DECODE(object_type, 'TABLE' ,   'select, insert, update, delete',
                                          'SEQUENCE', 'select',
                                          'VIEW',     'select',
                                                      'execute') AS privs,
                      DECODE (owner, 'USERA', 'SCHEMA_B_USER' ) AS app_user
                 FROM dba_objects
                WHERE object_type IN ('TABLE',    'PACKAGE', 'PROCEDURE',
                                      'FUNCTION', 'SEQUENCE', 'VIEW')
                  AND owner       IN ('USERA' ))
    LOOP
      BEGIN
         EXECUTE IMMEDIATE 'grant ' || x.privs       || ' on ' || x.owner ||
                           '.'      || x.object_name || ' to ' || x.app_user   ;
--        EXECUTE IMMEDIATE 'create or replace synonym '|| x.app_user||'.'||x.object_name||
--                           ' for ' ||x.owner||'.'||x.object_name ;
      EXCEPTION
        WHEN others THEN
          dbms_output.put_line('Bad owner = '||x.owner||';  Bad app_user='||x.app_user||
                               ';  Bad object_name='||x.object_name);
      END;
    END LOOP;
END;
/
GRANT schema_b_user TO userb;

 

El punto 3 ya lo tienes resuelto si sólo asignas los permisos especificos sobre objetos a cada usuario.

 

Gracias por el comentario.

 

Quisiera añadir que para que que 'U_CONSULTA' pueda trabajar sobre la VISTA sin que la base de datos le devuelva un ORA-00942, este procedimiento también daría resultado: 

   U_DATOS:
   SQL> GRANT SELECT ON TABLA TO U_VISTA WITH GRANT OPTION;

   U_VISTA:
   SQL> GRANT SELECT ON VISTA TO U_CONSULTA;

   U_CONSULTA:
   SQL> SELECT * FROM VISTA;

 

Se elimina por tanto la sentencia de concesión de permisos de U_VISTA a U_CONSULTA sobre el objeto U_DATOS.TABLA:

--   U_VISTA:
--   SQL> GRANT SELECT ON U_DATOS.TABLA TO U_CONSULTA;

 

Con este procedimiento, se restringe aún mas los permisos del usuario U_CONSULTA, ya que este sólo podría realizar una consulta a la vista VISTA y no a la tabla TABLA.
 

Saludos!

 

como podria crear un usuario  y brindarle el privilegio de crear tablas e indices

dentro del usuario system a otro usuario dentro de su sesion?

y que el primer usuario creado al dar privilegios al usuario que creara lo haga con with grant option

por que me marca error que solo con admin option

gracias de antemano

En respuesta a por Ryusaki (no verificado)

Ryusaki, creo que me he perdido, tendrás que explicarte mejor.
A lo mejor lo que quieres hacer es más complicado, pero de momento asegúrate de que al crear el usuario le asignas estos roles para poder conectarse y crear objetos en su propio esquema:
GRANT "CONNECT" TO "APP";
GRANT "RESOURCE" TO "APP";

En respuesta a por Carlos

 disculpa tienes razon tampoco me entendi muy bien,

pues en system debo crear a un usuario con privilegios restringidos

solo crear tablas, vistas e indices con la opcion with grant option, y dentro de ese usuario 

crear otro que tambien pueda crear vistas e indices,

pero me marca error que solo con with admin option o que no tengo suficientes

privilegios. 

gracias de antemano

En respuesta a por Ryusaki (no verificado)

Creo que el problema que tenemos es de nomenclatura. No se puede crear un usuario dentro de otro usuario. A los usuarios se les asigna un tablespace por defecto, que es donde se crean todos sus objetos, si no se especifica lo contrario.

Por lo que dices yo entiendo que quieres crear un primer usuario que pueda crear objetos en el tablespace del usuario SYSTEM. Lo que ya no me queda tan claro es cómo quieres crear el segundo, a lo mejor te sirve simplemente crear otro que también pueda crear objetos en el mismo tablespace.

Comentarte también que no es muy habitual ni recomendable que un usuario cree objetos en el tablespace de SYSTEM, este espacio se suele reservar para objetos del sistema, a menos que esté muy justificado lo que quieres hacer, yo lo haría sobre otro tablespace.

Te recomiendo echarle un vistazo al post Cómo crear un nuevo esquema en Oracle paso a paso, y si sigues teniendo problemas, concretando ya con tablespaces y usuarios seguro que nos terminamos de aclarar.

En respuesta a por Carlos

Saludos.

gracias de nuevo por tu respuesta.

y pues lo del usuario dentro de otro usuario es condicion para mi tarea, asi k no tengo opcion.

y lo peor de todo es que no puedo dar privilegios de system al primer usuario con with grant option

de crear tablas o vistas, y eso tambien es una condicion indispensable para entregar mi tarea,

y ademas tengo que validar que cada usuario creado solo pueda insertar datod dentro de  

una tabla (por ejemplo proyectos) pero que solo

pueda crear proyectos del departamento al que pertenece el usuario, como podria hacer eso? 

con trigger, procedimientos, funciones?

En respuesta a por Ryusaki (no verificado)

 Insisto en que no se puede crear un usuario dentro de otro usuario, puedes asignar a un usuario los mismos privilegios o los mismos roles que a otro, o que compartan el mismo tablespace, o que puedan hacer determinadas acciones sobre los mismos objetos, pero no hay usuarios dentro de otros.

Lo que sí hay, y a lo mejor te refieres a eso es que con la opción WITH GRANT OPTION puedes hacer que el usuario al que concedes privilegios sobre determinados objetos pueda a su vez concederlos a otros usuarios.

Por lo que comentas, seguramente lo que necesitas es conceder permisos de sistema en lugar de privilegios sobre objetos, y para ello, si quieres que el usuario 'autorizado' pueda a su vez conceder estos permisos has de utilizar la opción WITH ADMIN OPTION.

 

Sobre el control de los datos que un usuario inserta en una tabla, si se tratara de un control sencillo podrías utilizar un CHECK, pero por lo que comentas creo que lo más apropiado sería crear un TRIGGER del tipo BEFORE INSERT asociado a esta tabla que antes de cada INSERT haría la comprobación de que el usuario pertenezca al departamento.

buenas tardes yo voy hacer una base de datos en un solo computador q sentencia utilizo para q el resto de las computadoras tengan acceso a ella y poder ver todas las tablas como tambien agregar,eliminar y modificar registro?

gracisas

Saludos.
Deseo dar privilegios a un usuario para que pueda acceder y modificar los datos y la estructura de los objetos de un esquema. Como puedo hacer esto sin necesidad de ejecutar un grant individual por cada objeto del esquema?

Gracias de antemano por la ayuda.

En respuesta a por Reynaldo (no verificado)

Si quieres darle los privilegios sólo para un esquema creo que no te queda otro remedio que hacerlo objeto por objeto. La alternativa más parecida que se me ocurre es aplicar al usuario un grant de sistema, pero estos permisos los tendría para todos los esquemas:

SQL> GRANT SELECT ANY TABLE TO usuario;

 

De todas maneras, puedes utilizar el diccionario para crearte un script y 'automatizar' la concesión de permisos.

 

Puedes crear sinónimos para todos los objetos, para que el usuario no tenga que acceder con el formato 'esquema.tabla' a las tablas:

SELECT 'create public synonym ' || table_name || 
       ' for Esquema.' || table_name || ' to usuario;'
FROM dba_tables WHERE owner = 'Esquema';

 

Y sacar las sentencias de asignación de los permisos:

SELECT 'grant select, insert, update on Esquema.' 
       || table_name || ' to usuario;'
FROM dba_tables WHERE owner = 'Esquema';

 

En respuesta a por Carlos

Buenos Dias.
Soy nuevo en oracle y estube creando algunos roles especificamente para la creacion de objetos tales como tablas vista, secuencias entre otros mas y no consigo cual es el privilegio para crear  los COMMENT en las tablas. agradeseria su maximo apoyo en esto.

En respuesta a por Frank (no verificado)

Hola Frank

Si el usuario que utilizas es el propietario de las tablas no necesita ningún privilegio especial para crear comentarios en ellas.
Si, por ejemplo, el usuario miusuario ha creado la tabla mitabla podrás ejecutar sin problemas la sentencia:

COMMENT ON COLUMN mitabla.nombre IS 'mi comentario sobre el campo nombre';

Si el usuario que utilizas no es el owner de la tabla o vista que quieres comentar necesitará tener el privilegio COMMENT ANY TABLE y si se tratara de comentar en un índice necesitaría el COMMENT ANY INDEXTYPE.

Para concedérselo, con un usuario con privilegios de DBA (System, por ejemplo) ejecuta la sentencia:

GRANT COMMENT ANY TABLE TO miusuario;

saludos,

es para ver si me puedes decir como puedo crear un usuario que tenga el mismo roll de el sys es decir que con este usuario yo pueda hacer lo mismo que hago con el sys (acceso total). gracias

En respuesta a por leonardo_mart

Supongo que ya has creado el usuario, pero si no para crearlo, por ejemplo:

SQL> create user miusuario identified by mipassword;

Y para asignarle los privilegios de sys, que son privilegios de DBA, tan sencillo como:

SQL> grant DBA to miusuario;

Eso sí, necesitarás hacerlo con el usuario sys que comentas, u otro usuario que tenga permisos de DBA para conceder este tipo de privilegios.

 

 Buenas tardes, quisiera que me ayudarán en algo por favor.

 

Tengo un usuario que pidió copiar unas tablas de una BD de Producción a una de Desarrollo (prueba) , luego de esto indica que no puede acceder a una tabla, es la unica persona que no puede. Como puedo revisar si ese usuario tiene permiso? 

 

Gracias

Buenas tardes

Me pidieron crear una aplicacion en el APEX de oracle haciendola me di cuenta que requeria crear un directorio para cargar las imagenes de mis productos pero cuando intente correr:

CREATE OR REPLACE 

DIRECTORY IMAGES AS 'C:\ORACLE\BLOB\IMAGES';

Me dice  ORA-01031: insufficient privileges

Hay ya sabría que son privilegios, pero no sé dónde puedo entrar a la consola de el system a darle los privilegios al usuario ya que lo que he trabajado es en el apex y ya. Por otro lado lo intente con el un SQL comand line y me dice no conectado.

 

si se puede una explicacion de como cargar las imagenes a un campo de tipo de dato BLOB seria chévere

Gracias

 

 

En respuesta a por fermarin89

Si la instalación de Oracle la tienes en local, sólo tienes que entrar en SQLPlus desde linea de comandos. Para asignar privilegios al usuario que utilizas necesitarás utilizar un usuario administrador, con permisos de DBA, por lo que si sólo has utilizado APEX, lo más sencillo es que lo hagas de esta manera:

Entrar en SQLPlus como DBA sin introducir password

 

 

Si me puede colaborar con lo siguiente

Desde un usuario con rol de administrador llamado “hr”  el cual es propietario de dos tablas llamadas “employess” y “departments” he creado un usuario llamado “usuario1” y he creado un rol llamado “palma” con privilegios para hacer select a las dos tablas mencionadas, para crear vistas, para crear tablas y para crear sesión, este rol se lo he dado a “usuario1”, además he creado un sinónimo público para cada una de las tablas, las siguientes son las sentencias

 

Créate user usuario1 identified by clave

create role palma

 

grant select on employees to palma

grant select on departments to palma

grant create view to palma

grant create table to palma

grant create session to palma

 

grant palma to usuario1

create or replace public synonym departments

for hr.departments

 

create or replace public synonym employess

for hr.employess

 

Mi problema es que al iniciar sesión con “usuario1” y tratar de crear una vista llamada “vista1” con la siguiente sentencia, me dice que no tengo privilegios suficientes para crear la vista.

 

create or replace view vista1 as

select * from employees

 

le agradezco si me puede ayudar con este inconveniente.

 

 

 

Las sentencias son exactamente como las escribes? Porque al sinónimo le llamas 'employess', y la vista la creas sobre 'employees'

De todas maneras, para no liarte con el sinónimo puedes crear la vista haciendo referencia directa a la tabla, en lugar del sinónimo:

create or replace view vista1 as select * from hr.employees

 

 hola carlos:

 

por que cuando me conecto por medio del bde del delphi a mi usuario en oracle aparte de aparecerme mis

tablas del usuario creado tamb me aparecen las del system oajala y me puedas responder la pregunta por favor

 

Hola!! Tengo una duda acerca de el otorgar privilegios, necesito crear un usuario que pueda consultar todas las tablas menos 1 (cliente por ejemplo) le hago el grant select any table to usuario1 pro no se como quitarle el permiso a esa unica tabla?? gracias!!

buenas tardes Señores, Tengo un dilema , les escribo por si me pueden ayudar, tengo una tabla el cual hago un select en pl y muestra correctamente los registros, sin embargo si este select lo ato un reporte, me genera un error de tabla o vista no existe. He chequeado los permisos, sinonimos y nada.. De antemano agradezco su colaboración. Saludos!

 

 Buenas tardes Señores

Tengo un dilema , les escribo por si me pueden ayudar, tengo una tabla el cual hago un select en pl y muestra correctamente los registros, sin embargo si este select lo ato un reporte, me genera un error de tabla o vista no existe.

 

He chequeado los permisos, sinonimos y nada..

 

De antemano agradezco su colaboración.

 

 

En respuesta a por Karol

Hola Karol, Si ya resolvio el problema perverso, pero si no, intente desde el reporte poner : user.table ejecute el reporte, si se ejecuta correctamente es por que le falta el sinonimo o grant a la tabla para que el usuario con que lo esta ejecutando desde report tenga acceso create synonym nombre_tabla from user.nombre_tabla; grant select on tabla to userqueejecutaelreporte Saludos Pura vida.

hola carlos,
como podria hacer para utilizar en mi aplicacion de apex los usuarios de oracle con sus respectivos roles, privilegios, etc y no los de apex.
gracias de ante mano..

hola necesito ayuda para hacer una modificacion de character set
estoy utilizando Oracle 11 y mi schema ya esta en producción
trato de alterar la tabla:

ALTER TABLE ESCOLARIDAD CHARACTER SET utf8;
pero me manda el siguiente error :
Informe de error:
Error SQL: ORA-01735: opción ALTER TABLE no válida
01735. 00000 - "invalid ALTER TABLE option"
pense que eran los privilegios del usuario pero ya tiene todos los privilegios hacia una tabla
y gracias de antemano =)

Hola a todos, tengo el siguiente problema, al iniciar la implementacion de un aplicativo sobre oracle 11g ,se le dio permisos de dba a un usuario, ahora la auditoria solicita quitar estos permios de dba, los quite pero empezaron a salir mensajes en el aplicativo al ejecutar algo como "no existen privilegios en tablespace USERS",revisé y hay muchas tablas creadas en el tablespace "users" por este usuario, pero el usuario tiene un tablespace asignado llamado PALMA. Q instruccion debo ejecutar para darle privilegios sobre este tablespace especificamente a esas tablas Y Puedo cambiar estas tablas al tablespaces Palma?

Sobre los permisos, los usuarios tienen un tablespace definido por defecto, pero los permisos se definen más bien sobre las tablas, no sobre los tablespaces. Puede que el problema sea que al quitarle los privilegios de DBA necesites asignar algún permiso genérico. Te enlazo un artículo en el que se comenta cómo crear un nuevo esquema de usuario desarrollador de Oracle para que puedas revisar si tu usuario tiene los permisos básicos para trabajar.

Sobre mover las tablas a otro Tablespace, enlazo otro post en el que se explica cómo unificar tablespaces en Oracle 10g, ojo con esta operación, que no es complicada, pero es delicada, si lo haces prepáralo bien y te recomiendo que hagas antes una prueba con una tabla que no utilice nadie.

 

 Bueno de tanto buscar la solución es la siguiente...

 

 

   FOR R IN (SELECT owner, table_name FROM all_tables WHERE owner='TheOwner') LOOP

      EXECUTE IMMEDIATE 'grant select on '||R.owner||'.'||R.table_name||' to TheUser';

   END LOOP;

END;

 

Si quieres aplicarlo a un PROCEDURE cambia "all_tables" por "all_procedures"

 

 

 

Buenas tardes solicito su ayuda mi problema es el siguiente:
Desde el usuario system@xe; connect Normal, trato de compilar un pck que tiene en uno de sus cursores la vista v$process, pero obtengo como error: La tabla o vista no existe, pensé que era por permisos de administrador, pero me sigue saliendo el mismo error. Necesito compilar el pck pero con conexión Normal, porque en SYSDBA no me aparece este error, pero las tablas que se encuentran en el pck y otros prc, los tengo creados en modo de conexión normal, y al pasar a conexión SYSDBA las tablas creadas aparecen que no existen.

Prueba a poner delante de los objetos el nombre del propietario. Como SYSDBA has de tener acceso a todo, pero si la tabla la ha creado otro usuario y no hay ningún sinónimo público definido sobre la misma has de indicar delante de la misma el usario propietario.

Por ejemplo: SELECT * FROM usuario.tabla

hola buenas, tengo este codigo para generar dos tablas y me da error el crearlas, me podrias decir en q fallo?

CREATE TABLE DIRECCIN(
IDDIRECCION NCHAR(7) NOT NULL CONSTRAINT PK_IDDIRECCION PRIMARY KEY,
CALLE VARCHAR2(30) NOT NULL,
NUMERO NCHAR(4),
PISO NCHAR(2),
LETRA CHAR(2),
CP NCHAR(5),
POBLACION NCHAR(15) NOT NULL
);

Buenas, Me gustaría que pudieran ayudarme con un problema. Tengo creadas unas tablas ya con sus respectivos synonimos y con los privilegios asignados. Sin enbargo cuando intento jalar esa tabla desde APEX, éste no puede ver las tablas que he creado!! Que debo hacer para que las tablas puedan ser vistas por APEX???

hola carlos un favor soy nuevo en esto de los permisos mira este es mi problema

 

tengo un usuario 'sisalman' con varias tablas, lo que me piden es crear otro usuario 'basico' el cual pueda ver todas las tablas del usuario 'sisalman' pero que solo pueda ejecutar sentencias select, para esto estoy usando Oracle 10G y Toad 9, te agradesco mucho

Hola a todos

Quisiera pedirles su apoyo.

Tengo una funcion que levanta un concurrente en oracle. Si la ejecuto en el esquema apps funciona bien pero si lo hago desde apex no levanta el concurrente.

 

Ya le di permisos al esquema para que vea la funcion, ya no me marca error en cuanto a que no la ve pero sigue sin levantar el concurrente.

 

Hay algo mas que deba hacer para apex pueda levantar el concurrente en oracle?

 

Saludos y gracias

buen dia, necsito de su colaboracion con los siguiente, tengo tres usuarios y uno de ellos es un esquema (usuario1, usuario2, esq_usuario3), como hago para crear roles y dar los siguientes privilegios:

1- el usuario1 puede consultar, actualizar, borrar, alterar, crear tablas o vistas en esq_usuario3

2- el usuario2 solo puede consultar las tablas y vistas del esquema esq_usuario3 tanto las actuales como las que se vallan creando, pero el usuario2 no puede actualizar, borrar, alterar ni crear tablas o vistas en esq_usuario3

3- el usuario1 no puede actualizar, borrar, alterar, crear tablas o vistas en ningun otro esquema diferente a esq_usuario3;

Buenas, Quisiera que me ayudara sobre un problema que tengo.

La Version de Oracle que uso es la versión 11.2.0.4. y bueno de lo que se trata el problema es que hay usuarios que no tienen permisos de actualización (update) sobre una determinada tabla pero al intentar el usuario hacer un “select for update” sobre esa tabla por más que le haya salido mensaje de que no tiene permisos, aun así logra bloquear la tabla y varios usuarios que si tienen permisos de update no puedan actualizar la tabla porque esta bloqueada debido al usuario que no tiene permisos de update y bloqueo la tabla y lo que se quiere es que por mas que intente hacer un "select for update", aparte de que no pueda hacerlo se desea que tampoco bloquee la tabla y no ocasione el problema.

He estado revisando y encontre una solución pero para la version 12c y no para la 11g en la que a un usuario se le quita los privilegios de select y se le otorga privilegio de read:

SQL> revoke select on sh.solo_lectura from usuario_solo_lectura; Revoke succeeded. SQL> grant read on sh.solo_lectura to usuario_solo_lectura; Grant succeeded.

Como podria otorgar permisos de lectura a un usuario para una determinada tabla para que no ocasione esos problemas mas o menos como el privilegio READ en la version 12c.

 

Gracias de Antemano.

Buenas tengo una duda con un script en oracle 12c soy nuevo utilizado oracle Como genero un script que me autogenere el bloqueo de todos los usuarios de la base de datos excluyendo SYS - SYSTEM

Cuestiones sobre vistas materializadas de Oracle

Cuestiones sobre vistas materializadas de Oracle Carlos 22 Enero, 2010 - 11:59

Abro este tema a propósito del artículo Vistas materializadas de Oracle para optimizar un Datawarehouse para que comentemos aquí cualquier cuestión relacionada con la creación, funcionamiento, consejos, errores, etc. de Vistas Materializadas de Oracle.

Enlazo para empezar la consulta que ha hecho Elena en el tema Cuestiones sobre los dblinks de Oracle sobre la creación de vistas materializadas a partir de tablas remotas (enlazadas por database links).

Tengo una duda, estoy haciendo un replica entre dos bases de datos Oracle 10g mediante vistas materializadas.

Todo bien hasta ahi, el problema es que se estan agregando columnas a la tabla principal pero estos cambios no los puedo reflejar en la tabla de replica. Mi duda es ¿Como modifico el Query que consulta la tabla principal para agregarle dentro de esa sentencia las nuevas columnas?

 

saludos

En respuesta a por OMARE (no verificado)

Buena pregunta. En teoría la única manera de agregar columnas a una vista materializada es borrar la vista y volver a recrearla completamente con la nueva definición.

El problema es que no existe ningún comando tipo ALTER TABLE que se pueda aplicar a las vistas materializadas para agregar columnas, o simplemente para cambiar la definición de una columna.

Para vistas con pocos datos no hay ningún problema, la recreación puede ser rápida. El problema viene cuando hablamos de vistas materializadas grandes, de un Data Warehouse por ejemplo, donde la recreación puede ser muy costosa.

Pero siempre hay una solución para todo. En el Blog de Arup Nanda he encontrado un excelente post que explica cómo ingeniárselas para alterar la definición de una vista materializada sin recrearla completamente.

Se trata de utilizar la opción ON PREBUILT TABLE al crear la vista para que la vista se apoye internamente en una tabla. Cuando se ha de realizar alguna modificación se borra la vista, pero la tabla interna permanece. Se realiza un ALTER TABLE sobre esta tabla, y después se vuelve a crear la vista materializada a partir de la tabla. Como la tabla ya existe la creación de la vista es muy rápida.

Extraigo a continuación las sentencias que permitirían hacerlo, consultar el detalle en el post original:

SQL> create table mi_vista (contador number(10));

SQL> create materialized view mi_vista on prebuilt table never refresh as select cast(count (1) as number(10)) contador from t1;

SQL> DROP MATERIALIZED VIEW mi_vista;

SQL> alter table mi_vista modify (contador number(11));

SQL> create materialized view mi_vista on prebuilt table never refresh as select cast(count (1) as number(11)) cnt from t1;

Y ahora me dirás que tu ya tienes creada tu vista materializada y esta solución llega un poco tarde. Es cierto, pero para eso Arup Nanda también propone una solución para hacer una reconstrucción de la vista materializada con el mínimo impacto en el rendimiento de nuestra base de datos:

1. Crear una tabla con la opción nologging a partir de la Vista materializada
SQL> create table nueva_vista_materializada nologging as select * from mi_vista;
2. Recoger la definición de la Vista materializada del diccionario de datos
SQL> select dbms_metadata.get_ddl ('MATERIALIZED_VIEW','MV1') from dual ;
3. Guardarla en un fichero que se ejecutará después
4. Editar el fichero añadiendo la opción ON PREBUILT TABLE.
CREATE MATERIALIZED VIEW "DATAPRIX"."MI_VISTA"  ("contador")ORGANIZATION HEAP ON PREBUILT TABLE PCTFREE 10
5.Hacer export de tipo Data Pump con la opción CONTENTS=METADATA_ONLY.
6. Eliminar la Vista materializada "mi_vista".
7. Renombrar la tabla nueva_vista_materializada a mi_vista.
8. Ejecutar el script creado anteriormente para recrear la Vista materializada
9. Importar el fichero de Dump exportado anteriormente.

Bueno, espero que esto te sirva, ya nos explicarás si lo has podido aplicar.

Hola tengo una interrogante, estoy haciendo un replica entre dos bases de datos en Oracle 10g Xpress Edition usando vistas materializadas, pero como puedo saber que datos son los que se han actualizado, se trabaja con muchos registros y necesito consultar solo los que se han actualizado, las vistas se actualizan diariamente, si me podrían ayudar con esto sería genial es muy importante para mí. Saludos :)

En respuesta a por DavidC

Vistas materializadas con una Express Edition? Si no me equivoco sólo puedes utilizar vistas materializadas con bases de datos Enterprise Edition. No estarás utilizando vistas normales?

Si son vistas 'de toda la vida' es lógico que no puedas consultar información sobre cambios, los datos de la vista se seleccionan dinámicamente cada vez que la llamas.

Lo habitual en estos casos es crearte campos de control de cambios, y actualizarlos con los procesos que puedan realizar esos cambios, o con triggers que informen el campo con la fecha actual después de cada update.

Eso sí, cuidado con los triggers, porque según la frecuencia de updates y el volumen que tengas podrían efectar negativamente al rendimiento de la base de datos.

En respuesta a por Carlos

Hola si es una Express Edition 10g, sí hay el objeto de vistas materializadas usando esa versión, una opción era usando triggers pero está del rendimiento de la base de datos y dado el volumen de datos, la otra que estaba revisando es con los logs de la vistas materializadas, muchas gracias por responder :)

Pues yo estaba convencido de que la versión XE no permitía utilizar vistas materializadas, incluso consultando la comparativa de Oracle de opciones de las diferentes 'Editions' da la sensación de que en esta versión no se incluyan, pero si las estás usando está claro que sí.

Consultando la información sobre licenciamiento de Oracle Database Express Edition, parece que lo que no está incluído es el Query Rewrite con vistas materializadas (Materialized View Query Rewrite), pero sí una replicación básica con vistas materializadas de sólo lectura y actualización, que supongo que es lo que tú estás utilizando:

Basic Replication

Yes (read-only and updateable materialized view site only)

 

 

En cualquier caso espero que nos puedas explicar si sacas algo en claro con los logs, poder utilizar un método sencillo de replicación con BBDD Oracle XE seguro que va a interesar a mucha gente.

queria preguntarle si no tienen un tutorial de como realizar replicacion con vistas materializadas y con la que version de oracle es la adecuada soy novata en el tema y me seria de mucha ayuda solo es como proyecto de pruva entre dos o tre maquinas

 Hola a todos!

 

Me gustaria crear una vista materializada por medio de una select con join la cual va a tener una actualización mensual automatica. He hecho lo siguiente:

 

CREATE MATERIALED VIEW nombre_vista

 

BUILD IMMEDIATE

REFRESH  START WITH sysdate NEXT +1 MONTH FORCE

ENABLE QUERY REWRITE

AS

 

SELECT * FROM 

(SELECT created, billed, global_user_actives, optin, optout, new_users, dif, 

global_user_actives - SUM(new_users) OVER (ORDER BY created DESC) as actives_S_M, 

global_user_actives - SUM(new_users) OVER (ORDER BY created DESC) + new_users as actives_E_M, 

(CASE WHEN (global_user_actives - SUM(new_users) OVER (ORDER BY created DESC) + new_users) =0 THEN 0 

      ELSE (billed/(global_user_actives - SUM(new_users) OVER (ORDER BY created DESC) + new_users)) * service_mult END) arpu, service

 

FROM 

( select to_char("created_at", 'yyyymm') "CREATED", 

SUM( CASE WHEN "id_event" IN ('1', '5', '3') and "billed" = '1' THEN 1 WHEN "id_event" IN ('6', '4') and "billed" = '1' THEN "percent_billed"/100 ELSE 0 END) AS BILLED, 

(select count("id") from "subscriber" join "subscriber_status" on "subscriber"."status" = "subscriber_status"."id_status" where "subscriber"."status" = 1 and "subscriber"."id_service" = '8') as global_user_actives, 

SUM( CASE WHEN "id_event" IN ('1') THEN 1 ELSE 0 END) AS optin, SUM( CASE WHEN "id_event" IN ('2') THEN 1 ELSE 0 END) AS optout, (SUM( CASE WHEN "id_event" IN ('1') THEN 1 ELSE 0 END) - SUM( CASE WHEN "id_event" IN ('2') THEN 1 ELSE 0 END)) as new_users, 

((select count("id") from "subscriber" join "subscriber_status" on "subscriber"."status" = "subscriber_status"."id_status" where "subscriber"."status" = 1 and "subscriber"."id_service" = '8') - (SUM( CASE WHEN "id_event" IN ('1') THEN 1 ELSE 0 END) - SUM( CASE WHEN "id_event" IN ('2') THEN 1 ELSE 0 END))) as dif, 

 

(COALESCE( AVG("service"."price")*AVG("service"."revenue")/100 , 0)) as service_mult, AVG("service"."id") service

 

from "subscriber_events" 

JOIN "service" ON "subscriber_events"."id_service" = "service"."id" 

where "id_event" IN ('1', '2', '3', '4', '5', '6') 

 

 

 

Por lo que me he podido informar ... creo que la vista estaria bien creada de este modo. La duda la tengo con la creacion de los logs. Mi idea es crear varios log (uno para cada tabla de la query) los cuales serían algo así:

 

CREATE MATERIALED VIEW LOG ON  "tabla"

 

WITH PRIMARY KEY, ROWID

INCLUDING NEW VALUES;

 

No consigo entender muy bien los atributos correctos que se le deberia darle al log y por eso os pido vuestra opinion para ver que os parece el proceso que he realizado y si es posible mejorarlo en algo.

 

Un saludo y gracias

 

Mario

Hola, tengo una pregunta...

Necesito modificar la defnicion del select de la vista, se puede usar un ALTER MATERIALIZED VIEW en este caso?

y su se puede me dicen como es la sentencia porque no me funciona, lo escribi asi:

 

ALTER MATERIALIZED VIEW mi_vista

as SELECT.... ;

 

muchas gracias

Envio de eMails y SMS's con PL/SQL

Envio de eMails y SMS's con PL/SQL Carlos 20 May, 2010 - 17:09

Abro este tema de envio de eMails y SMS's desde Oracle y PL/SQL para que podamos comentar dudas sobre cómo utilizar los paquetes que nos permiten el envío de eMails desde la base de datos, y otros mecanismos para crear nuestros propios sistemas de alertas, o simplemente informativos.

En este comentario de betorey_24 ya podemos encontrar un método para enviar emails con UTL_SMTP.

Y después elicived también nos recomendaba consultar el artículo Sending e-mail from Oracle, de Burleson Consulting

 

Que tal Carlos, una molestia he estado buscando en internet y no veo la forma de como enviar un SMS a un celular desde un PL/SQL, lo que he encontrado es que te lo manda pero como correo a tu cel y lo que me interesa es que sea un vil SMS ¿Sabes si Oracle tiene algo al respecto?

 

Saludos y Gracias.

En respuesta a por isunza

El envio de SMS's depende siempre de que las operadoras ofrezcan una interface para poder hacerlo, y cada una tiene su plataforma, y sus reglas. No creo que Oracle ofrezca ningún package que vaya actualizando con los protocolos de las operadoras telefónicas, por eso todo lo que encuentras es para enviar eMails.

No sé si lo has visto, pero hay operadoras que permiten enviar un eMail a una dirección que incluye el número de móvil, y ellas se encargan de hacer llegar el SMS al móvil. Es la opción más sencilla, pero dependes de si la operadora a la que envías el SMS ofrece este servicio. En EEUU lo tienen muchas, y lo llaman SMS gateway, es cuestión de investigar si la que tu utilizas lo ofrece. De momento puedes consultar este listado.

La otra opción (aparte de tener tu propia plataforma de mensajería ;)) es utilizar un servicio público de terceros que sí se dedican a 'entenderse' con las plataformas de las operadoras. Buscando también se puede llegar a encontrar alguno, aunque el servicio no suele ser gratuíto.

En el blog Inside Oracle APEX publican un ejemplo sobre cómo enviar SMS's con un procedure PL/SQL utilizando los servicios web de Esendex, y un usuario de prueba que has de crearte primero.

Ya nos dirás si al final lo consigues!

Buenos días,

Estoy intentando enviar un mail con una imagen desde Oracle con PL/SQL. Consigo hacerlo adjuntando la imagen, pero lo que quiero es que vaya en el cuerpo del mensaje. ¿Alguien puede ayudarme?.

Muchas gracias

En respuesta a por jonaesp

Microsoft Outlook no soporta en el BOBY imagenes de fondo, si lo que quiere es poner imagenes en el BODY (ya sea por DIV's o por TR's) DIRECTAMENTE NO SE PUEDEN INSERTAR. Lo que puedes hacer es guardarlas en un Directorio de un Servidor WEB y poner la ruta ha dicha imagen en el HTML o bien usando un CSS.

 

Ojala y te sirva de algo la respuesta.

Hola Carlos,

Quisiera ver si Ud. o alguna otra persona de las que aquí visitan me pueden hacer el favor de ayudarme.

Es que necesito enviar un correo desde PL/SQL a través de una cuenta de gmail.

Como el servidor smtp.gmail.com requiere de conexión segura, se me ha hecho imposible.

¿tendrán  ustedes algún procedimiento que resuelva esto?

Un millón de Gracias.

 

En respuesta a por Manuel

Hola Manuel

He encontrado en el post PL/SQL and Gmail (or UTL_SMTP with SSL)  del blog Monkey on Oracle una solución que a lo mejor te sirve.

En el post se explica que UTL_SMTP no soporta SSL, como ya has podido comprobar, y propone salvar el inconveniente utilizando Stunnel, una herramienta que permite crear una capa SSL sobre la conexión.

Ya nos contarás si te funciona.. 

Hola Carlos,

 

Te agradezco infinitamente tu rápida respuesta.

Ese post que me envías, pues lo probé en estos 3 días en que ando buscando la solución a ese problema y no pude terminarlo.

Hay una primera parte donde se instala el Stunnel y luego se comprueba usando telnet localhost 1925 y debe dar el resultado: 220 mx.google.com ESMTP 5sm18031572eyh.34

Hasta ahí todo mee fue bien, pero de ahí hacia abajo NO logré hacerlo ... lógicamente debe ser algo que no estoy entendiendo.

Por ejemplo, debajo de:

" Para crear una lista de control de acceso para el usuario de la aplicación, y que le permite conectarse a localhost en el puerto 1925, haga lo siguiente:"

viene un código que no logro entender si se trata de un PROCEDURE, me parece como si fueran 3 PROCEDURE, tampoco me doy cuenta si esos procedimientos lo ejecuto una sola vez.

Volveré a intentar a ver si logro algo ... si Ud. tiene algún comentario que darme, se lo agradezco.

Gracias.

En respuesta a por Manuel

En el código que comentas, por lo que veo se está utilizando el package dbms_network_acl_admin para configurar la conexión sobre la que se está utilizando Stunnel. No es un procedure, son simplemente tres pasos previos que tienes que ejecutar directamente para que después el procedure funcione, una inicialización previa.

 

 Hola Carlos: 
Soy nuevo aqui, me parece muy interesante el blog. Necesito mandar un e.mail con PLSQL, lo enviar, pero no se como adjuntar un archivo, agradeceria tu ayuda. Muchas gracias.

 

Otra duda... Quiero enviar mail comun desde la base de datos, ya lo logre hacer con SYS pero quiero hacerlo con otro usuario y no me deja, me da error de que no tiene habilitado ACL.

Cuando quiero ejecutar el siguiente codigo para crear ACL:

BEGIN

   DBMS_NETWORK_ACL_ADMIN.CREATE_ACL (

    'utl_smtp.xml',

    'SMTP Access',

    'USUARIO',

    TRUE,

    'connect',

    null,

    null

  );

  COMMIT;

END;

 

y los otros 2 procedimientos que siguen tampoco me deja, porque me dice que esta corrupto el package body DBMS_NETWORK_ACL_ADMIN.

 

Sabes como puedo solucionar eso?

 

 

En respuesta a por diegozaw

Hola Diego

 

Si el código del package está corrupto tendrías que repararlo volviendo a cargar el código del package. Te enlazo un post que explica cómo reparar packages inválidos.

Pero sobretodo asegúrate antes de tocar nada de que realmente el cuerpo del package no está bien, ya que la operación de recrear y recompilar los packages y vistas del catálogo no deja de ser delicada.

Como explican en el post, antes de nada, para comprobar el estado general utiliza a sentencia 

SELECT r.comp_name, r.version, r.status FROM dba_registry r;

 

Hice todo lo que decia pero no me funciona, es mas me compila todo menos el package DBMS_NETWORK_ACL_ADMIN.

Tengo otra base de datos que tambien tiene corrupto ese package pero igual envia con otro usuario distinto a SYS, es muy raro.

En respuesta a por diegozaw

Buscando un poco he encontrado este post donde comentan que para utlizar ACL se ha de tener instalado previamente XML DB, ya que las ACL se almacenan en XML DB:

The 11g allows access to external packages UTL_TCP, UTL_HTTP, UTL_SMTP, UTL_MAIL, UTL_INADDR, DBMS_LDAP, but the access must be granted explicitly. Please note that ACLs are stored in XML DB and user must install XML DB for the use of ACL, if not installed.

Podría ser eso, comprueba si tienes instalado XML DB, y prueba suerte de nuevo :)

 

Hola Carlos

Esta buenisimo el tema, pero tengo una duda. Yo cree ya una ACL direccionando al correo de la empresa y todo funciono perfecto.

Ahora necesito utilizar gmail, solo funciona con Stunnel? debe instalarse en el servidor donde este la base de datos?

gracias por la ayuda

 

Hola Carlos, mi pregunta es: como se puede recibir correos mediante Oracle, poder obtener el remitente, asunto, cuerpo del mensaje y los archivos adjuntos? muchas gracias por la ayuda

En respuesta a por Yesenia

La verdad es que nunca he utilizado Oracle para recibir o almacenar correos. No sé si existe algún package específico que te permita parsear directamente los campos sobre una tabla, y además almacenar ficheros adjuntos.

Si no, lo que seguro que encontrarás es alguna utilidad externa para convertir los mails a XML, y después podrías importarlos a Oracle con las utilidades para trabajar con XML.

 

Hola, cómo puedo enviar emails a otros dominios como hotmail, etc? Internamente puedo enviar emails, pero para enviar externos me sale ORA-29279:SMTP permanent error: 550 5.7.1 Unable to relay.
Gracias de antemano

Hola Carlos,

Actualmente existe un procedimiento que esta utilizan el utl_SMTP. Los correos salen perfectamente sin ningun problema. Sin embargo luego de varios dias, resulta que los correos no salen, entonces bajo la base de datos e inmediatamente empiezan a salir. Sabes que podrá ser el problema? Algun parametro en la base de datos?

Muchas gracias por su ayuda.

saludos,

Buenos dias...hay alguna manera de recibir correo en plsql..es que necesitamos recorrer la cabecera del correo para sacar de ahi la fecha en la q se ha enviado un correo..me podrias dar algun tipo de orientacion ya sea en este lenguaje o algun otro.. Gracias.

En respuesta a por Jean Carlos Oyague (no verificado)

Lo que yo tengo es un archivo en lenguaje pl/sql que permite enviar mensajes desde mi dominio da.go.cr. Si desea le puedo dar ese archivo, escríbame a: mgarcia at da.go.cr Con ese archivo no creo que pueda resolver lo de recorrer la cabecera del correo, pero si lo necesita, ya sabe, estoy a su disposición.

Hola Carlos, estoy probando UTL_MAIL sobre una Base Oracle 11G (que utiliza UTL_SMTP haciendo mas facil la programacion del PL/SQL para enviar mails).

Pero me encuentro con un problema que no logro resolver. Para descartar un tema de conectividad use el UTL_SMTP y resolvio perfecto. Se enviaron los mails. Ahora cuando utilizo el UTL_MAIL me da un error extraño de tipo de datos.

Intente cambiar todo al tipo de dato definido en el PR de UTL_SMTP y nada.

Copio debajo el codigo ORA que me arroja:

ORA-06502: PL/SQL: error numérico o de valor ORA-06512: en "SYS.UTL_MAIL", línea 654
ORA-06512: en "SYS.UTL_MAIL", línea 671 ORA-06512: en "PRC_SEND_MAIL", línea 19
ORA-06512: en línea 1

La linea #19 se corresponde con la llamada al UTL_MAIL.SEND()
La llamada la hago asi: EXEC PRC_SEND_MAIL('laura@dominio', 'laura@dominio');
y te paso el código porque no le encuentro la vuelta.

CREATE OR REPLACE PROCEDURE PRC_SEND_MAIL (p_from IN VARCHAR2, p_to IN VARCHAR2, p_cc IN VARCHAR2 DEFAULT NULL, p_co IN VARCHAR2 DEFAULT NULL, p_subject IN VARCHAR2 DEFAULT 'Subject vacio', p_message IN VARCHAR2 DEFAULT 'Mensaje vacio') AS mail_conn UTL_SMTP.connection;
p_smtp_host VARCHAR2 (30) := 'smtp-desarrollo.grupo.dominio.com';
p_smtp_port NUMBER :=25;
vMType VARCHAR2(30) := 'text/plain;
charset=us-ascii';
BEGIN mail_conn := UTL_SMTP.open_connection (p_smtp_host, p_smtp_port);
UTL_MAIL.SEND( sender => p_from, recipients => p_to, cc => p_cc, bcc => p_co, subject => p_subject, message => p_message, mime_type => vMType, priority => 3 );
UTL_SMTP.quit (mail_conn);
EXCEPTION WHEN utl_smtp.Transient_Error OR utl_smtp.Permanent_Error THEN NULL;
dbms_output.put_line ('Error: '||SQLERRM);

/ Les agradecere muchisimo vuestras colaboraciones.

 

Base de Datos Lenta

Base de Datos Lenta Gustavo.chavez 5 Marzo, 2014 - 17:52

 Hola buen dia!

Me gustaria pedir informacion acerca de la optimizacion de la BD oracle, ya que en actualmente tenemos un problema con una base de datos, el problema es que nuestra base de datos esta muy lenta.

Ya le hemos cambiado algunos parametros en la BD, pero aun asi nada. 

Utilzamos una aplicacion Cliente - Servidor y untilizamos el procesamiento por lotes (Batch).

 

Me podrian apoyar indicandome que comsultas pudiera correr para investigar si mi base de datos esta sana, y el porque de la lentitud.

 

Adjunto una imagen el cual me indica en el plana de ejecucion los siguientes datos,

 

Saludos

 

 

 

 Que tal Gustavo

La lentitud se puede dar por n escenarios querys mal diseñados, bloqueos en la base de datos, consumo en I/O, fragmentacion en las tablas e indices, etc.

 

Por lo que muestras en el plan de ejecucion te recomiendo lo siguiente:

--Generar estadisticas tu esquema owner (ejemplo con X7)

exec dbms_stats.gather_schema_stats (ownname=>'X7', estimate_percetnt=>10);

 

--Habilitar el monitoreo de los indices que de tu owner

ALTER INDEX "INDEXNAME" MONITORING USAGE;

 

ALTER INDEX "INDEXNAME" NOMONITORING USAGE; (para deshabilitar el monitoreo)

Revisa la vista v$object_usage para validar cuales se estan utilizando, los que si se usen recrealos con un REBUILD los que no eliminalos de tu base de datos

 

--Shrink de tablas

Con esto vas a compactar los bloques vacios que tengas en tablespace, esto te ayuda a no tener tanto I/O en tablespace my grandes, si son tablas grandes evalua el particionamiento.

 

Primero habilitas el monitoreo

ALTER TABLE "TABLENAME" ENABLE ROW MOVEMENT;

 

ALTER TABLE "TABLENAME" SHRINK SPACE CASCADE;

si no te recupera espacio muevelos a otro tablespace con un ALTER TABLE "NOMBRE" MOVE TABLESPACE "TBSNAME"; y luego regresalos al original, ten cuidado con los segmentos LOB para esos la sentencia para moverlos es 

ALTER TABLE OWNER.TABLA MOVE LOB("nombredecolumnalob") store as (tablespace "nombredetablespace")

 

Ya que acabes con esto genera otra vez las estadisticas por los cambios de bloques y registros en los indices.

 

Si la consulta no te toma los indices checa la opcion de usar el HINT para forzara a que los use.

 

Saludos

Ayuda con un query

Ayuda con un query kobeson 9 Octubre, 2013 - 17:13

Buen dia,

Antes que nada un saludo a toda la comunidad y aprovechando a ver si me pueden ayudar a armar un query. Tengo el siguiente query el cual me da cada numero que tiene mas de un mensaje 2001 en la table b;

select distinct a.number_from, count(*) 
from xnp_port_msg_range a join xnp_port_msg b on b.req_seq=a.REQ_SEQ 
where b.msg_type_id='2001' and b.create_time between to_date('20131008','YYYYMMDD') and to_date('20131009','YYYYMMDD') 
group by a.NUMBER_FROM having count (*) > 1

El total de lineas que me regresa es de 7800.

Ahora lo que quiero es que envez que me de cada linea, me las agrupe por mes, es decir que me de el count por mes del total de casos en los que el number_from tiene mas de 1 mensaje 2001 Intente de esta forma pero no me da el mismo resultado del query anterior;

select to_char(b.create_time,'YYYY/MM') , count(*) 
from xnp_port_msg_range a join xnp_port_msg b on b.req_seq=a.REQ_SEQ 
where b.msg_type_id='2001' and b.create_time between to_date('20131008','YYYYMMDD') and to_date('20131009','YYYYMMDD') 
group by to_char(b.create_time,'YYYY/MM') 
having count ( a.NUMBER_FROM) > 1

Podrian por favor ayudarme con esta situacion? estoy usando oracle 11 g. Gracias de antemano.

Bueno ya tengo el query funcionando

select create_time, count(*) from(

select to_char(b.create_time,'YYYY/MM') create_time, count(1) from xnp_port_msg_range a join xnp_port_msg b on b.req_seq=a.REQ_SEQ where b.msg_type_id='2001'

and b.create_time between to_date('20131008','YYYYMMDD') and to_date('20131009','YYYYMMDD')

group by to_char(b.create_time,'YYYY/MM'), a.number_from

having count (a.NUMBER_FROM) > 1)

group by create_time

ahora necesito convinarlo con estro otro query;

select to_char(create_time,'YYYY/MM'), count(*) from xnp_port_msg where msg_type_id='1001' and service_type='MOBIL_PRE'; probe agregarle un "and exists y el query anterior pero no funciona"

 

alguna idea?

Creo que como dice Carlos, debes hacer un join: inner join: si quieres los comunes left join: si quieres que prevalezcan los de la tabla de la primera query (right join al contrario) full join: que te cruce todo. Ya nos dices...

gracias por sus comenarios,

lo intente de la siguiente forma y no me arroja error pero el resultado esta en blanco;

select create_time, count(*) from (

select to_char(b.create_time,'YYYY/MM') create_time, count(1) from xnp_port_msg_range a join xnp_port_msg b on b.req_seq=a.REQ_SEQ

full join xnp_port_msg c on b.port_id=c.port_id

where b.msg_type_id='2001' and

c.msg_type_id='1001' and c.SERVICE_TYPE='MOBILE_PRE'

and b.create_time between to_date('20131009','YYYYMMDD') and to_date('20131010','YYYYMMDD')

group by to_char(b.create_time,'YYYY/MM'), a.number_from

having count (a.NUMBER_FROM) > 1)

group by create_time

order by create_time

 

Probe full, left, right, inner join y siempre el resultado fue "no rows selected"

En respuesta a por kobeson

Vamos a probar con un poco de indentación y colocando las condiciones de cada join dentro de cada una en lugar de situarlas todas juntas en el where:

select create_time, count(*) from (
  select to_char(b.create_time,'YYYY/MM') create_time, count(1) 
  from xnp_port_msg_range a 
       join xnp_port_msg b on b.req_seq=a.REQ_SEQ and b.msg_type_id='2001' and
                              b.create_time between to_date('20131009','YYYYMMDD') and to_date('20131010','YYYYMMDD')
       join xnp_port_msg c on b.port_id=c.port_id and c.msg_type_id='1001' and c.SERVICE_TYPE='MOBILE_PRE'     
  group by to_char(b.create_time,'YYYY/MM'), a.number_from
  having count (a.NUMBER_FROM) > 1)
group by create_time
order by create_time

Yo poniéndolo así lo que no veo claro es la condición de la ultima join 'b.port_id=c.port_id', pero tampoco sé bien lo que quieres hacer.

¿No sería mejor enlazar con la tabla común xnp_port_msg_range por el id REQ_SEQ, como en la primera consulta?

Configuracion de DATAGUARD

Configuracion de DATAGUARD Gustavo.chavez 6 Septiembre, 2013 - 21:37

 Hola que tal buen dia!

 

Me gustaria saber como poder configurar un dataguard

 

Saludos

 

 

Pues si te soy sincero nunca lo he utilizado, y parece que de momento nadie más contesta.

Lo único que puedo hacer es enlazarte un documento técnico de Oracle en castellano sobre Data Guard:

Documento técnico de Oracle: Oracle Data Guard 11g versión 2

(lo adjunto a tu tema, por si más adelante cambian el enlace..)

Si encuentras información interesante, no olvides compartirla!

 

Hola que tal

 

Una pregunta... se puede realizar o configurar oracle data guard de 10g en rac a 11g en rac?.

 

me encomendaron esta tarea en el trabajo... alguien me puede ayudar por favor

 

Gracias y saludos!!!!

Conexion a una instancia de dos

Conexion a una instancia de dos tromito 5 Diciembre, 2012 - 20:15

Hola , tengo 02 instancias de oracledb_home1 y db_home2 en mi servidor w2008 server .Cada una tiene su listener y tns

El problema es que ahora No puedo accesar desde sqlplus en el mismo servidor

Cuando habia solo uno colocaba sqlplus /as sysdba

Ahora esto me retorma el erorr 12560

luego lei por ahi que habia que colocarle @ ,pero igual me salen errores , quiza sea algo que tengo que configurar en el tns o listener de alguno de los dos ??

Gracias de antemano

Pero qué error te devuelve cuando utilizas @instancia? El mismo ORA-12560 o es otro?

Echa un vistazo a este otro tema del foro: Uso de dos listeners en Oracle 10g, puede que alguna de las recomendaciones te sirva.

Otra opción que puedes probar es definir el ORACLE_SID en linea de comandos con la instancia a la que vas a conectar, antes de llamar a SQLPlus:

> set ORACLE_SID=db_home1

 

hola!!
como puedo hacer esto en 3 pc`s diferentes??
Equipo 1 (SMBD y BD): Desde el SMBD mostrar la BD, consulta de usuarios existentes, creación de un usuario de solo consulta, mostrar el correspondiente procedimiento almacenado, función o trigger, creado.

Equipo 2 (SMBD): ingresar con el usuario administrador para ese equipo y mostrar que la bd no esta ahí, ingresar con el usuario creado de solo consulta e intentar insertar datos

Equipo 3 (Interfaz): mostrar la parte del código donde hacen la conexión a base de datos, correr la interfaz y hacer pruebas de altas, bajas, cambios y consulta en al menos una tabla de su esquema, en este punto es importante que e su video se muestre a la par en el Equipo 1 el estado de la tabla en cuestión antes y después de cada acción

Pregunta; por lo que entendí no puedo tener más de una instancia en la misma PC y tengo que alternar la ruta del DIS

con esta sentencia  set ORACLE_SID=db_home1 y si quiero cambiar a la otra instancia tengo que escribir de la sig Frmo

set ORACLE_SID=db_home2

Cunatas instacias puedo tener en la Misma PC?

Gracias

Generar updates automáticos

Generar updates automáticos mariomario89 31 Julio, 2013 - 11:25

 

Hola!!

Tengo un problema que no se como resolverlo. Me gustaría generar updates sobre algunas de las filas de una tabla de manera automática una vez al día. He visto que por medio de jobs es posible pero aun así no se como hacerlo. 

El update sería el siguiente:
UPDATE "subscriber" set "status" = 0 where "status" = 2 and "optout_date" < sysdate;


Gracias de antemano.

Hola Mario

 

Tendrías que crear un procedimiento almacenado que ejecute la sentencia, y después crear el job programado que ejecute el procedure cada día a la hora que le indiques.

El job lo puedes crear desde el entorno SQL, o también podrías hacerlo desde el entorno del Enterprise Manager. Te copio un ejemplo de creación de job que llama a un procedure, sacado de la página sobre utilización de Jobs de la documentación de Oracle:

BEGIN
DBMS_SCHEDULER.CREATE_JOB (
   job_name           =>  'update_sales',
   job_type           =>  'STORED_PROCEDURE',
   job_action         =>  'OPS.SALES_PKG.UPDATE_SALES_SUMMARY',
   start_date         =>  '28-APR-08 07.00.00 PM Australia/Sydney',
   repeat_interval    =>  'FREQ=DAILY;INTERVAL=2', /* every other day */
   end_date           =>  '20-NOV-08 07.00.00 PM Australia/Sydney',
   job_class          =>  'batch_update_jobs',
   comments           =>  'My new job');
END;
/

Saludos,

Import full archivos .dmp

Import full archivos .dmp Juan78 8 May, 2012 - 05:50

Saludos

Tengo un backup de 5 archivos .dmp con su respectivo archivo .txt (CONTAB.dmp, CXP.dmp, PPTO.dmp, SABS.dmp, etc) como pueden ver el export que hicieron no es full pero el problema es que debo hacer un import full de estos archivos para poder traer todo los roles hay alguna manera de hacerlo y sino como hago para importarlos.

Gracias.

 

Si el backup lo han hecho sin incluir los esquemas los vas a tener complicado para recuperarlos simplemente porque no están ;)

Para hacer un import full completo necesitas un .dmp que se haya generado con un export full.

Tendrás que crear antes usuarios y roles equivalentes y hacer la importación sobre esos usuarios credos previamente, tal como te comenté en el otro tema que has abierto:

Prueba a crear antes de hacer la restauración todos los usuarios que tengas en la base de datos origen, o al menos los que te aparezcan en la lista de errores. En principio, con que tengan el mismo nombre de usuario en la nueva BD ya no tendrás errores, no hace falta que utilices las mismas contraseñas, por ejemplo.

Un ejemplo de comando para hacer el mapeo entre los users de las dos BBDD, sacado del tema Backups de bases de datos Oracle:

 

> imp system/password@basededatos2 file=/directorio/dosesquemas.dmp FROMUSER=USER1,USER2 TOUSER=USER1,USER2 log=dosesquemas_imp.log ignore=yes

 

Tengo un file .DMP cualquiera y deseo importarlo a mi esquema:

 

sql> $imp cesar/prueba29 file=c:\bdatos.dmp ful=y

manda error - 00002 - fallo al abrir c:\bdatos.dmp para lectura

La base de datos esta instalada local en win 7.

Estoy ejecutando en sqlplus

 

De antemano gracias, Cesar

buena noche tengo un export full pero neecito importarlo en una maquina lo realizo con este impdp SYSTEM/1234 dumpfile=Expwsrr_01_201405030200.dmp logfile=dmp.log full=y directory=D:\ pero no entiendo lo del directorio y que tengo que realizar para que me funcione

En respuesta a por Anonimo (no verificado)

 Para indicar un directorio con impdb no sirve especificarlo directamente, el directorio tiene que estar definido dentro de la base de datos como directorio (de Oracle, para entendernos), y en el comando le has de indicar el nombre de ese directorio de Oracle. Algo así:

Primero en base de datos, comprobar si ya existe alguno que te sirva:

SQL> SELECT directory_name, directory_path FROM dba_directories;

DIRECTORY_NAME ------------- DIRECTORY_PATH -----------------
DMPDIR                       d:\temp

 

Si puedes copiar el backup a d:\temp esto no te debería fallar:

impdp SYSTEM/1234 dumpfile=Expwsrr_01_201405030200.dmp logfile=dmp.log full=y directory=dmpdir

 

Y si no siempre tienes la opción de, con un usuario DBA, añadir el directorio a la base de datos Oracle:

SQL> create directory dmpdir AS 'd:\temp';

 

se puede generar un archivo sql archivo.sql a partir de importar un archivo dmp?? con imp yo realizo esto mismo pero con impdp como se muestra en el siguiente ejemplo y me funciona sin problemas nohup impdp user/pass sqlfile=archivo.sql DIRECTORY=direcorio DUMPFILE=archivo.dmp LOGFILE=directorio:archivo.log PARALLEL=10 & pero no se si se pueda hacer lo mismo con imp.

Importacion de archivos excel

Importacion de archivos excel beno_1892 28 Junio, 2013 - 21:17

 Estimado, soy nuevo en lo que es la informatica estudio analisis de sistema  y necesito saber lo siguiente:

debo importar una planilla excel al sql developer, pero este no me permite hacerlo, necesito sabes si es posible? el profesor ingreso datos erroneos para que a traves de procedimiento y funciones podamos rescatar estos datos, lo otro la panilla excel no se puede modificar... atento a sus comentarios Gracias. 

Para importar datos desde excel tienes que hacerlo sobre una tabla.

Crea primero la tabla con los campos que vas a importar y después, desde el navegador de SQL Developer busca la opción 'Import Data..' pulsando con el botón derecho sobre la tabla.

Se te abrirá un asistente que te permite seleccionar un excel para importar datos sobre la tabla.

 

Optimización de consultas SQL

Optimización de consultas SQL Carlos 10 Marzo, 2010 - 00:00

Abro este tema para comentar cuestiones sobre rendimiento y optimización de consultas SQL en bases de datos Oracle, ejecución y análisis de Explain Plans, etc.

Carlos, excelente haber encontrado este foro... felicidades!!

Estoy auditando las consutlas SQL que se han ejecutado por un periodo determinado, sin embargo, entre la información que me arroja, encuentro: Tipo de objeto, Orden, Filas, Tamaño (KB), Costo, Tiempo(seg), Costo de CPU y Costo de E/S. Los costos a qué se refieren? en qué unidades está expresado el dato? Esto, es por cada select, union, group by, etc. que tenga en mi consulta.

De antemano, gracias !!

En respuesta a por Tody1820 (no verificado)

Tody, el coste de las consultas es una estimación que hace el optimizador de Oracle cuando ejecutas un Explain Plan, y es una medida interna que has de tener en cuenta, pero que al ser una estimación no es muy precisa.
Básicamente te va a servir para estimar si un cambio en la manera de hacer una Query va a conllevar una mejora en su ejecución, no vas a poder compararlo con otras medidas de rendimiento, y ni siquiera es aconsejable compararlo entre dos consultas diferentes que no devuelvan los mismos datos.

En respuesta a por Carlos

Gracias por tu respuesta Carlos !! ... entendiendo entonces que cada consulta tiene su propia medición, hice unas adecuaciones optimizando una misma consulta y las cantidades cambiaron mucho. Sin embargo, me sigue quedando la duda del por qué los valores de un inner join, left join, etc. siempre salen muy altos a pesar de haber optimizado en gran medida los demás elementos de la consulta.  Deberían de aminorar al igual que los otros elementos, no es así? 

En respuesta a por Tody

No necesariamente. Depende de la optimización que hayas hecho. Si no varían quiere decir que la optimización puede mejorar otras cosas, pero no afecta demasiado a las joins.

Si la optimización la habías hecho justo para mejorar las joins, revisa la consulta porque puede que algo no se esté comportando como esperabas.

Si es una optimización orientada a mejorar en otros puntos, si el coste de esos puntos y el general se ha reducido ya irás bien encaminado.

Estoy intentando optimizar esta query y me es imposible se os ocurre algo:
SELECT COLOR.VAL_MINIMO,
MAX(COLOR.VAL_DESCRIPCION)
FROM COLOR, COLOR6
WHERE COLOR.VAL_CODIGO = COLOR6.DV_COD_VALOR AND
COLOR6.DV_COD_MODELO = 80 AND
COLOR6.DV_COD_VERSION = 2 AND
COLOR6.DV_COD_DATO = 118
GROUP BY COLOR.VAL_MINIMO
ORDER BY VAL_MINIMO

Tiene de coste 22 y es una exageracion.

Gracias.

 Hola,

 

Actualmente estoy trabajando con la versión 9 de oracle, y en mode=RULES, ahora queremos migrar a la versión 11g, y por lo que veo no admite trabajar en mode reglas, sinó que hay que trabajar en modo estadísticas. Me gustaría que alguien que se hubiera encontrado en esta situacuón pudiera ayudarme en los problemas a nivel de rendimiento que puedo tener en todas las querys de la aplicación. Es decir no tengo claro si voy a tener que modificar todas las querys al cambiar de reglas a estadísticas. Por otro lado entiendo que trabajar en modo estadísticas empieza a dar buen rendiemiento cuando las querys ya han sido ejecutadas, es decir cuando ya ha podido crear las estadísticas, de manera que el primer ciclo de ejecución de todas las querys no va a ser el más optimo, funciona esto así?. Bueno muchas gracias por todo.

 

Un saludo,

En respuesta a por neik11

No creo que vayas a tener tantos problemas como esperas, de hecho puede que hasta te mejore la velocidad de muchas queries sin tener que tocar nada.

Las sentencias SQL se pueden optimizar teniendo en cuenta el modo que utilice el analizador de consultas, pero no es lo habítual, como mucho puedes tener algunas consultas para las que se haya hecho una optimización especial, que son las que tendrías que revisar.

Lo que sí creo que es importante puntualizar es que las estadísticas que utiliza el analizador no son sobre las consultas, son sobre los objetos de la base de datos, por lo que lo importante no es ejecutar las consultas, sino tener al día las estadísticas sobre las tablas más importantes, más grandes o más utilizadas de tu base de datos.

Si la primera consulta te va más lenta que las siguientes será porque Oracle utiliza cachés que sirven para mejorar los tiempos de respuesta sobretodo en consultas repetitivas, pero es un tema independiente de las estadísticas.

Si tienes la estadística de las tablas que intervienen en la consulta medianamente actualizada, el analizador podrá afinar mucho más al preparar el mejor plan de ejecución y seguramente te mejorarán tanto la primera como las siguientes consultas.

 

Carlos, podrias por favor darme una explicacion detallada respecto a tecnicas de optimizacion o tal vez unos link de referencia (revision sitactica,plan de ejecucion, otros), muchas gracias

Hola Ramón

La mejor referencia que se me ocurre es la misma documentación de Oracle. Para temas de optimización, en el libro Oracle Database Performance Tuning Guide 11g, por ejemplo, seguro que vas a encontrar casi todo lo que necesites, y sabes que la fuente es fiable. Te enlazo el capítulo Optimizing SQL Statements de este libro de la documentación online de Oracle, espero que te sea útil.

 

hola estoy empezando a estudiar sql y quería saber si hay un analizador de consultas sql para oracle, y no cometer fallos en la sintaxis, y si lo hay se le puede poner cualquier tabla?? muchas gracias.

En respuesta a por caperucita

Que yo sepa no hay ninguna limitación específica para los OR que puedes incluir en una sentencia SQL de Oracle, aunque si utilizas demasiados, y dependiendo también de lo que contengan los OR, se puede llegar a producir un error de tipo ORA-03113: end-of-file on communication channel.

También te digo que el error te va a venir más bien porque hayas alcanzado el límite que tu base de datos, o los conectores que intervengan puedan manejar para una sola sentencia SQL, no por llegar a un límite para los OR que contiene la sentencia.

Este límite para sentencias, además, puede depender de la versión de la base de datos, de tu entorno, del cliente que utilices..

Te enlazo una respuesta en askTom, que lo deja bastante claro, y un documento de referencia de Oracle 10g en el que se indican los límites lógicos de la base de datos, y al final apunta esta nota: 

The limit on how long a SQL statement can be depends on many factors,  
including database configuration, disk space, and memory

Y de todas maneras, lo normal es que una sentencia con muchos OR siempre se pueda resolver de otra manera más simple, ¿cuántos OR necesitas incluir en tu sentencia?

 

como puedo optimizar esta consulta, me aparece un index fast full scan en la tabla en_objeto el indice de esta tabla es sgl_categoria y las pks son:cod_convocatoria, tpo_objeto, cod_etapa, sgl_tipologia

 

Saber conexiones en ORACLE no realizan ningun query o tarea y matarlas.

Saber conexiones en ORACLE no realizan ningun query o tarea y matarlas. Pedro Tablas Sanchez 28 Julio, 2010 - 22:45

Buen día a todo:

Mi pregunta como puedo hacer una consulta donde me diga que usuarios(conexiones) a la base de datos de oracle no esten ejecutando nada (query o proceso), en realidad saber que no esten haciendo nada y que tengan ya mucho tiempo en 'INACTIVE' para de este modo eliminarlas.

se me ocurre que con un profile matar todas las que esten en STATUS='SNIPED' de la vista V$SESSION pero que pasa si me guio por el tiempo y estan realizando algun query y los cambia de estado, por eso pienso que si manejo tiempo de conectado (LOGON_TIME) y saber si no hacen nada (PARA ESTO ES EL QUERY qUE MENCIONO) para asi matar las sesiones que en realidad son zombies.

Gracias a todos por sus posibles respuestas.

Y porquè no utilizas el parámetro IDLE_TIME del profile? Con el IDLE_TIME defines el tiempo máximo sin actividad que se permite a las conexiones. Cuando se supera este tiempo, definido en minutos, sin que la conexión haya tenido ninguna actividad, Oracle desconecta al usuario.

 

Por ejemplo, para crear un perfil definiendo un límite de máximo de inactividad de 30 minutos:

 

SQL> create profile prof_inactividad limit idle_time 30;

Y para asignar este perfil a cualquier usuario:

 

SQL> alter user usuario_limitado profile prof_inactividad;

 

De todas maneras pruébalo bien antes de aplicarlo a todos los usuarios, porque las limitaciones de los profiles siempre son delicadas, y pueden producir algún efecto que no se había tenido en cuenta..

En respuesta a por Carlos

  Gracias Carlos por la respuesta, y si eso ya lo tengo en unos usuarios pero en caso de otros necesito saber si no están inactivos pero talvez esten realizando alguna tarea (query) entonces debo de saber que en realidad esten ahi sin hacer nada para así poder eliminar esas sesiones, y el campo IDLE_TIME  hacer que cambie de estatus en v$session a SNIPED.

 

que mas debo hacer para saber que no esten haciendo nada porque no puedo matarlas si enrelizadad estan haciendo u nquery  y tarda 30 min y se quede inavtiva la session.

 

Gracias y Saludos. 

En respuesta a por Pedro Tablas Sanchez

Tienes razón Pedro, con el parámetro IDLE_TIME sólo se controla la inactividad de las sesiones por la parte cliente, pero los procesos que se han lanzado en el servidor pueden seguir ejecutándose con la sesión cliente inactiva.

Podrías probar a utilizar el parámetro EXPIRE_TIME de SQL*NET, que comprueba cada cierto tiempo (los minutos que le especifiques) que las conexiones estén activas a nivel cliente/servidor, la comprobación se hace desde la parte servidora. Ten cuidado, porque parece ser que consume bastantes recursos del servidor.

Te enlazo el Tip Terminating Oracle connections with connect_time, idle_time, expire_time andinbound_connect_timeout de Burleson Consulting, que explica cómo funciona este parámetro y como modificar el fichero sqlnet.ora para ponerlo en funcionamiento.

Buen dia-
como restringir por listener o tnsnames que los usuarios que estan sniped y mato, no queden como killed y ese idle aumente y nunca mueran....??

no puedo hacer un job que los mate por sistema operativo, porque se manejan despachadores y mataria varios usuarios...

alguien tiene alguna idea, agradezco respuestas a mi correo.

quedo atenta
silvia

En respuesta a por Anonimo (no verificado)

Tienes que activar la auditoría de Oracle sobre ese usuario. Te enlazo un tema de Auditoría, seguimiento y seguridad en BD Oracle, en el que encontrarás informacion sobre cómo activar la auditoría sobre usuarios y otros objetos de BBDD Oracle.

Mientras no activas la auditoría, otra manera de ver lo que hace un usuario 'al vuelo' es utilizando esta consulta:

Últimas consultas SQL ejecutadas en Oracle y usuario que las ejecutó

select distinct vs.sql_text, vs.sharable_mem,
vs.persistent_mem, vs.runtime_mem, vs.sorts,
vs.executions, vs.parse_calls, vs.module,
vs.buffer_gets, vs.disk_reads, vs.version_count,
vs.users_opening, vs.loads,
to_char(to_date(vs.first_load_time,
'YYYY-MM-DD/HH24:MI:SS'),'MM/DD HH24:MI:SS') first_load_time,
rawtohex(vs.address) address, vs.hash_value hash_value ,
rows_processed , vs.command_type, vs.parsing_user_id ,
OPTIMIZER_MODE , au.USERNAME parseuser
from v$sqlarea vs , all_users au
where (parsing_user_id != 0) AND
(au.user_id(+)=vs.parsing_user_id)
and (executions >= 1) order by buffer_gets/executions desc

 

Uso de dos listener en Oracle 10g

Uso de dos listener en Oracle 10g rene palacios … 13 Septiembre, 2011 - 18:25

Buenos días compañero, deseo me ayudes en solucionar un problema de Listener de la base de datos Oracle.

El caso es que tengo en un mismo servidor instalado un BD 10g en la partición C del disco duro, este tiene su listener que se creo por defecto.  Tambien tengo instalado en la partición E del disco duro el servidor OAS 10g, como esta instalación crea su propia base de datos ORCL para manejar repositorio Oracle Internet Directory tambien se le crea un Listener, pero para evitar confución yo le cree otro listener con otro nombre, pero no puedo inciarlo me a error, esto hace que no pueda conectarme al OAS. 

 

Mi consulta es como puedo tener los dos listener levantados y que me den el servicio de escucha. 

Si no es un entorno de uso intensivo, te recomiendo que uses un único listener para dar servicio a las dos bases de datos (la BBDD Oracle 10g y la base de datos del OAS). Para ello, sólo tienes que modificar el listener.ora para indicar los dos bases de datos. Si quieres mantener los dos listeners, o usas puertos distintos (p.e. 1521 para una y 1522 para la otra), o usas dos IPs distintas para cada uno de los servicios. Un saludo, Oscar Paredes

 Para mi es mejor usar dos listeners en puertos distintos, hasta el momento me ha dado siempre buenos resultados sobre todo si ambas tienen HOME distintos

 

Salu2,

Jorge Crisóstomo L.

Base de datos lenta cada cierto tiempo

Base de datos lenta cada cierto tiempo luismedina 13 Agosto, 2015 - 06:01

tengo una base de datos oracle 11g.

la base de datos estuvo trabajando normalmente hasta hace 2 dias.

la base de datos se pone lenta cada 1 hora. se pone tan lento los aplicativos al momento de buscar y realizar cualquier transaccion.

la base de datos esta en modo archivelog.

 

slds

Hola Luis

El modo archivelog consume recursos porque la base de datos tiene que ir escribiendo los archivos de log cada cierto tiempo, pero tendrás que investigar un poco para averiguar si el problema de lentitud de la base de datos viene por ahí o es por otra cosa.

Si te lo puedes permitir una prueba sencilla sería desactivar el modo archivelog durante unas horas, y comprobar si en ese tiempo se producen los problemas de lentitud o no.

Hola Carlos

Voy a desactivar el archive log para monitorearlo.

Otra consulta como puedo verificar que consultas, modificaciones y procedimientos almacenados se estan ejecutando on line, esto para saber monitorear ya que posiblemente algun procedimiento almacenado se este ejecutando y poniendo lento la base de datos. si podrias recomendarme alguna herramienta grafica 

 

gracias

 

Duda respecto a quien es el Grantor

Duda respecto a quien es el Grantor ellidr 12 Enero, 2016 - 15:40

Hola compañeros tengo una duda 

Resulta que como ejemplo yo conectado con SYSTEM creo una tabla de prueba llamada AUDITORIA _SOX  y le concedo el permiso de SELECT al esquema HR

 

Ahora me conecto con HR  (como anteriormente le habia dado el rol de DBA puedo otorgar permisos)  le otorgo el permiso permiso de SELECT al usuario BATMAN

 

aqui la duda es porque en GRANTOR no aparece que se lo dio HR si es con el usuario que yo se lo otorgue ??

 

Buen dia ellidr

El detalle esta en como se asignaron los permisos, intenta hacer la prueba de dar el grant con grant select on system.auditoria_sox to HR WITH GRANT OPTION al hacer esto le das a HR la opcion de otorgar privilegios sobre el objeto, si no le pusiste esta sentencia al hacer el revoke sobre HR los permisos los borra en cascada ya que el que otorgo los permisos fue SYSTEM y no HR, el rol DBA te permite manipular los objetos pero al no ser el propietario el que manda es el permisos sobre cada objeto. es algo revuelto pero espero no confundirte.

 

GRANTEE    OWNER      TABLE_NAME            GRANTOR    PRIVILEGE  GRANTABLE HIERARCHY
----------          ----------         ----------                        ----------            ---------- -            -------- ---------
HR               SYSTEM     AUDITORIA_SOX        SYSTEM     SELECT     YES       NO                                             
BATMAN      SYSTEM     AUDITORIA_SOX        HR              SELECT      NO        NO    

Excepción de E/S: Connection reset by peer Error Code: 17002

Excepción de E/S: Connection reset by peer Error Code: 17002 Herberth Guzman 23 Marzo, 2017 - 16:47

Buen dia.

Que bueno es este foro, gracias por compartir sus conocimientos.
Les comento que tengo un problema ya que hay un programa hecho en genexus que emite un reporte, despues de 7 horas de estar ejecutandose muestra este mensaje de error

 

Text       : Excepción de E/S: Connection reset by peer

Error Code : 17002 SQLState   : null

java.sql.SQLException: Excepción de E/S: Connection reset by peer

 

Ya busque que puede ser, pero no logro encontrar el problema.

 

El usuario con el que se ejecuta el programa tiene el perfil pordefault de la base de datos y esta en todas sus opciones ILIMITADO.

 

Si alguien, puede ayudarme, se los agradezco.

 

Gracias.

En respuesta a por Herberth Guzman

Estas cosas siempre son difíciles de encontrar. Primero deberías asegurarte de que realmente no sea un problema de red, o de interrupción de la comunicación. Si no va por ahí, podría tener algo que ver con los drivers de conexión que utilices, si no te cuesta mucho cambiarlo, podrías probar a utilizar otro driver.

Buenos dias, muchas gracias por responder.

 

Les comento que efectivamente, era problema de red.

 

Lograron detectar que era un switch el que ocasionaba el problema, lo cambiaron y listo, todo OK.

 

Que pasen un buen dia.

Fragmentacion de tablas

Fragmentacion de tablas luismedina 3 Septiembre, 2015 - 01:34

Buenas noches

Existen algunas tablas que al tener demasiadas consultas y modificaciones se ponen lentos.

Averiguando me comentaron que debo de tener tablas fragmentadas, asi como regenerar los indices y actualizar las estadisticas.

mi duda es :

- como listar las tablas que estan fragmentadas

- como bajar la fragmentacion de dichas tablas

- el proceso de regenerar los indices y actualizar las estadisticas tienen alguna consecuencia negativa (por ejemplo en sql server este proceso aumenta en gran cantidad el log de sql server)

 

Slds 

Hola Luis

Para eliminar la fragmentación de las tablas de tu base de datos Oracle, si te puedes permitir que no se pueda acceder a ellas mientras dura el proceso, lo más efectivo es hacer un export de las tablas, y después un import. De esta manera, al importarlas, ya se guardan los datos contiguos y se elimina la fragmentación que pueda haber. Si no puedes hacer el export/import, también hay otras maneras. Echa un vistazo a este post para más detalles. Estos consejos de OMARE también te pueden ayudar.

Y si tu base de datos es 10g o superior seguro que el comando shrink table te va a ser de utilidad para compactar los datos de las tablas.

Para consultar el nivel de fragmentación de las tablas, puedes utilizar esta sentencia, obtenida del blog de Bulachi):

  select /*+ rule */ a.owner, a.segment_name, a.segment_type, round(a.bytes/1024/1024,0) MBS,
      round((a.bytes-(b.num_rows*b.avg_row_len) )/1024/1024,0) WASTED,
      'ALTER TABLE '||a.owner||'.'||a.segment_name||' ENABLE ROW MOVEMENT'||';'||'ALTER TABLE '||a.owner||'.'||a.segment_name||' SHRINK SPACE COMPACT'||';'||'ALTER TABLE '||a.owner||'.'||a.segment_name||' SHRINK SPACE;' "SCRIPT"
from dba_segments a, dba_tables b
where a.owner=b.owner and
      a.owner not like 'SYS%' and a.segment_name = b.table_name and a.segment_type='TABLE'
group by a.owner, a.segment_name, a.segment_type, round(a.bytes/1024/1024,0) ,round((a.bytes-(b.num_rows*b.avg_row_len) )/1024/1024,0)
having round(bytes/1024/1024,0) >10
order by round(bytes/1024/1024,0) desc;

La regeneración de los índices y mantener las estadísticas actualizadas en principo siempre va a ser beneficioso para optimizar el rendimiento de una base de datos Oracle y, que yo sepa, no tiene un efecto demasiado grande sobre los logs de Oracle, que igualmente ya deberían estar controlados para que no crezcan indefinidamente. Lo único que has de tener en cuenta es que estos procesos consumen recursos en el momento en que se ejecutan, así que tendrías que buscar ventanas de actuación en las que la base de datos tenga poca actividad o los usuarios no estén conectados.

 

Hola:

 

Me gustaría saber si alguien sabe de un buen curso semi-presencial o mejor online sobre migración de datos, en versión avanzada y/o pl/sql avanzado, necesito un reciclaje un poco dirijido.

Si me podéis recomendar, os lo agradezco.

Montar carpeta compartida en VirtualBox

Montar carpeta compartida en VirtualBox Merly 17 Noviembre, 2012 - 06:25

Hola a todos,
Tengo todas las intenciones de aprender oracle 11g, por lo que me instale el VirtualBox-4-2-4-81684-Winy en el centos 6.3. bueno ahora me falta instalar el oracle por lo q compartí una carpeta de Windows en el cual están mis instaladores,
bueno pensé q eso bastaba por lo q luego ejecute:
sudo mount -t vboxsf Share /home/compartido, pero me sale un error q el tipo de sistema de ficheros 'vboxsf' desconocido. y cuando me voy a instalar el GUest Additions simplemente no carga nada y tampoco se genera lago en el /media.
Agradecería mucho sus ayudas.

Si te dice que no reconoce el sistema de ficheros, y por eso no puedes compartir el directorio, puede que lo más fácil sea copiar los instaladores en la imagen virtual para poder hacer la instalación totalmente 'en local'.

Privilegios

Privilegios AleMarch 18 Octubre, 2012 - 16:33

Buenos dias a todos

Queria pedirles ayuda. Hace poco retorne a mi trabajo despues de haber estado con salida de maternidad y me encuentro con la sorpresa que en la maquina que trabajabamos la ordenaron y clasificaron para tener un mayor control. asignando roles entre otras cosas.. El problema es que me he encontrado con limitantes que a ratos me dejan como animacion japonesa con la nube sobre la cabeza... Porque no tengo privilegios en mi propio esquema para compilar procedimientos almacenados.(siendo mi perfil de desarrolladora). Existe alguna forma de que yo pueda ver que privilegios tengo y asi poder enviar un listado de habilitacion.. Y no estar a empujones programando?

Muchas Gracias

Lo mejor sería que pudieras consultar las vistas DBA_TAB_PRIVS, DBA_SYS_PRIVS y DBA_ROLE_PRIVS del diccionario de datos para ver los provilegios asignados a cualquier usuario o rol, pero como seguro que no tienes privilegios de DBA para consultar estas vistas hay otras específicas para el usuario con el que estás conectado, que son USER_TAB_PRIVS, USER_SYS_PRIVS y USER_ROLE_PRIVS.

 

Para consultar todos los objetos sobre los que tu usuario tiene privilegios, y qué GRANTs tiene:

SELECT * FROM USER_TAB_PRIVS;

Para consultar todos los privilegios de sistema que tiene tu usuario:

SELECT * FROM USER_SYS_PRIVS;

Por último, para consultar los roles que tiene asignados tu usuario:

SELECT * FROM USER_ROLE_PRIVS;

 

Espero que las consultas te sean de ayuda,

 

Ya probe y me resulto lo siguiente ..la verdad me aclara  porque no puedo ver ni acceder a mas objetos..

Hare mi listado jeje para comenzar con el pedido de permisos.... Muchas gracias

 

Ejecute los select que Carlos que facilito y las cabeceras de informacion son las siguientes(con negrita)...ademas les agregue parte de llos privilegios que tengo como usuario.

--select * from USER_TAB_PRIVS

GRANTEE - OWNER   -  TABLE_NAME  - GRANTOR - PRIVILEGE - GRANTABLE - HIERARCHY
ALEM       - VENTAS   - VEN_VENTAS   - VENTAS  - SELECT        - NO                - NO

--select * from USER_SYS_PRIVS

USERNAME - PRIVILEGE                     -       ADMIN_OPTION
ALEM          - CREATE PROCEDURE     - NO
ALEM          - CREATE SEQUENCE      - NO
ALEM          - CREATE TABLE              - NO


--select * from USER_ROLE_PRIVS

USERNAME - GRANTED_ROLE -  ADMIN_OPTION - DEFAULT_ROLE  - OS_GRANTED
ALEM          -  PL_DES              -  NO                     - YES                    - NO

Por lo que veo sí que tienes permisos para crear procedures en tu schema, y te han asignado un rol de desarrollador.

¿No será que el Procedure que intentas crear accede a un objeto sobre el que tu usuario no tenga privilegios, de otro esquema, por ejemplo?

 

En respuesta a por Carlos

Si efectivamente mirandolo ahora tengo varios permisos. Pero inicialmente parti en 0.

Llamando constantemente ald DBA para decirle ... Sabes no puedo crear tablas.. ok no te preocupes yo te voy a dar permisos.. llamando de nuevo sabes no puedo crear procedimientos.. ok no te preocupes yo te voy a dar permisos..Sabes no puedo compilar.. no puedo crear sequencias, y asi me la lleve buena parte ...

Hasta que quise hacer debug y me encontre conque el DBA estaba visitando a clientes y no pudo ayudarme ..ahi tuve que esperar pacientemente a que llegara pasada la tarde y yo desarrollando a ciegas...

Por eso en la mañana siguiente varios me intentaron apoyar.. Y yo recurri a ustedes para poder tener algo mas en la mano y solicitar con mas propiedad mas permisos sobre los objetos o esquemas donde normalmente me muevo..

Y aca consiguieron darme algunos jeje entrando como DBA.. Pero con las queritas que me enseñaste puedo ahora solicitarle exactamente los permisos que me van faltando sobretodo para los nuevos requerimientos que me estan llegando.

 

Muchas gracias Carlos

 Hola....antes que nada, super buena la información que proporcionan....yo tengo un problema un poco parecido al de AleMarch..... Lo que pasa es que me pasarón una conexión de oracle, me dicen que si puedo crear stored procedures pero en cuanot quiero correr uno muy basico.... (select * from X) obtengo un error de privilegios....corrí los comandos que mostró Carlos...el primero (USER_TAB_PRIVS) y obtengo los mismos permisos que Ale en mi tabla, corrí el segundo (USER_SYS_PRIVS) pero con este no obtengo ningún registro y al correr el 3ro (USER_ROLE_PRIVS) también obtengo los mismos permisos que Ale....Carlos...sabes a qué puede deberse esto? No sé si en verdad puedo crear stored procedures o más bien mi stored esta mal :(

 

El stored procedure que estoy corriendo es:

  create procedure p1  as begin select cve_vol from desa01.Producto;   De antemano, muchas gracias :)

 

En respuesta a por Irmool_01

Si no obtienes ningún registro en USER_SYS_PRIVS es que no tienes ningún privilegio de sistema. Para poder crear procedures deberías tener al menos el privilegio CREATE PROCEDURE, por lo que sí que parece que el problema es que te faltan los permisos. Seguramente vas a tener que hablar con tu DBA :)

 

 Muchas gracias Carlos, en efecto, ya me comentaron que no tengo permisos y me cambiaran a una Bd que no sea de producción :P

 

Aún así, muchas gracias por tu ayuda.

 

Saludos,

Bue día, Me gustaría saber de qué maner puedo crear un rol que tenga todos los permisos sobre un esquema (Este esquema tiene 100 tablas) y después asignar ese rol a un nuevo usuario. Muchísimas gracias. Saludos

En respuesta a por Ale9810 (no verificado)

Buenos días,

Primero tienes que crear el rol, vamos a llamarle "mi_rol":

CREATE ROLE mi_rol;

Después asígnale los permisos. Para una tabla "mi_tabla" sería algo así:

GRANT select, insert, update, delete ON mi_tabla TO mi_rol;

o más corto:

GRANT all ON mi_tabla TO mi_rol;

 

Y para crear las sentencias de asignación de permisos para todas las tablas de un esquema "mi_esquema" puedes hacer esto:

SELECT 'GRANT select, insert, update ON '|| t.owner||'.'||t.table_name ||' TO mi_rol;'
FROM all_tables t WHERE owner = 'mi_esquema';

 Finalmente, para asignar el rol a un usuario:

GRANT mi_rol TO usuario;

 

hola a todos! alguien me podria decir como saber que privilegio tengo sobre una BD, ya que no puedo agregar un campo nuevo a una tabla existente.. gracias

Buenas,

creo un rol con permisos sobre varios objetos de un esquema y cuando se lo asigno a un usuario este no puede acceder a los mismos.

En cambio si se los asigno directamente al usuario funciona correctamente, alguien sabe porque puede pasar esto.

GRacias de antemano

Problema de conexión

Problema de conexión Negro Morice 24 Abril, 2015 - 19:11

 

Tengo dos maquinas virtuales ...

1. Un Linux 7 con una base de datos Oracle 12c con la siguiente configuracion ...

LISTENER =

(DESCRIPTION_LIST =

(DESCRIPTION =

(ADDRESS = (PROTOCOL = TCP)(HOST = OracleDB)(PORT = 1521))

(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521)) ) )

================================================================

SQLNET

================================================================

NAMES.DIRECTORY_PATH= (TNSNAMES, EZCONNECT)

================================================================

TNSNAMES

================================================================

ORCL =

(DESCRIPTION =

(ADDRESS = (PROTOCOL = TCP)(HOST = OracleDB)(PORT = 1521))

(CONNECT_DATA =

(SERVER = DEDICATED)

(SERVICE_NAME = orcl)))

================================================================

2. Por otro lado tengo otra VM en este caso con Windows 8.1 en el cual tengo instalado

un cliente 11gR2 con la siguiente configuración ...

LISTENER =

(DESCRIPTION_LIST =

(DESCRIPTION =

(ADDRESS = (PROTOCOL = TCP)(HOST = OracleDB)(PORT = 1521)))

(DESCRIPTION = (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))))

SID_LIST_LSN_LISTENER =

(SID_LIST =

(SID_DESC =

(ORACLE_HOME = C:\App\Oracle11gCliente\product\11.2.0\client_1)

(SID_NAME = ORCL)))

================================================================

TNSNAMES

================================================================

ORCL =

(DESCRIPTION =

(ADDRESS_LIST =

(ADDRESS = (PROTOCOL = TCP)(HOST = OracleDB)(PORT = 1521)))

(CONNECT_DATA =

(SERVER = SHARED)

(SERVICE_NAME = ORCL)

(INSTANCE_NAME = ORCL)))

================================================================

Ahora bien, teniendo la base de datos online y el LISTENER activo, cuando quiero conectar desde Windows, el resultado es el siguiente ...

C:\>lsnrctl start

LSNRCTL for 64-bit Windows: Version 11.2.0.1.0 - Production on 24-ABR-2015 13:18:31

Copyright (c) 1991, 2010, Oracle. All rights reserved.

Iniciando tnslsnr: espere...

TNS-12560: TNS:error del adaptador de protocolo

TNS-00530: Error del adaptador de protocolo

C:\>tnsping ORCL

TNS Ping Utility for 64-bit Windows: Version 11.2.0.1.0 - Production on 24-ABR-2015 13:19:27

Copyright (c) 1997, 2010, Oracle. All rights reserved.

Archivos de parametros utilizados:

C:\App\Oracle11gCliente\product\11.2.0\client_1\NETWORK\ADMIN\sqlnet.ora

Adaptador TNSNAMES utilizado para resolver el alias

Intentando contactar con (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = OracleDB)(PORT = 1521))) (CONNECT_DATA = (SERVER = SHARED) (SERVICE_NAME = ORCL) (INSTANCE_NAME = ORCL)))

TNS-12541: TNS:no hay ningun listener

Otros detalles ...

- Tengo declaradas las variables TNS_ADMIN, ORACLE_SID y ORACLE_HOME.

- El servicio LISTENER OracleOraClient11g_home1TNSListener; no inica por el error 3 diciendo que

El sistema no puede encontrar la ruta especificada

NO SE EN DONDE MAS MIRAR !!!!

 

Si te he entendido bien, estás intentando levantar el listener en la máquina cliente, y creo que ahí está el problema. El listener se levanta en la máquina servidora, la que tiene Linux. La máquina cliente, al no tener base de datos propia no necesita el servicio del listener. Desde la máquina de windows simplemente tienes que instalar el cliente de Oracle y conectar con SQLPlus u otra herramienta para lanzar consultas sobre la base de datos del servidor.

Servidores bases de datos oracle

Servidores bases de datos oracle hugofernando1287 12 Junio, 2014 - 00:28

Buenas tardes, necesito saber como poner dos servidores a trabajar a la vez en oracle sin tener necesidad de desconectar uno y hacer la conexion al otro gracias

¿Te refieres a una configuración de Oracle RAC (Real Application Clusters)? Son varios servidores Oracle activos sincronizándose para proporcionar alta disponibilidad. No es fácil de configurar y mantener, y has de tener en cuenta el coste de las licencias, ya que al ser instancias activas todas han de estar licenciadas, pero bien implementado puede dar muy buenos resultados.

En este otro tema del foro tienes algunos enlaces útiles con información sobre la configuración de Oracle RAC.

 

Update/insert problema

Update/insert problema oscarw 31 Julio, 2010 - 18:27

Hola

 

cordial saludo,

 

bueno nuevamente con dudas y algunos problemas en el mapeo de datos.

 

A ver tengo el siguente problema, he creado un mapa para el cual la tabla destino tiene un campo PK (secuencia)y tres campos me representan un constraint unique, para la asignacion del pk no se hace uso del NEXTVAL para obtener el ultimo valor de la secuencia. Para esto sean definido los valores de secuencia 

en una tabla tabla_secuencia. el problema se me esta presentando cuando corrro el mapa pues me aparece el error ora-00001 violation unique constraint para ambos casos pk y el unique de los tres campos.  Para verificar este error he realizado una revision en los valores almacenados en la tabla_secuencia buscando si ya existen valores asignados en la tabla destino, pero en esta situación este no es el problema los valores de secuencia existentes en la tabla_secuencia no presentan conflicto. para la asignacion de los valores de secuencia se ha definido una funcion que me retorna el valor de secuencia correspondiente una vez este es asignado en la tabla destino mediante un trigger se elemina el valor de la tabla_secuencia.

se esta usando la opcion parallel para el proceso de carga y en la opcion match by contraint se indica que tenga en cuenta la pk y el unique. 

 

 

 

 

bueno continuando un poco con mis prueba he relizado lo siguiente: 

 

modifique la tabla y cambie  la opcion update/insert a solo insert, esto con el fin de verificar si el problema persiste en este modo, para esto he creado una copia de la tabla destino original.  ahora el error es distinto ya me aparece es un error de timeout ora-02049.

Despues de algunos ajustes .. algunos target estaban en modo append parallel. los elimine y nuevamente corri el mapa

en este caso no se presento problema alguno, sin embargo el tiempo que tomo la insercion de datos fue de 3.5 horas (800 mil registros) lo cual me parece demasiado ... aunque hay que considerar que este proceso se corre en una maquina virtual. 

 

ahora seguire conmis pruebas para ver si esta  vez me funciona el insert/update

En respuesta a por oscarw

Oscar, hace tiempo que no toco OWB, y te contesto de memoria, pero creo que yo también he sufrido el problema que comentas.

Por lo que dices, cada vez que se recorre un registro OWB le está asignando el mismo SK. La ejecución por defecto de los mappings hace eso.

Tienes que cambiar el modo de ejecución del mapping con una opción que ahora no recuerdo para que obtenga una nueva SK para cada registro. Está un poco escondido, pero si buscas seguro que acabas encontrando cómo cambiar ese modo de ejecución.

 

Espero haberte sido de ayuda,

V$DATABASE

V$DATABASE jcpelaez 27 Septiembre, 2016 - 08:23

Hola. Tengo una consulta:

Hago una select sobre la vista V$DATABASE y obtengo lo siguiente:

 

SELECT CREATED,RESETLOGS_TIME,PRIOR_RESETLOGS_TIME,CONTROLFILE_CREATED FROM V$DATABASE;

CREATED                  RESETLOGS_TIME        PRIOR_RESETLOGS_TIME  CONTROLFILE_CREATED  

-----------------------------    ------------------------------        ------------------------------------------  -------------------------------------------

03/12/2015 08:57:09   26/06/2013 08:50:58         30/03/2010 10:07:44               03/12/2015 08:57:09   

 

SELECT INCARNATION#,RESETLOGS_TIME,PRIOR_RESETLOGS_TIME,PRIOR_INCARNATION#

FROM V$DATABASE_INCARNATION;

INCARNATION#    RESETLOGS_TIME        PRIOR_RESETLOGS_TIME  PRIOR_INCARNATION#
------------------------    ------------------------------        ------------------------------------------ ------------------------------------
                       1   26/06/2013 08:50:58         30/03/2010 10:07:44                                                0

 

¿Cómo puede ser posible que si la base de datos fue creada en el año 2015, aparezca el tiempo de RESETLOGS en 2013 y el PRIOR_RESETLOGS_TIME en 2010?

 

Es curioso, aunque no creo que sea un problema si como parece nunca se ha abierto la base de datos con la opción RESETLOGS. Yo diría que son valores por defecto, y tienen fecha anterior para no perder la consistencia de fechas de los PRIOR.

He probado en una base de datos antigua que tengo para pruebas, que no tiene activados backups ni archive log y esto es lo que me da a mi:

SQL> SELECT CREATED,RESETLOGS_TIME,PRIOR_RESETLOGS_TIME,CONTROLFILE_CREATED FROM
 V$DATABASE;

CREATED     RESETLOG    PRIOR_RE   CONTROLF
--------    --------    --------   --------
22/07/09    22/07/09    01/05/07   22/07/09

La fecha de RESETLOGS_TIME me coincide con la de creación, pero el PRIOR_RESETLOGS_TIME lo tengo como tú, años antes que el CREATED.

Vale, pero en el caso que muestro, no coinciden 3 campos:

 

CREATED                  RESETLOGS_TIME        PRIOR_RESETLOGS_TIME

03/12/2015 08:57:09   26/06/2013 08:50:58        30/03/2010 10:07:44

 

Llegué a pensar que se habría podido hacer algo de tablespaces transportables y que trajesen algún dato de su origen, pero la base de datos es STANDARD EDITION y en ella no funcionan los tablespaces transportables.

 

De verdad que no encuento explicación lógica. Aparte de que solo tiene una encarnación. No se ha hecho RESETLOGS previo.

 

Bueno, si no tiene explicación y la bd funciona bien, no le daré más vueltas al asunto.

 

Vistas Materializadas Funciones Dblinks

Vistas Materializadas Funciones Dblinks moyanoa 20 Febrero, 2015 - 20:20

Hola, acabo de entrar a una empresa que esta trabajando en ORacle 10 y usan VISTAS simples, las bases son grandes y traen muchos datos y obviamente demora mucho tiempo en traerlos, por eso decidi ir por VISTAS MATERIALIZADAS, el tema es el siguiente las vistas actuales trabajan con dblinks y COUNT y SUM en las consulta, y por otro lado los datos no cambian mucho por lo que hacer un COMPLETE una vez al dia estaria ok.

 

Aca viene la pregunta, estuve leyendo que si se usa las funciones de SUM se tiene que tener ciertos aspectos en cuenta como por ejemplo de usar COUNT sobre ese campo, o crear una vista materializada para ese SUM???

 

Seria correcto realizar esta vista o ven una forma mejor?

 

CREATE MATERIALIZED VIEW nombre_view
BUILD IMMEDIATE
REFRESH NEXT SYSDATE + 1 COMPLETE
ENABLE QUERY REWRITE AS

 

Desde ya muchas gracias.

Saludos

 

 

Agustin.-

 

Habría que ver la query de la vista, pero yo creo que no vas a tener problema al crear la visita materializada con estas opciones, sobretodo porque utilizas un refresco en modo COMPLETE, que no tiene tantas restricciones o requisitos como el modo FAST o incremental.
De todas maneras lo mejor es que primero hagas una prueba, si la consulta te tiene que dar algún problema con la vista materializada lo verás ya en el primer refresco que hagas.

¿Existe forma de controlar modificaciones en tablas de Oracle?

¿Existe forma de controlar modificaciones en tablas de Oracle? Esteban 17 Noviembre, 2016 - 18:57

Hola a todos:

 

Mando antes que todo un cordial saludo y reiterando el buen contenido de este sitio, me gusta mucho la ayuda que ofrece y pasando a otras cosas quiero exponer un caso y una duda que tengo:

 

Existe la forma o manera en que se pueda saber la ultima fecha en que una TABLA en oracle fue modificada, insertada o eliminada (DML's) en cuanto a datos, no me refiero a que si haya sufrido alguna modificación en su estructura(DDL's).

 

El tema que me surgio fue a raiz de que por citar un ejemplo: no se cuando fue la ultima vez en que en la tabla de "Empleados u otras" habia recibido una ultima inserción o modificación o eliminación de un registro, aclaro se que existe forma de poder controlar esto por medio de triggers para estas situaciones y en medida de lo posible por mejores practicas agregar un campo de fecha para este tipo de identificaciones ya sea como apoyo, o como parte del negocio que se maneje en cuestión, pero hay ocasiones en que heredamos sistemas y las BD no cuentan con un soporte lo mas integral posible.

 

Pase por este link: http://www.dataprix.com/blogs/il-masacratore/lista-tablas-mas-movimientoinsertupdate-oracle

pero quiza no me fue de gran utilidad, alguna otra idea?.

 

El SGBD es Oracle 12c Standard Edition.

 

Saludos y muchas gracias de antemano.

 

Hola Esteban

Posiblemente la mejor manera para controlar si se hacen modificaciones, inserciones o eliminaciones en las tablas de Oracle sea utilizar el sistema de auditoría que proporciona la base de datos. Con la auditoría de base de datos puedes controlar tanto las sentencias que ejecuta un usuario como las que se ejecutan sobre objetos de la base de datos, en tu caso sobre tablas.

Echa un vistazo al tema auditoría de la base de datos, seguimiento y seguridad, la presentación explica bastante bien cómo activarla y cómo utilizarla, es para la versión 10, pero seguro que puedes aprovecharlo para la 12.

Espero que te sea de ayuda,

Orientación con base de datos

Orientación con base de datos marcfm 22 Diciembre, 2014 - 16:21

 Hola.

Necesito un poco de ayuda y orientación. 

He de reconocer que mis conocimientos son muy escasos pero necesito ayuda.

El problema empezó cuando desde los equipos que acceden a una aplicación dejaron de tener acceso, indicando que no tenian acceso a la base de datos.

El BDA encargado de la aplicación no da señales de vida y yo me dedico al tema tecnico de los equipo.

Revisando el servidor dedicado tuve que quitar contraseña de usuario administrador de windows 2008 ya se desconocia en el centro de trabajo. Tras poder acceder y buscando informacion con manuales y demas, accedí al Database Control.

Me apareció una pantalla en la que indicaba:

Instancia de Base de datos:

Host: SERVIDOR

Puerto: 1521:

SID: NombreBaseDatos

Directorio Raiz: D:\app\Administrador\product\11.1.0\db_01

 

Esto aparece con una flecha roja ( caida )

 

Listener:

Estado:Activo

Host: SERVIDOR

Puerto: 1521

Nombre LISTENER

Directorio raiz:D:\app\Administrador\product\11.1.0\db_01

Ubicacion:D:\app\Administrador\product\11.1.0\db_01\Network\admin

Detalles

 

Esto aparece con una flecha verde (arriba)

 

En la parte derecha:

Conexion de agente a instancia

Estado No Disponible

 

Aquí cuando entre por primera vez, aparecia un error ORA: 28001 the password has expired.

Tras buscar en foros, segui las indicaciones que aparecian y cambie contraseñas de los usuarios, sys, system, sysdba y todos los que se indicaba.

Ahora el error no aparece, pero la flecha roja no cambia.

¿Como puedo solucionar esto y ver que todo esta funcionando correctamente?

 

Muchas gracias.

 

Puede que simplemente la base de datos no esté levantada, echa un vistazo a esta respuesta.

Si ya tienes las contraseñas de los usuarios administradores, puede que tan sólo entrando en SQLPlus con System, por ejemplo, o con '/ as sysdba' y ejecutando 'alter database open' o 'startup' la base de datos se levante. Y si no lo hace, te devolverá un error que te dirá si tienes algún otro problema.

 

Poder acceder a una BD de un compañero en la misma red

Poder acceder a una BD de un compañero en la misma red ellidr 23 Febrero, 2016 - 22:35

Hola compañeros tengo una duda , yo y un compañero instalamos la base de datos oracle 11gr2 cada quien tiene instalada su base de pruebas , la duda es si es posible que yo me conecte a la base de pruebas que el creo , ya intentamos colocando la ip ,el puerto ,el SID y tratando de loguearnos con SYSTEM  y no es posible hay alguna forma estamos en la misma red

 

seria posible?? podrian ayudarme gracias por su ayuda

Tendrías que especificar el error que te devuelve la base de datos al intentar conectar, pero si la comunicación entre las dos máquinas está abierta, incluyendo el puerto 1521 o el que hayáis configurado, podría ser que la base de datos servidora no tenga levantado el listener y no esté escuchando para aceptar conexiones remotas.

Echa un vistazo a este post sobre el listener de Oracle, donde se explica cómo comprobar el estado del listener, y levantarlo si es necesario.

Saludos,

Problemas con el Export y Expdp en Oracle 10g

Problemas con el Export y Expdp en Oracle 10g Gustavo.chavez 22 Agosto, 2014 - 16:07

 Hola buen dia;

Actualmente cuento con una Base de datos Oracle 10g en un SRV Windows Server 2003 x64 bits, pero al tratar de realizar el Export y/o el Expdp me indica errores(Anexo imagenes y logs), 

Le agradeceria mucho su informacion y conocimiento ya que lo he estado intentanto realizar por varias ocasiones sin exito.

Cabe señalar que cuento con storage suficiente para poder realizarlo.

 

Saludos

 

Hola Gustavo, por lo que veo en los logs de salida pueden ser por dos cosas, una algún block dañado de las tablas que no te dejan hacer el export, la otra algún daño físico que tengas a nivel storage por que veo que intentas hacer el export pero te truena en varias tablas,

Valida haciendo el mismo ejercicio en un ambiente alterno con un dmp que tengas.

En respuesta a por OMARE

Hola, quería hacer una consulta.
Necesito exportar un esquema desde una base de datos en AIX e importarlo en un Oracle en Linux. Se que se pueden exportar tablespaces con la opción Transportable Tablespaces por la diferencia en los endian. Pero, ¿Es posible solo exportar un esquema? ¿Cómo podría hacerlo? ¿Algún ejemplo?

Gracias!

Que falla en mi bloque pl/sql para crear un usuario en la Base de Dato??

Que falla en mi bloque pl/sql para crear un usuario en la Base de Dato?? ellidr 1 Abril, 2015 - 16:39

Hola compañeros de este grandioso foro de bases de datos en esta ocasión tengo un problema con un bloque que estoy creando esta es la sintaxis que uso:

 

La idea es que haga un select ala dba_users y consulte el usuario si existe mande el error de que ya existe de lo contrario lo crea, al correrlo pide el login y el password el detalle es que me manda error anexo el error lo estoy haciendo conectado con el usuario system 

SET serveroutput ON DECLARE v_usuario varchar2(8):='&LOGIN'; v_cusuario dba_users.username%TYPE; v_v_password varchar2(30):='&PASSWORD'; BEGIN SELECT USERNAME INTO v_cusuario FROM dba_users WHERE username=v_usuario; dbms_output.put_line('FALLO!! el usuario "'||v_usuario||'" ya existe en la Base de Datos'); EXCEPTION WHEN NO_DATA_FOUND THEN CREATE USER v_usuario; IDENTIFIED BY v_password PASSWORD EXPIRE; DEFAULT TABLESPACE USERS; TEMPORARY TABLESPACE TEMP; PROFILE DEFAULT; ACCOUNT UNLOCK; dbms_output.put_line('EXITO!! fue creado el usuario en la Base de Datos '||v_usuario);) END; /

 

Aclaro que soy novato en esto para mi esta bien la sintaxis 

 

Creo que te falla porque estás poniendo punto y coma al final de cada linea, y sólo has de ponerlo al final de cada sentencia:

..
WHEN NO_DATA_FOUND THEN
CREATE USER v_usuario
IDENTIFIED BY v_password PASSWORD EXPIRE
DEFAULT TABLESPACE USERS
TEMPORARY TABLESPACE TEMP
PROFILE DEFAULT
ACCOUNT UNLOCK;

 

Saludos!

Muchas gracias por la ayuda Carlos ,la solución la muestro en el siguiente query por si alguien le sirve ya me crea el usurio a nivel Base de Datos.

SET serveroutput ON DECLARE v_usuario varchar2(8):='&LOGIN'; 
v_password varchar2(8):='&PASSWORD; 
v_cusuario dba_users.username%TYPE; 
BEGIN SELECT USERNAME INTO v_cusuario FROM dba_users WHERE username=v_usuario; 
dbms_output.put_line('El usuario "'||v_usuario||'" ya existe en la Base de Datos'); 
EXCEPTION WHEN NO_DATA_FOUND THEN EXECUTE IMMEDIATE 'CREATE USER '|| v_usuario||' IDENTIFIED BY '||v_password||' PASSWORD EXPIRE DEFAULT TABLESPACE USERS TEMPORARY TABLESPACE TEMP PROFILE DEFAULT ACCOUNT UNLOCK'; 
dbms_output.put_line('fue creado el usuario "'||v_usuario||'" en la BD. '); END; /

Rman, Backup, ORA-19504: fallo al crear el archivo

Rman, Backup, ORA-19504: fallo al crear el archivo Sergio Sánchez 3 May, 2016 - 14:36

Saludos a todos.

Pretendo hacer un backup de mi base de datos oracle con rman en Server 2008.

Algo así:

backup as compressed backupset database  format '\\xx\carpeta\backup_%s_%d_%T.bck'

 

 - El servidor de oracle se encuentra en un dominio pero utilizo un usuario local para logarme.

 - La carpeta de destino es una unidad de red que ahora mismo tiene permisos de ' control total ' para todos los usuarios.

 - El script me devuelve el Error: ORA-19504: Fallo al crear el archivo

                                               ORA-27040: error de creación de archivo, no se ha podido crear

                                               OSD-04002: no se ha podido abrir el archivo

                                               O/S-Error: (OS 3) El Sistema no puede encontrar la ruta especificada

 

¿Alguién me podría decir cómo consigo que el script escriba en la unidad de red?.

 

Muchas gracias y un saludo.

Por si a alguien le interesa pongo aquí cómo lo he solucionado.

 

En la máquina donde tengo Oracle tengo que arrancar un par de servicios de oracle con un usuario administrador de dominio. Los servicios son:

 

- oracle..listener.

- oracleservice...

 

Un saludo.

 

Error subquery en vista materializada

Error subquery en vista materializada mariomario89 27 Noviembre, 2013 - 11:15

Hola a todos! 


Estoy intentando crear una vista materializada pero me están apareciendo errores por intentar crearla con subqueries. He visto en la doc de oracle que las subqueries no son posibles si están dentro de la sentencia SELECT pero que si están en el FROM o el WHERE si que es posible usarlas. Aqui os dejo la vistapara que le deis un vistazo y ver si podeis ayudarme. Os lo agradecería mucho.

CREATE MATERIALIZED VIEW LOG ON "subscriber" WITH SEQUENCE, ROWID
("id", "status", "id_service") 
INCLUDING NEW VALUES;

CREATE MATERIALIZED VIEW LOG ON "subscriber_events" WITHSEQUENCE, ROWID
("created_at", "id_event", "billed", "percent_billed", "id_service")
INCLUDING NEW VALUES;

CREATE MATERIALIZED VIEW LOG ON "subscriber_status" WITHSEQUENCE, ROWID
("id_status")
INCLUDING NEW VALUES;

CREATE MATERIALIZED VIEW LOG ON "service" WITH SEQUENCE, ROWID
("id", "price", "revenue")
INCLUDING NEW VALUES;


CREATE MATERIALIZED VIEW "bill_arpu_month_by_service"
TABLESPACE plat_dat
BUILD IMMEDIATE
REFRESH FORCE 
START WITH sysdate NEXT +1 MONTH 
ENABLE QUERY REWRITE
AS

SELECT * FROM 
(SELECT created, service, billed, global_user_actives, optin, optout, new_users, dif, 
global_user_actives - SUM(new_users) OVER (PARTITION BY service ORDER BY created DESC) as actives_S_M, 
global_user_actives - SUM(new_users) OVER (PARTITION BY service ORDER BY created DESC) + new_users as actives_E_M, 
round((CASE WHEN (global_user_actives - SUM(new_users) OVER (PARTITION BY service ORDER BY created DESC) + new_users) =0 THEN 0 
ELSE (billed/(global_user_actives - SUM(new_users) OVER (PARTITION BYservice ORDER BY created DESC) + new_users)) * service_mult END),2) arpu

FROM 
( select to_char("created_at", 'yyyymm') "CREATED", AVG("service"."id")service,
SUM( CASE WHEN "id_event" IN ('1', '5', '3') and "billed" = '1' THEN 1 WHEN "id_event" IN ('6', '4') and "billed" = '1' THEN "percent_billed"/100 ELSE 0 END) AS BILLED, 
(select count("id") from "subscriber" join "subscriber_status" on "subscriber"."status" = "subscriber_status"."id_status" where "subscriber"."status" = 1 and "subscriber"."id_service" = "service"."id") as global_user_actives, 
SUM( CASE WHEN "id_event" IN ('1') THEN 1 ELSE 0 END) AS optin, SUM( CASE WHEN "id_event" IN ('2') THEN 1 ELSE 0 END) AS optout, (SUM( CASE WHEN "id_event" IN ('1','3') THEN 1 ELSE 0 END) - SUM( CASE WHEN "id_event" IN ('2') THEN 1 ELSE 0 END)) as new_users, 
((select count("id") from "subscriber" join "subscriber_status" on "subscriber"."status" = "subscriber_status"."id_status" where "subscriber"."status" = 1 and "subscriber"."id_service" = "service"."id") - (SUM( CASE WHEN "id_event" IN ('1','3') THEN 1 ELSE 0 END) - SUM( CASE WHEN "id_event" IN ('2') THEN 1 ELSE 0 END))) as dif, 

(COALESCE( AVG("service"."price")*AVG("service"."revenue")/100 , 0)) as service_mult

from "subscriber_events" 
JOIN "service" ON "subscriber_events"."id_service" = "service"."id" 
where "id_event" IN ('1', '2', '3', '4', '5', '6') 
group by "service"."id", to_char("created_at", 'yyyymm') order by "service"."id", "CREATED" DESC ) 
ORDER BY "SERVICE", "CREATED" DESC);

 

 

 

22818. 00000 -  "subquery expressions not allowed here"

*Cause:    An attempt was made to use a subquery expression where these

are not supported.


 

 

Mario, sólo le he echado un vistazo rápido, pero el SELECT * FROM inicial es necesario? Podrías probar a definir la vista directamente como: .. AS SELECT created, service, billed, global_user_actives, optin, optout, new_users, dif, global_user_actives - SUM(new_users) OVER (PARTITION BY service ORDER BY created DESC) as actives_S_M, global_user_actives - SUM(new_users) OVER (PARTITION BY service ORDER BY created DESC) + new_users as actives_E_M... ..

En respuesta a por Carlos

Hola Carlos!

He probado tambien como tu has dicho (la verdad que no me acuerdo porque puse ese SELECT * FROM  XD) ... y tampoco me ha funcionado. 

Al final lo que he hecho ha sido crear una vista y apartir de ahi crear la vista materializada y por lo visto me ha funcionado. Lo unico que estoy buscando por internet opciones o ejemplos de vistas materializadas basadas en vistas pero no encuentro nada.

Esto ha sido lo que he hecho.

CREATE OR REPLACE VIEW "bill_arpu_month_view" as

select to_char("created_at", 'yyyymm') "CREATED", AVG("service"."id") service,

SUM( CASE WHEN "id_event" IN ('1', '5', '3') and "billed" = '1' THEN 1 WHEN "id_event" IN ('6', '4') and "billed" = '1' THEN "percent_billed"/100 ELSE 0 END) AS BILLED, 

(select count("id") from "subscriber" join "subscriber_status" on "subscriber"."status" = "subscriber_status"."id_status" where "subscriber"."status" = 1 and "subscriber"."id_service" = "service"."id") as global_user_actives, 

SUM( CASE WHEN "id_event" IN ('1') THEN 1 ELSE 0 END) AS optin, SUM( CASE WHEN "id_event" IN ('2') THEN 1 ELSE 0 END) AS optout, (SUM( CASE WHEN "id_event" IN ('1','3') THEN 1 ELSE 0 END) - SUM( CASE WHEN "id_event" IN ('2') THEN 1 ELSE 0 END)) as new_users, 

((select count("id") from "subscriber" join "subscriber_status" on "subscriber"."status" = "subscriber_status"."id_status" where "subscriber"."status" = 1 and "subscriber"."id_service" = "service"."id") - (SUM( CASE WHEN "id_event" IN ('1','3') THEN 1 ELSE 0 END) - SUM( CASE WHEN "id_event" IN ('2') THEN 1 ELSE 0 END))) as dif, 

 

(COALESCE( AVG("service"."price")*AVG("service"."revenue")/100 , 0)) as service_mult

 

from "subscriber_events" 

JOIN "service" ON "subscriber_events"."id_service" = "service"."id" 

where "id_event" IN ('1', '2', '3', '4', '5', '6') 

group by "service"."id", to_char("created_at", 'yyyymm') order by "service"."id", "CREATED" DESC ;

 

 

CREATE MATERIALIZED VIEW "bill_arpu_month_by_service"

TABLESPACE plat_dat

BUILD IMMEDIATE

REFRESH FORCE 

ENABLE QUERY REWRITE

AS

SELECT created, service, billed, global_user_actives, optin, optout, new_users, dif, 

global_user_actives - SUM(new_users) OVER (PARTITION BY service ORDER BY created DESC) as actives_S_M, 

global_user_actives - SUM(new_users) OVER (PARTITION BY service ORDER BY created DESC) + new_users as actives_E_M, 

round((CASE WHEN (global_user_actives - SUM(new_users) OVER (PARTITION BY service ORDER BY created DESC) + new_users) =0 THEN 0 

      ELSE (billed/(global_user_actives - SUM(new_users) OVER (PARTITION BY service ORDER BY created DESC) + new_users)) * service_mult END),2) arpu

FROM 

"bill_arpu_month_view"

ORA-01775: Bucle

ORA-01775: Bucle Juan78 14 May, 2012 - 17:58

Saludos

Al ir a utilizar las interfaces que se usan para la base de datos y entrar con los usuarios diferentes a system aparece el siguiente error

ORA-01775: Ejecutando bucle de cadena de sinonimos

y despues sale el error

FRM-41810=Error al crear menu

Como puedo resolver este inconveniente?

Le agradezco toda la colaboracion

El error ORA-01775 seguramente lo tienes porque en una serie de sentencias de creación de sinónimos, un sinónimo acaba referenciándose a si mismo en lugar de al objeto original. Consulta la vista dba_synonims para revisar las referencias entre sinónimos.

Otra opción es que un sinónimo referencie a un objeto o una vista que no exista, eso también te podría devolver el error ORA01775.

 

En respuesta a por Carlos

Saludos

Ingeniero 

Este es mi DBA_SYNONIMS

Le agradeceria que me lo revisara para saber cual es la falla

 

SYS                 DEF$_AQCALL                  SYSTEM  DEF$_AQCALL SYS                 DEF$_CALLDEST                SYSTEM  DEF$_CALLDEST SYS                 DEF$_SCHEDULE                SYSTEM  DEF$_SCHEDULE SYS                 DEF$_ERROR                   SYSTEM  DEF$_ERROR SYS                 DEF$_DEFAULTDEST             SYSTEM  DEF$_DEFAULTDEST SYS                 DEF$_LOB                     SYSTEM  DEF$_LOB SYS                 XMLDOM                       XDB     DBMS_XMLDOM SYS                 XMLPARSER                    XDB     DBMS_XMLPARSER SYS                 XSLPROCESSOR                 XDB     DBMS_XSLPROCESSOR SI_INFORMTN_SCHEMA  SI_IMAGE_FORMATS             ORDSYS  SI_IMAGE_FORMATS SI_INFORMTN_SCHEMA  SI_FORMAT_CONVRSNS           ORDSYS  SI_IMAGE_FORMAT_CONVERSIONS SI_INFORMTN_SCHEMA  SI_IMAGE_FORMAT_CONVERSIONS  ORDSYS  SI_IMAGE_FORMAT_CONVERSIONS SI_INFORMTN_SCHEMA  SI_IMAGE_FRMT_FTRS           ORDSYS  SI_IMAGE_FORMAT_FEATURES SI_INFORMTN_SCHEMA  SI_IMAGE_FORMAT_FEATURES     ORDSYS  SI_IMAGE_FORMAT_FEATURES SI_INFORMTN_SCHEMA  SI_THUMBNAIL_FRMTS           ORDSYS  SI_THUMBNAIL_FORMATS SI_INFORMTN_SCHEMA  SI_THUMBNAIL_FORMATS         ORDSYS  SI_THUMBNAIL_FORMATS SI_INFORMTN_SCHEMA  SI_VALUES                    ORDSYS  SI_VALUES BI                  COUNTRIES                    SH      COUNTRIES OE                  COUNTRIES                    HR      COUNTRIES OE                  LOCATIONS                    HR      LOCATIONS OE                  DEPARTMENTS                  HR      DEPARTMENTS OE                  JOBS                         HR      JOBS OE                  EMPLOYEES                    HR      EMPLOYEES OE                  JOB_HISTORY                  HR      JOB_HISTORY BI                  CHANNELS                     SH      CHANNELS BI                  TIMES                        SH      TIMES BI                  COSTS                        SH      COSTS BI                  CUSTOMERS                    SH      CUSTOMERS BI                  PRODUCTS                     SH      PRODUCTS BI                  PROMOTIONS                   SH      PROMOTIONS BI                  SALES                        SH      SALES CONTAB              CP_TMCXP                     CXP     CP_TMCXP CONTAB              CP_TTRAM                     CXP     CP_TTRAM CONTAB              CP_THRUTA                    CXP     CP_THRUTA CONTAB              PP_TPPDO                     PPTO    PP_TPPDO CXP                 SC_TREPOR                    CONTAB  SC_TREPOR CXP                 SC_TMVREF                    CONTAB  SC_TMVREF CXP                 SC_TMTREQ                    CONTAB  SC_TMTREQ CXP                 GE_VACRE                     CONTAB  GE_VACRE CXP                 GE_TPROV                     CONTAB  GE_TPROV CXP                 GE_TGENERAL                  CONTAB  GE_TGENERAL CXP                 GE_TFLUJO                    CONTAB  GE_TFLUJO CXP                 GE_TENTI                     CONTAB  GE_TENTI CXP                 GE_TCIUD                     CONTAB  GE_TCIUD CXP                 GE_TBANC                     CONTAB  GE_TBANC CXP                 GE_TARTE                     CONTAB  GE_TARTE CXP                 GE_TACRE                     CONTAB  GE_TACRE CONTAB              CP_TCTRL                     CXP     CP_TCTRL CXP                 SC_TCOMCIA                   CONTAB  SC_TCOMCIA CXP                 SC_TCEXT                     CONTAB  SC_TCEXT CXP                 SC_TDIFR                     CONTAB  SC_TDIFR CXP                 SC_TDIFE                     CONTAB  SC_TDIFE CXP                 SC_TDDIF                     CONTAB  SC_TDDIF CXP                 GE_TMAYOR                    CONTAB  GE_TMAYOR CONTAB              TE_TOBLIG                    CXP     TE_TOBLIG CONTAB              TE_TMVTE                     CXP     TE_TMVTE CONTAB              TE_TSALB                     CXP     TE_TSALB CONTAB              TE_TREPOR                    CXP     TE_TREPOR CONTAB              TE_TTPMV                     CXP     TE_TTPMV CONTAB              CP_TORPV                     CXP     CP_TORPV CONTAB              CP_TORPG                     CXP     CP_TORPG CONTAB              CP_TORPF                     CXP     CP_TORPF PPTO                CP_TORPA                     CXP     CP_TORPA CONTAB              CP_TORPA                     CXP     CP_TORPA CONTAB              CP_TOPER                     CXP     CP_TOPER CONTAB              CP_TCTSC                     CXP     CP_TCTSC CXP                 SC_TTRAN                     CONTAB  SC_TTRAN CONTAB              CP_TTPVL                     CXP     CP_TTPVL CONTAB              CP_TTPMV                     CXP     CP_TTPMV CONTAB              CP_TREMY                     CXP     CP_TREMY CONTAB              CP_TPPTO                     CXP     CP_TPPTO CXP                 GE_TTPCO                     CONTAB  GE_TTPCO CXP                 GE_TTPBAN                    CONTAB  GE_TTPBAN CONTAB              CP_TVLREM                    CXP     CP_TVLREM PPTO                CP_TORPM                     CXP     CP_TORPM CONTAB              CP_TORPM                     CXP     CP_TORPM CONTAB              CP_TORPD                     CXP     CP_TORPM PPTO                GE_TCLASEINF                 CONTAB  GE_TCLASEINF CONTAB              PP_VMOVI                     PPTO    PP_VMOVI PPTO                SC_TCONS                     CONTAB  SC_TCONS PPTO                GE_TTPDO                     CONTAB  GE_TTPDO CXP                 PP_TMOVI                     PPTO    PP_TMOVI CONTAB              PP_TMOVI                     PPTO    PP_TMOVI PPTO                GE_TPERM                     CONTAB  GE_TPERM CONTAB              PP_TCOMCIA                   PPTO    PP_TCOMCIA CONTAB              PP_TDOAR                     PPTO    PP_TDOAR CONTAB              PP_TDOCU                     PPTO    PP_TDOCU PPTO                GE_TPAPEL                    CONTAB  GE_TPAPEL PPTO                GE_TAUXIL                    CONTAB  GE_TAUXIL PPTO                GE_TCENTENAS                 CONTAB  GE_TCENTENAS PPTO                GE_TDECENAS                  CONTAB  GE_TDECENAS PPTO                CP_TSOLD                     CXP     CP_TSOLD PPTO                GE_TCECOS                    CONTAB  GE_TCECOS PPTO                GE_TAREA                     CONTAB  GE_TAREA PPTO                CP_TSOLI                     CXP     CP_TSOLI PPTO                GE_TIPOAUX                   CONTAB  GE_TIPOAUX CXP                 GE_TIPOAUX                   CONTAB  GE_TIPOAUX PPTO                GE_TIMPR                     CONTAB  GE_TIMPR PPTO                GE_TFORM                     CONTAB  GE_TFORM PPTO                GE_TETCTA                    CONTAB  GE_TETCTA PPTO                GE_TDECTA                    CONTAB  GE_TDECTA CXP                 GE_TDECTA                    CONTAB  GE_TDECTA PPTO                GE_TUSUA                     CONTAB  GE_TUSUA PPTO                GE_TCIAS                     CONTAB  GE_TCIAS

En respuesta a por Juan78

en la BASE DE DATOS 11G En algunas ocasiones cuando da el error ORA-01775 no significa que tenga un sinonimo malo, lo que sucede, por ejemplo en algun trigger, procedimiento, funcion, etc en el que se encuentren en un esquema HHH y dentro de este esquema estamos realizando un trigger por asi decirlo colocamos por ejemplo v_variable_x HHH.tabla.campo%type, y solo nos va a decir que tenemos el error ORA-01775, y solamente tenemos que quitar el nombre del esquema ya que nos encontramos dentro del mismo y por esta razon es que nos da el error: dejar solo HHH.tabla.campo%type Espero y me haya dado a entender. Saludos Cordiales!!!

En respuesta a por henry calderon (no verificado)

Una pregunta.. a que te refieres con que quite el nombre del esquema? A mi me da ese error en esta linea: create or replace trigger kliz.insertar Que deberia de quitar?

En respuesta a por Anonimo (no verificado)

Creo que Henry se ha olvidado de quitar el nombre del esquema justo en el ejemplo que te ha puesto. Si tienes 'HHH.tabla.campo%type' tendrías que probar con 'tabla.campo%type'

En tu caso, si kliz es el nombre del esquema, prueba con 'create or replace trigger insertar', y busca en más sentencias donde utilices el nombre del esquema.

 

Buen día:

 

El error se soluciona borrando el sinonimo con la instrucción DROP PUBLIC SYNONYM MY_SYNONYM;

Y crearlo nuevamente con la sentencia CREATE PUBLIC SYNONYM MY_SYNONYM FOR MY_SYNONYM;

El error que se me presentaba es que lo creaba 

CREATE PUBLIC SYNONYM MY_SYNONYM FOR ESQUEMA2.MY_SYNONYM;

Y mi usuario no pertenece al esquema ESQUEMA2.

 

Espero que sea de ayuda.

 

 

 

 

ORA-01114: IO error writing block to file 201

ORA-01114: IO error writing block to file 201 jalbe_40 31 Julio, 2014 - 03:34

   Estoy trabajndo en algunas consultas SQL en Oracle 11g que tienes algunas funciones de agregacion  y union  y al momento de ejecurta el script me 

  da los siguientes errores:

  

  ORA-01114:IO error writing block to file 201

 

 

  ORA-27069: skgfdisp: attempt to do I/O beyond the range of the file

  OSD-04026: Invalid parameter passed. 

  ORA-01114: IO error writing block to file 201 

  ORA-27069: skgfdisp: attempt to do I/O beyond the range of the file

  OSD-04026: Invalid parameter passed. 

 

  Esto me sudeces cuando trato de consultar conjuntos grandes de datos, Ciertamente son errores de IO y espacio insuficiente en Tablespace.

 

 Mi pregunta es si los otros errores estan relacionados con el espacio insuficiente en tablespace?

 

 DISCULPEN!!