viernes, 11 de julio de 2008

Tunning

Bueno esta vez traigo unas imagenes interesantes sobre tunning, para los que no saben tunning es una tecnica, casi arte :P por medio del cual cambian los tradicionales gabinetes de las computadoras a otros un tanto mas llamativos, diferentes y muy creativos, esto se hace por varios motivos ya sea para mejorar el rendimiento de la pc dandole mas espacio y poniendole mejor sistema de refrigeracion o simplemente para mejorar su aspecto, bueno lo que lespueda decir esta de mas mejor veamos estas imagenes.














Imagenes 2 que 3

PECADOS














LUGARES






jueves, 10 de julio de 2008

Vale la pena???

Bueno esta entrada es por que voy a cambiar la lista vale la pena???, el cambio no sera grande solo que ahora no voy a dar mi opinion directamente sobre la lista, si no cre sera dentro de una entrada y eso si la critica en cuestion es muy buena o muy mala :P, el motivo de hacer esto es que dicha lista estba creciendo con rapidez y me comentaban que no era tan facil de leer, bueno pues ya que la voy a cambiar aqui dejo algunos comentarios que se encontraban antes en dicha lista, solo por si las dudas, bueno sin mas me despido. Y por favor no dejen de comentar y no tengan miedo de corregir o aportar algo.
atte: administrador

* :) - QUE SI VALE LA PENA, :| - QUE SI ESTA BUENO PERO NO TANTO, :( - NI LO INTENTES VER LEER O USAR ES UNA PORQUERIA.

* :( El final de los tiempos, a mi parecer no fue una pelicula muy buena y es que tal vez esperaba mas por los cortos que nos habian mostrado y por el director pero en fin no se me hizo una pelicula tracendente mas bienes un refrito de una japonesa llamada viento de amnesia simal no recuerdo, pero en fin en gustos se rompen generos :P.

* :) IRON MAN, muy buena pelicula, la verdad me sorprendio, pense que seria otro churro cinematografico pero en realidad a mi parecer esta muy entretenida tiene comedia, accion, aventura altamente recomendable veanla en el cine no mas.:P

* :) Cronicas de spiderwick (Pelicula) -Pues esta entretenida con sus correspondientes momentos de incoherencia pero bueno se le perdona ya que se desarrolla en un mundo de magia y fantasia donde todo es posible, en lo personal me agrado asi que os la recomiendo.

* :| Sobrenatural (Pelicula) -Pues esta pelicula esta dentro de lo pasable, aunque tiene sus partes un tanto fuera de lugar y unos cuantos momentos de tedio, sin embargo es entretenida, aunque el final no se como catalogarlo digo deja mucho que desear pero no es malo, simplemente es diferente a lo que nosotros esperariamos y desearamos.

* :( 10000 a.c (Pelicula) -Pues la verdad no es una mala pelicula, pero en realidad uno esperaba mas de ella, la publicidad y la tematica que manejaba eran bastante buenas como para el churro que alfinal salio, puedo recomendarla para un domingo sin nada mejor que hacer pero para ir a verla al cine definitivamente no, los efectos sobretodo el del tigre dientes de sable, deja mucho que desear y la historia esta llena de esos momentitos que te hacen sentir escalofrios pero de verguenza ajena.

* :| EL ORFANATO (NUEVA PELICULA DE gUILLERMO DEL tORO ) - Pues que puedo decir, que el laberinto del fauno no me agrado demasiado, pero esta pelicula es un tanto mejor, digo tiene suspenso y una historia pasable, si bien no es parecida alo que uno se imagina al ver los cortos, tiene sus momentos buenos, recomiendo para verla un sabadito cuando nada se tenga que hacer.

* :) FISH (libro) - Bueno que puedo decir, es del mismo autor de quien se llevo mi queso, tambien muy buen libro, son de la onda de superacion personal y su mensage mas claro es que todo depende de la actitud que tomemos ante la vida, es decir lo chido o lo miserable que te llegues a sentir te lo debes a ti y a nadie mas, lo mas importante y significativo de este libro es la siguiente receta, solo que para entenderla bien hay que leerse todo el libro: CUANDO ENTRE A TRABAJAR, ELIJA POR FAVOR LA ACTITUD DE HACER QUE HOY SEA UN GRAN DIA. LOS COMPAÑEROS, LOS CLIENTES, LOS MIEMBROS DEL EQUIPO Y USTED MISMO LO AGRADECERAN. ENCUENTRE MANERAS DE JUGAR, PODEMOS TOMARNOS EL TRABAJO MUY EN SERIO SIN ESTAR SERIOS. ESTE ATENTO PARA PODER ESTAR PRESENTE CUANDO MAS LE NECESITEN LOS CLIENTES Y LOS MIEMBROS DEL EQUIPO, Y SI SIENTE QUE LE FALTA ENERGIA, PRUEBE ESTE REMEDIO: BUSQUE UNA PERSONA QUE NECESITE AYUDA, UNA PALABRA DE APOYO O SENTIRSE ESCUCHADA Y ALEGRELE EL DIA.

* :) FRAUDE MEXICO 2006 (pelicula de Luis Mandoki) - Pues mas que una pelicula es un documental de un punto de vista, si no te gusta mucho la politica puede pareser un tanto tediosa pero sin duda muy interesante, el unico sentiemiento que te quedara despues de verla es el de indignacion, CALDERON sin duda alguna es un presidente ilegitimo y siento pena, tristesa y algo mas que mejor lo acallaremos para no ofender por todas aquellas personas que no saben el porque y solo hablan por hablar sin saber sobre que contexto se erigio presidente F. Calderon, pero en fin respeto ideas, igual hay personas que pese a saber todo siguen apoyandolo (empresarios extranjeros, altos mandatarios, Salinas, Elba ester etc) y piensan que de alguna forma ayudara al pais con la privatizacion de pemex, la reforma energetica, el tratado de lubre comercio etc, pero bueno bien por ellos siganos chingando igual.

* :| LA FORTALEZA DIGITAL - otra vez de Dan Brown, como todos sus libros super interesante, facil de leer y con datos muy curiosos aunque no muchas veces nesesariamente reales, recomiendo su lectura especialmente a todos los que formamos parte del mundo de la informatica ya que el tema central es la criptografia y como siempre un secreto que podria destruira un pais (USA) y por ende desestabilizar el mundo, lo se, lo se suena muy simple la trama pero en realidad esta muy buena, aunque llegando a determinado punto muy deducible, sincera (chequen que significa en este libro) AVL. ah por cierto si alguno de estos libros tienen ganas de checarlos antes de comprarlos =P visiten vagos, ebokzone, taurus Libros etc ;)

* :) EL TEMPLO DE ISTAR - es otro libro perteneciente a sagas alternas de la DragonLance, es un libro cargado de en primer lugar (para los que ya leimos las cronicas) de muchisima nostalgia, y mas si ya tiene sus ayeres que las leiste y ya no eres tan joven entonces en realidad si te pega mas, pero bueno conforme se va avanzando se comienzan a olvidar los ayeres y comienza a tomar forma como en la vida misma una nueva aventura que te hace dejar de vivir en el pasado, para tomar fuerzas y enfrentar lo que se tiene enfrente y lo que vendra, realmente como todos estos libros muy recomendable y muy pero muy interesante.

* :( SOY LEYENDA (Pelicula) - BASCA, apesar d que will es uno de mis actores favoritos, la pelicula se me hizo de mucha flojera, tal ves aun no este con la suficiente madurez mental como para entender su verdadero mensaje, pero dudo que en si contenga algun mensajes, asi que por mi parte les recomiendo no gastar sus 45 o 60 pesos en una entrada al cine y si tienen muchas ganas de verla pues recomiendo que no amerita mas que una bajadita de internet y verla cuando se tenga mucho tiempo y nada que hacer, espero que no se duerman.

* :) CRONICAS DE LA DRAGONLANCE - Es una saga de 3 libros, cargados de aventura, fantasia, amor y conflictos interpersonales, todo comienza con la llegada de tanis el semielfo a su antiguo hogar solace, en el camino se encuentra con su amigo el gruño y viejo enano flint, en el camino se topan con unos perversos guardias y comienzan a observar que su hermoso pueblo no era el mismo desde la ultima ves que estubieron, al llegar se encuentran con sus otros viejos amigos, raistlin el mago, caramon el guerrero, tasshlehoft el kender, tika la pasadera, sturm el caballero y apartir de un suceso donde un extraño y delgado guerrero acompañado de una hermosa mujer curan con magia a un viajero todo esto gracias a la intervencion misterioso anciano, se ven depronto todos ellos inmiscuidos en una de las mas hermosas y facinantes historias que en mi vida eh leido, muy recomendable y aparte la aventura no termina despues de esa saga, ya que los escritores se han encargado de hacer todo un mundo que es respaldado por cerca de 98 libros publicados. en lo personal me gusto mas que el señor de los anillos.

* :) ANGELES Y DEMONIOS - Dan Brown, si lo vale, es por mucho la mejor obra de Dan, para mi gusto mejor que el codigo Da vinci, es facilisima de leer, la accion , la emocion y el suspenso te acompañan a lo largo del libro, el cual logra realmente cautivar al lector y hacerlo participe de la aventura, no te asombres si de un momento a otro te encuentras especulando el por que de las sitiaciones y al final al puro estilo de stine, es alguien totalmente diferente, realmente recomiendo este libro ampliamente.

* :) EL CABALLERO DE LA ARMADURA OXIDADA - si lo vale, un hermoso libro con un mensaje de superacion personal, ademas es muy pequeño por lo que lo convierte en una lectura ideal para para una tarde en que te sientas triste o te sientas filosofo en potencia.

* :) EL HOBBIT de tolkien - si lo vale, es un magnifico libro de aventuras y fantasia, realmente muy recomendable, facil de leer y muy bien relatado. en lo personal me agrada un poco mas que el Sr. de los anillos.

* :) EL SEÑOR DE LOS ANILLOS - desde luego la respuesta es: si lo vale, magnifica obra que contiene todos los requisitos nesesarios para ser inolvidable, no por nada se convirtio en una obra de culto, lo tiene todo: amor, aventura, accion, batallas epicas, fantasia y mucho mas, muy recomendable, aunque un tanto grande para mi gusto y aveces un poco pesada para leer.

* :) LA CONSPIRACION - Dan Brown, si lo vale, es un libro con mucho suspenso y accion, muy facil de leer y muy entretenido.

martes, 8 de julio de 2008

Color

Bueno en un post anterior ya habia hablado de algunas cosas sobre el color, se que para muchos eso no es un tema importante, pero para las personas dedicadas a diseñar sitios, o que les guste pintar bueno pues estaran de acuerdo que usar una gama de colores correcta es la diferencia entre un trabajo agradable y armonioso y otro no tanto, pero bueno esto depende claro de la sensacion que deseen plasmar, bueno ya bricandome explicaciones traigo para ustedes algunas paginas muy interesantes que nos ayudaran si no somos muy expertos como en mi caso a tener paletas de color muy utiles para aplicarlas a nuestros sitios, imagenes o cualquier cosa que pueda hacer uso del color. :)

Colour Lovers : http://www.colourlovers.com/

Tal vez sea el mejor sitio para encontrar una buena paleta de colores que se adapte a tus necesidades. Aquí puedes encontrar desde un simple color hasta totalmente una combinación con su respectivo nombre y además de estar calificada y etiquetada, así por ejemplo puedes buscar una combinación para la palabra noche si es lo que quieres expresar en tu diseño. los colores puedes bajarlos en imagen con distintas opciones de resolución o con su respectiva combinación en RGB o su número hexadecimal.




Kuler: http://kuler.adobe.com/
Otra pagina muy buena la de Kuler creada por los desarrolladores de la suit Adobe, sinceramente es muy recomendable para generar paletas propias.




The Color Wizard : http://www.colorsontheweb.com/colorwizard.asp

Esta es una aplicación para combinar colores y también bastante sencilla de usar como Kuler pero la diferencia es que no debemos estar registrados y que solo nos mostrara el valor hexadecimal. También podemos escoger el tipo de combinación, por ejemplo, monocromía, triadas, complementarios, etc. Igualmente en la página podemos encontrar más herramientas e información sobre el color.



Como siempre espero que esto les sea tan util como a mi :)
bye

Todo Oracle

Bueno esta vez traigo aqui algo de informacion de oracle, la vdd no pretendo hacer un curso ni nada por el estilo por lo que lo siguiente no esta muy bien explicado, mas bien son un pequeño resumen de todo lo que vi en mi curso de oracle, se que a primera vista no se ve que sea informacion de importancia pero les pido que le den una oportunidad ya que conglomere mucha informacion dispersa y hallaran ademas cosas que dificilmente encontraran en la red, bueno no quiero dar mas explicaciones mejor los dejo con mini guia de referencia que aclaro no es precisamente para principiantes, pero los que ya saben algo de oracle tengan por seguroque encontraran cosas de mucho valor y ya saben cualquier aporte adicional seguro que se agradecera. :)

-------------------------PROFILES---------------------------

PARA PODER CREAR PROFILES DEBE DE ESTAR EL RESORCE_LIMIT EN TRUE, YA QUE ES EL PARAMETRO QUE NOS ACTIVA LA LIMITACION DE RECURSOS EN ORACLE:

SHOW PARAMETERS RESOURCE_LIMIT;

el por que de este archivo debe de estar en true es por que los perfiles permiten de cierta manera limitar los recursos
a los usuarios y si este parametro no esta en verdadero la limitacion de los profiles no sera real aunque paresca que se alla
creado correctamente.



SI NO ESTA CAMBIARLO CON:
ALTER SYSTEM SET RESOURCE_LIMIT=TRUE SCOPE=BOTH;



NOTA: EXISTE UN ARCHIVO BASE DE ORACLE PARA CREAR PERFILES ESTE ARCHIVO SE LLAMA:
UTLPWDMG.SQL



Y PARA CREAR UN PERFIL BASTA CON MODIFICARLO SEGUN NUESTRAS NECESIDADES Y CORRERLO DESDE LA TERMINAL COMO UN SQL ASI:
@C:\ORACLE\ORADATA\RDBMS\ADMIN\UTLPWDMG.SQL


PARA ASIGNAR UN PROFILE HACER:
ALTER USER NOM_USUARIO PROFILE NOM_PROFILE;


PARA MODIFICAR UN PROFILE USAR:
ALTER PROFILE NOM_PROFILE LIMIT //Y PONER LAS MODIFICACIONES QUE
QUERAMOS REALIZAR
FAILED_LOGIN_ATTEMPTS 3
PASSWORD_LIFE_TIME 60
PASSWORD_GRACE_TIME 10;


ELIMINAR PROFILE:
DROP PROFILE MIPROFILE;
Ó DROP PROFILE MIPROFILE CASCADE;


ALGUNAS DE LAS LIMITACIONES QUE PODEMOS TENER CON UN PROFILE SON:

-- FAILED_LOGIN_ATTEMPTS ERRORES ANTES DE BLOQUEAR LA CUENTA
-- PASSWORD_LOCK_TIME NUMERO DE DIAS EN QUE SE BLOQUEARA LA CUENTA
--PASSWORD_LIFE_TIME TIEMPO DE VIDA DESPUES DE QUE LA CONTRASEÑA EXPIRA
--PASSWORD_GRACE_TIME TIEMPO EXTRA DESPUES DE QUE LA CUENTA AH EXPIRADO
--PASSWORD_REUSE_TIME # DIASANTES DE PODER VOLVER A USAR UNA CONTRASEÑA
--PASSWORD_REUSE_MAX # MAXIMO DE CAMBIOS ANTES DE PODER REUTILIZAR UNA CONTRASEÑA.
--CONNECT_TIME 30 TIEMPO MAXIMO DE CONECCION EN MINUTOS
-- IDLE_TIME TIEMPO EN MINUTOS EN QUE PUEDE ESTAR UN USUARIO DESOCUPADO


INDEPENDIENTEMENTE DE LAS FUNCIONES ANTERIORES EXISTE UNA FUNCION QUE SE ACTIVA AGREGANDO EN LA CREACION DEL PROFILE LA SIGUIENTE LINEA:

--PASSWORD_VERIFY_FUNCTION

LO QUE HACE ESTA LINEA ES ACTIVAR UNA FUNCION LLAMADA VERIFY_FUNCTION LA CUAL PODEMOS MODIFICAR PARA RESTRINGIR A NUESTROS USUARIOS TANTO COMO LO DESEEMOS.


---------ROLES-----------------------------------------------------------------------
PARA CREAR UN ROLE:
CREATE ROLE NOMBRE_ROL;


PONER PASSWORD A UN ROL:
Set role nombre_role identified by contraseña;

DESACTIVAR PASSWORD DE ROL:
Set role none;


VISTAS ASOCIADAS
DBA_ROLES, DBA_ROLES_PRIVS,DBA_SYS_PRIVS,ROLE_ROLE_PRIVS,ROLE_SYS_PRIVS,ROLE_TAB_PRIVS.

EXISTEN DOS ROLES ESPECIALES EL DE SYSDBA Y EL DE SYSOPER, PARA SABER QUE USUARIOS TIENEN ESTOS ROLES HAY QUE REALIZAR LA SIGUIENTE CONSULTA:

Select * from V$PWFILE_USERS;



///////////////PRIVILEGIOS//////////////////////////////////////////////////////////


-OTORGAR PRIVILIGIOS A USUARIOS SOBRE CUALQUIER TABLA:
GRANT SELECT ANY TABLE, INSERT ANY TABLE, DELETE ANY TABLE, UPDATE ANY TABLE TO NOMBRE_USUARIO WITH ADMIN OPTION;

SI ACTIVAMOS LA OPCION WITH ADMIN OPTION LO QUE HACEMOS ES PERMITIR QUE ESE USUARIO TAMBIEN PUEDA OTORGAR LOS PRIVILEGIOS QUE ESTA RECIVIENDO,


-OTORGAR PRIVILEGIOS DE OBJETOS SOBRE DETEWRMINADO OBJETO O ESQUEMA:
GRANT ALTER,DELETE,EXECUTE,INDEX,INSERT,REFERENCES,SELECT,UPDATE ON BD.TABLA TO NOM_USUARIO WITH GRANT OPTION;

-QUITAR, ELIMINAR PRIVILEGIOS:
REVOKE PRIVILEGIO FROM USUARIO;
REVOKE SELECT ON emi.orders FROM jeff;

-DAR PRIVILEGIOS DE ADMINISTRACION(CREACION, ELIMINACION, ETC):
GRANT CREATE ANY INDEX, ALTER ANY INDEX,DROP ANY INDEX,
CREATE TABLE, CREATE ANY TABLE,ALTER ANY TABLE,DROP ANY TABLE, SELECT ANY TABLE, UPDATE ANY TABLE, DELETE ANY TABLE,
CREATE SESSION,ALTER SESSION, RESTRICTED SESSION,
CREATE TABLESPACE,ALTER TABLESPACE, DROP TABLESPACE, UNLIMITED TABLESPACE TO NOMBRE_USUARIO;

-PARA DAR TODOS LOS PRIVILEGIOS A UN USUARIO
GRANT GRANT ANY PRIVILEGE TO NOM_USUARIO;


-PRIVILEGIOS DE SYSDBA Y SYSOPER

PARA QUE ESTOS PRIVILEGIOS FUNCIONEN APARTE DE SER OTORGADOS DEBEN ACTIVARSE AL LOGEARSE COMO USUARIOS ESTO SE HACE:
CONN NOMBRE_USUARIO/CNTRASEÑA_USUARIO AS SYSOPER;
CONN NOMBRE_USUARIO/CNTRASEÑA_USUARIO AS SYSDBA;


PUEDEN DARSE TODOS LOS PRIVILEGIOS DE SYSDBA ASI:
GRANT SYSDBA TO NOM_USUARIO;
PUEDEN DARSE TODOSLOS PRIVILEGIOS DE SYSOPER ASI:
GRANT SYSOPER TO NOM_USUARIO;

O PUEDEN DARSE SOLAMENTE ALGUNOS PRIVILEGIOS DE SYSOPER TALES COMO:
STARTUP,SHUTDOWN,ALTER DATABASE OPEN|MOUNT,ALTER DATABASE BACKUP CONTROLFILE TO,RECOVER DATABASE, ALTER DATABASE ARCHIVELOG,RESTRICTED SESSION.
CREATE DATABASE,ALTER DATABASE,ALTER TABLESPACE BEGIN/END BACKUP,RESTRICTED SESSION,RECOVER DATABASE UNTIL.


EJEM: GRANT STARTUP, SHUTDOWN,ALTER DATABASE OPEN,ALTER DATABASE BACKUP CONTROLFILE TO,RECOVER DATABASE,ALTER DATABASE ARCHIVELOG,RESTRICTED SESSION, SYSOPER PRIVILEGES WITH ADMIN OPTION,CREATE DATABASE,ALTER TABLESPACE BEGIN BACKUP,RESTRICTED SESSION, RECOVER DATABASE UNTIL TO USUARIO;



-VISTAS PARA VER QUIEN TIENE PRIVILEGIOS DE SYSDBA O SYSOPER
Select * from V$PWFILE_USERS;


PARA ASIGNAR PRIVILEGIOS SOBRE UN ESQUEMA:----------------------------------------------------------------------
GRANT { object_privilege [(column_list)]
[, object_privilege [(column_list)] ]...
|ALL [PRIVILEGES]}
ON [schema.]object
TO {user|role|PUBLIC}[, {user|role|PUBLIC} ]...
[WITH GRANT OPTION]

DONDE:
object_privilege: ES EL PRIVILIGIO QUE SE CONCEDERA P.E SELECT ANY TABLE
column_list: Specifies a table or view column. (This can be specified only when granting the INSERT, REFERENCES, or UPDATE privileges.)
ALL: Grants all privileges for the object that have been granted WITH GRANT OPTION
ON object: Identifies the object on which the privileges are to be granted
WITH GRANT OPTION: Enables the grantee to grant object privileges to other users or roles



--VISTAS RELACIONADAS
--DBA_SYS_PRIVS
--SESSION_PRIVS
--DBA_TAB_PRIVS
--DBA_COL_PRIVS

////////////////////////// USUARIOS ////////////////////////////////////////////////

-PARA CREAR UN USUARIO:
CREATE USER NOMBRE_USUARIO IDENTIFIED BY PASSWORD_USUARIO;

PROPIEDADES
DEFAULT TABLESPACE, TEMPORARY TABLESPACE, QUOTA(ESPACIO MAXIMO QUE PUDE OCUPAR EN UN ESPACIO DE TABLAS), PROFILE.

EJEMPLO:
create user ugo
identified by ugo
default tablespace users
temporary tablespace temp;


-ELIMINAR USUARIO
DROP USER USUARIO1 [CASCADE];


-USUARIO CON PASSWORD ENCRIPTADO
create user nom_user identified by values '123AB456CD789EF0';

-PARA VER LOS PASSWORDS ENCRIPTADOS:
select username, password from dba_users;
-PARA VER LOS USUARIOS CREADOS:
SELECT USERNAME FROM DBA_USERS;

-PARA MODIFICAR LAS PROPIEDADES DE UN USUARIO PONER EN VEZ DE CREATE EL COMANDO ALTER P.E:
ALTER USER NOM_USUARIO PROFILE NOM_PROFILE;

-PARA DESBLOQUEAR USUARIO:
ALTER USER HR ACCOUNT UNLOCK;

-PARA BLOQUEARLO:
ALTER USER NOM_USUARIO ACCOUNT LOCK;


///////////////////////////////// INDICES /////////////////////////////////////////

-CREAR UN INDICE:
CREATE [UNIQUE] INDEX index_name ON
table_name(column_name[, column_name...])
TABLESPACE tab_space;


EJEMPLOS:
CREATE INDEX customers_last_name_idx ON customers(last_name);
CREATE UNIQUE INDEX customers_phone_idx ON customers(phone);
CREATE INDEX employees_flast_name_idx ON employees(first_name, last_name);


-VISTAS ASOSIADAS
SELECT index_name, table_name, uniqueness, status
FROM user_indexes
WHERE table_name IN ('CUSTOMERS', 'EMPLOYEES');

select object_name, object_type from user_objects where object_type='INDEX';

-ELIMINAR INDICE:
DROP INDEX NOMBRE_DEL_INDICE;

-CREAR UN INDICE DE MAPA DE BIT:
CREATE BITMAP INDEX NOMBRE_INDICE ON NOMBRE_TABLE('NOMBRE_COLUMNA');
P.E CREATE BITMAP INDEX IND_PER ON EXAMEN.PERSONAL(ID);

NOTAS: LAS COLUMNAS QUE DEBEN CONTENER INDICES SON AQUELLAS QUE SE ESTAN CONSULTANDO CONSTANTEMENTE.
UN INDICE FUNCIONAL ES AQUE QUE OCUPA FUNCIONES AL CREARLO,P.E LA FUNCION UPPER PARA PONER SU CONTENIDO EN MAYUSCULA;


////////////////////////////////////// RESTRICCIONES //////////////////////////////
-LAS RESTRICCIONES QUE PUEDE TOMAR UNA TABLA O CAMPO SON:

NOT NULL Una columna no puede contener un valor nulo
UNIQUE HACE QUE UNA COLOMNA O CONJUNTO DE COLUMNAS TENGAN VALORES UNICOS PARA TODAS LAS FILAS DE LA TABLA.
PRIMARY KEY Identifica unívocamente cada fila de la tabla
FOREIGN KEY Establece y obliga a que se cumpla una restricción de integridad entre una columna y otra columna de la tabla referenciada.
CHECK Especifica una condición que debe ser cierta


-PARA VER RESTRICCIONES:
SELECT * FROM USER_CONSTRAINTS;

-COMPROVAR COLUMNAS ASOCIADAS:
SELECT * FROM USER_CONS_COLUMNS WHERE table_name=’Empleados’;

- RESTRICCION DE TABLA
CREATE TABLE Empleados (
id NUMBER(6),
apellidos VARCHAR2(40),
nombre VARCHAR2(20) NOT NULL,
supervisor_id NUMBER(6),

CONSTRAINT emp_pk PRIMARY KEY (id) );



- RESTRICCION DE COLUMNA NOT NULL
CREATE TABLE Empleados2 (
nombre VARCHAR2(20) NOT NULL,
Fecha_alta DATE CONSTRAINT fecha_obli NOT NULL);


NOTA:SE PUEDEN HACER RESTRICCIONES COMPUESTAS DE DOS O MAS COLUMNAS:
CONSTRAINT nom_unico UNIQUE (apellidos,nombre);

-RESTRICCION FOREIGN KEY DE COLUMNA:
CREATE TABLE Empleados (
dep NUMBER(4) CONSTRAINT emp_dep_fk REFERENCES Departamentos (num),
id NUMBER);

-FOREIGN KEY A NIVEL DE TABLA
CREATE TABLE Empleados (
dep NUMBER(4),
nom VARCHAR2(20),
CONSTRAINT emp_dep_fk FOREIGN KEY (dep) REFERENCES Departamentos (num) ON DELETE CASCADE|ON DELETE SET NULL);


-CHECK A NIVEL DE TABLA:
CREATE TABLE Empleados (
salario NUMBER(8,2),
neto NUMBER(8,2),
CONSTRAINT neto_max
CHECK (neto<=salario*0’8) ); -AÑADIR RESTRICCIONES ALTER TABLE Empleados ADD CONSTRAINT emp_supervisor_fk FOREIGN KEY (supervisor_id) REFERENCES Empleados(id); -ELIMINAR RESTICCIONES: ALTER TABLE
DROP { PRIMARY KEY | UNIQUE () | CONSTRAINT [CASCADE];

P.E: ALTER TABLE Empleados DROP CONSTRAINT emp_supervisor_fk;
ALTER TABLE Departamentos DROP PRIMARY KEY CASCADE;


-VISTAS ASOCIADAS:
USER_CONSTRAINTS Y USER_CONS_COLUMNS

-DESACTIVAR RESTRICCIONES
ALTER TABLE DISABLE CONSTRAINT [CASCADE];


-ACTIVANDO RESTRICCIONES
ALTER TABLE ENABLE CONSTRAINT ;

-PARA ELIMINAR COLUMNAS CON REFERENCIAS SOLO AGREGAR LA OPCION CASCADE CONSTRAINT ASI:
ALTER TABLE prueba1 DROP (pk) CASCADE CONSTRAINTS;


///////////////////////////////////// TABLESPACES //////////////////////////////////
Crear un tablespace de 10 M de tamaño y qe solo pueda crecer hasta 500M

- create tablespace mamon datafile 'c:\oracle\mamon.dbf' size 10M autoextend on maxsize 500M;


Crear un tablespace llamado ultimo con un datafile ultimo01.ora
de tamaño inicial de 2m y qye pueda crecer al maximo permitido por el espacio en disco.

SQL> CREATE TABLESPACE ULTIMO DATAFILE 'C:\ULTIMITO.ORA' SIZE 3M AUTOEXTEND ON NEXT 1M MAXSIZE UNLIMITED;




-CREANDO UN TABLESPACE DE UNDO:

CREATE UNDO TABLESPACE undo1 DATAFILE '/u01/oradata/undo01.dbf' SIZE 40M;

-AGREGAR DATAFILES A TABLESPACE UNDO:
ALTER TABLESPACE MIUNDO ADD DATAFILE 'C:/ORACLE/ORADATA/ITT2008/MIO.DBF' SIZE 5M;
-VISTAS: V$UNDOSTAT
-PARA SABER EL UNDO DEFAULT DE LA BD:
SHOW PARAMETER UNDO_TABLESPACE
-CAMBIAR EL TS UNDO DEFAUL:
ALTER SYSTEM SET UNDO_TABLESPACE=NVO_TS_UNDO;


- CREAR UN TABLESPACE:

CREATE TABLESPACE tablespace
[DATAFILE clause]
[MINIMUM EXTENT integer[K|M]]
[BLOCKSIZE integer [K]]
[LOGGING|NOLOGGING]
[DEFAULT storage_clause ]
[ONLINE|OFFLINE]
[PERMANENT|TEMPORARY]
[extent_management_clause]
[segment_management_clause]

CREATE TABLESPACE MITABLESPACE DATAFILE 'C:/ORA/.../NVODATAFIELD.DBF' SIZE 5M;


- TABLESPACE MANEJADO LOCALMENTE:
CREATE TABLESPACE AUX DATAFILE 'C:\TSAUX.DBF' SIZE 5M REUSE EXTENT MANAGEMENT LOCAL UNIFORM SIZE 128 K;


- BONUS: TABLA ASIGNADA A UN TS MANEJADO LOCALMENTE
create table TABLA01 (C1 VARCHAR2(4000)) tablespace DATACURSOxy storage (initial 256K minextents 1);
Ó SIMPLEMENTE :
create table TABLA01 (C1 VARCHAR2(4000)) tablespace DATACURSOxy;


- TABLESPACE MANEJADO CON EL DICCIONARIO DE DATOS:

IMPORTANTE: Si el tablespace SYSTEM ha sido creado como LOCAL, ya no se podrá crear ningún
tablespace manejado por DICCIONARIO en la BD.
PARA VERIFICAR COMO ESTA DECLARADO DICHO TABLESPACE HACER LA SIGUIENTE CONSULTA:
SELECT TABLESPACE_NAME, EXTENT_MANAGEMENT FROM DBA_TABLESPACES WHERE TABLESPACE_NAME='SYSTEM';


CREATE TABLESPACE userdata
DATAFILE '/u01/oradata/userdata01.dbf'
SIZE 500M EXTENT MANAGEMENT DICTIONARY
DEFAULT STORAGE
(initial 1M NEXT 1M PCTINCREASE 0);


- PASAR DE UN TABLESPACE MANEJADO POR DICTIONARY A UNO MANEJADO LOCALMENTE

DBMS_SPACE_ADMIN.TABLESPACE_MIGRATE_TO_LOCAL('SYSTEM');

PARA CONOCER CUAL ES EL ESPACIOLIBRE DE UN TABLESPACE HACER:

select bytes from dba_free_space where tablespace_name='NOMBRE_TS';

-Podemos ver el tablespace por defecto (y el temporal) de cada usuario en DBA_USERS:

SELECT USERNAME,rpad(DEFAULT_TABLESPACE,20),rpad(TEMPORARY_TABLESPACE,20) FROM DBA_USERS;


-CREAR TABLESPACE TEMPORALES
CREATE TEMPORARY TABLESPACE temp
TEMPFILE '/u01/oradata/temp01.dbf' SIZE 20M
EXTENT MANAGEMENT LOCAL UNIFORM SIZE 4M;


-ASIGNAR UN TS DESDE LA CREACION DE LA BD CON:

DEFAULT TABLESPACE(NO COMANDO, AGREGADO PARA DETERMINAR UNA TTS EN -- UNA NVA BD),
DEFAULT TEMPORARY TABLESPACE temp TEMPFILE '/$HOME/ORADATA/u03/temp01.dbf' SIZE 4M
Ó MODIFICARLA MEDIANTE:
ALTER DATABASE DEFAULT TEMPORARY TABLESPACE default_temp2;


-PARA VER LAS PROPIEDADES DE LA BD PONER:
SELECT * FROM DATABASE_PROPERTIES;


-PARA VER EL TEMPORARY TS DE LA BD PONER:
SELECT * FROM DATABASE_PROPERTIES WHERE PROPERTY_NAME='DEFAULT_TEMP_TABLESPACE';



-- VISTAS ASOCIADAS
--DATABASE_PROPERTIES
--DBA_DATA_FILES
--DBA_TABLESPACES
--V$TABLESPACE
--DBA_DATA_FILES
--V$DATAFILE
--DBA_TEMP_FILES
--V$TEMPFILE



- MODIFICANDO LAS PROPIEDADES DE LOS TABLESPACES

ALTER TABLESPACE NOMBRE_DEL_TS READ ONLY;
ALTER TABLESPACE NOMBRE_DEL_TS OFFLINE;
ALTER TABLESPACE NOMBRE_DEL_TS ONLINE;
ALTER TABLESPACE NOMBRE_DEL_TS MINIMUM EXTENT 2M;
ALTER TABLESPACE NOMBRE_DEL_TS DEFAULT STORAGE (INITIAL 2M NEXT 2M --MAXEXTENTS 999);


-CREAR UN TABLESPACE CON AUTOEXTEND:
CREATE TABLESPACE userdata02
DATAFILE '/u01/oradata/userdata02.dbf' SIZE 5M
AUTOEXTEND ON NEXT 2M MAXSIZE 200M;

PONER EL TS DE LA BD CON AUTOEXTEND:
ALTER DATABASE DATAFILE '/u01/oradata/userdata02.dbf' AUTOEXTEND ON NEXT 2M;

-REDIMENCIONAR UN DATAFILE:
ALTER DATABASE DATAFILE '/u01/oradata/userdata02.dbf' RESIZE 5M

- AGREGAR DATAFILE A TABLESPACE:
ALTER TABLESPACE NOMBRE_DEL_TS ADD DATAFILE '/u01/oradata/userdata03.dbf' SIZE 5M;


- BORRAR TABLESPACE:
DROP TABLESPACE tablespace [INCLUDING CONTENTS [AND DATAFILES] [CASCADE CONSTRAINTS]];


- PONER DIRECCION PARA GUARDAR ARCHIVOS CREACION AUTOMATICA (OMF):
ALTER SYSTEM SET db_create_file_dest = '/u01/oradata/dba01';


-PARA VER SI UN TS ES AUTOEXTEND EJECUTAR LA SIGUIENTE CONSULTA:
SELECT TABLESPACE_NAME,FILE_NAME,AUTOEXTENSIBLE FROM DBA_DATA_FILES;

-PARA CREAR UN TS CON VARIOS ARCHIVOS EN UNA SOLA SENTENCIA:
CREATE TABLESPACE NOM_MI_TS DATAFILE 'C:\DU.DBF' SIZE 1M, 'C:\DD.DBF' SIZE 2M;


ESTRUCTURAS:
ESTRUCTURA GENERAL DE CREACION:
CREATE TABLESPACE NOMBRETABLESPACE
DATAFILE 'NOMBREARCHIVO' [SIZE ENTERO [K | M] [REUSE]
[DEFAULT STORAGE
(INITIAL TAMAÑO
MINEXTENTS TAMAÑO
MAXEXTENTS TAMAÑO
PCTINCREASE VALOR
)]
[ONLINE | OFFLINE];

REUSE= Reutiliza el archivo si ya existe o lo crea si no existe.
DEFAULT STORAGE= Define el almacenamiento por omisión para todos los objetos que se creen en este espacio de la tabla. Fija la cantidad de espacio si no se especifica en la sentencia CREATE TABLE.

- ESTRUCTURA DE Modificación de tablespaces

ALTER TABLESPACE NOMBRETABLESPACE
{[ADD DATAFILE 'NOMBREARCHIVO' [SIZE ENTERO [K | M] [REUSE]
[AUTOEXTEND ON… | OFF]
]
[REANME DATAFILE 'ARCHIVO' [, 'ARCHIVO']…
TO 'ARCHIVO' [, 'ARCHIVO']]
[DEFAULT STORAGE CLAUSULAS_ALMACENAMIENTO]
[ONLINE | OFFLINE]
};

ADD_DATAFILE= Añade al tablespace uno o varios archivos.
AUTOEXTEND= Activa o desactiva el crecimiento automático de los archivos de datos del tablespace. Cuando un tablespace se llena podemos usar esta opción para que el tamaño del archivo o archivos de datos asociados crezca automáticamente.
Autoextend off: desactiva el crecimiento automático.
RENAME_DATAFILE= Cambia el nombre de un archivo existente del tablespace. Este cambio se tiene que hacer desde el sistema operativo y, después, ejecutar la orden SQL.


//////////////////////////////////////// ACTIVAR USUARIO DEL S.O/////////////////////
show parameters authent;

ALTER SYSTEM SET os_authent_prefix ="OPS$" SCOPE=SPFILE;

--USUARIO CON EL CUAL ESTAMOS CONECTADOS CON EL SO
select UPPER(sys_context('userenv','os_user')) from dual;


create user "OPS$LAURALANTHALAS\ABEL" IDENTIFIED BY EXTERNALLY;
GRANT CONNECT TO "OPS$LAURALANTHALASA\ABEL“;

Connect /
Show user;

/////////////////////////// VISTAS /////////////////////////////////////////////////

-1)CREAR UNA VISTA QUE MUESTRE SOLO LOS USUARIOS CONECTADOS AL SISTEMA --QUE CONTENGA USUARIO DEL SO, USUARIO DE LA BD, MAQUINA DESDE LA QUE --ESTA CONECTADO, HORA MINUTO Y SEGUNDO DESDE QUE SE CONECTO Y PROGRAMA --QUE ESTA UTILIZANDO.

CREATE VIEW MIvISTA
select username,machine,program,osuser,to_char(logon_time,'hh:mi:ss') from v$session;



-ESQUEMA GRAL
CREATE [OR REPLACE] [FORCE | NOFORCE] VIEW
[([, ] … )]
AS
[WITH CHECK OPTION [CONSTRAINT ]]
[WITH READ ONLY [CONSTRAINT ]];


P.E
CREATE VIEW EmpDepVentas
AS SELECT apellidos, nombre
FROM Empleados
WHERE dep=”Ventas”
WITH CHECK OPTION;

-VISTASPARA CONSULTAR:
SELECT * FROM USER_VIEWS;

-VISTAS CON ALIAS:

CREATE VIEW EmpDepVentas
AS SELECT apellidos Last_name, nombre First_name
FROM Empleados
WHERE dep=”Ventas”;


Ó

CREATE VIEW EmpDepVentas (Last_name, First_name)
AS SELECT apellidos, nombre
FROM Empleados
WHERE dep=”Ventas”;



-VISTAS COMPLEJAS
CREATE VIEW DepSalarios
(Departamento, Minimo, Maximo, Medio)
AS SELECT d.nombre, MIN(e.salario), MAX(e.salario), AVG(e.salario)
FROM Empleados e, Departamentos d
WHERE e.dep=d.nombre
GROUP BY d.nombre;

-ELIMINAR VISTA:
DROP VIEW NOMBRE_DE_LA_VISTA;


- MODIFICAR UNA VISTA:
UNA VISTA NO SE MODIFICA PERO SE PUEDE REESTRUCTURAR CON LA SENTENCIA
CREATE OR REPLACE VIEW nombre_vista AS SELECT APELLIDO FROM EMPLADO WHERE DEP="VENTAS";


/////////////////////// PROCEDIMIENTOS Y FUNCIONES ////////////////////////////////

- PROCEDIMIENTOS

CREATE or replace PROCEDURE AUMENTO (PCT_AUMENTO IN NUMBER) AS BEGIN UPDATE EMP SET SAL=SAL+(SAL*(PCT_AUMENTO/100));
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE("No hay ningun empleado.");
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE("Error ejecución.");
RAISE;
END;
- ESQUEMA
CREATE [OR REPLACE] PROCEDURE name [(param [IN|OUT|IN OUT|] datatype) . . .]
[IS|AS] pl/sql_subprogram

Los modificadores IN, OUT, IN OUT indican si el parametro es de entrada, salida o ambos.








- FUNCIONES



CREATE FUNCTION FUNCION_AUMENTO (ID_EMP IN NUMBER, PCT_AUMENTO IN NUMBER)
RETURN NUMBER
AS
PORCENTAJE NUMBER (11,2);
BEGIN
SELECT SAL*(PCT_AUMENTO/100)
INTO PORCENTAJE
FROM EMP
WHERE EMPNO=ID_EMP;
RETURN (PORCENTAJE);
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE("No hay ningun empleado.");
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE("Error ejecución.");
RAISE;
END;

//////////////////// SECUENCIAS //////////////////////////////////////////////


Para crear una secuencia en Oracle mediante SQL utilizaremos el comando create sequence con la siguiente sintaxis:

CREATE SEQUENCE nombre_secuencia
INCREMENT BY numero_incremento
START WITH numero_por_el_que_empezara
MAXVALUE valor_maximo | NOMAXVALUE
MINVALUE valor_minimo | NOMINVALUE
CYCLE | NOCYCLE
ORDER | NOORDER

Por ejemplo, si queremos crear una secuencia que empiece en 100 y se incremente de uno en uno utilizaremos la siguiente consulta SQL:

CREATE SEQUENCE incremento_id_cliente
INCREMENT BY 1
START WITH 100

Para utilizar la secuencia, en primer lugar, crearemos una tabla de prueba (para insertar un registro y comprobar que la secuencia anterior funciona correctamente):

create table clientes (
codigo number not null primary key,
nombre varchar2(100) unique not null,
cif varchar2(15) unique,
fechaalta date)

Para utilizar la secuencia creada en una inserción de fila:

insert into clientes values (
incremento_id_cliente.NextVal,
'AjpdSoft',
'11225522F',
sysdate)

Realizamos otra inserción para comprobar que el incremento es de 1:

insert into clientes values (
incremento_id_cliente.NextVal,
'Otro cliente',
'00000G',
sysdate)

Como se puede observar en el ejemplo anterior, para obtener el siguiente valor de la secuencia almacenada se utiliza el comando: nombre_secuencia.NextVal.




/////////////////// ARCHIVOS DE INICIO PFILE Y SPFILE //////////////////////////////
1)CREAR PFILE A PARTIR DE SPFILE

ver si el spfile esta activo con:
show parameters spfile
si tiene un valor quiere decir que si esta activo, Y COMO ESTA ACTIVO UN SPFILE ENTONCES SI PODEMOS CREAR UN PFILE APARTIR DE ESTE.

CREATE PFILE='C:\ORACLE\ORA92\PFILENUEVO.ORA' FROM SPFILE;


2)crear SPFILE APARTIR DE PFILE
create SPFILE='C:\SPFILENUEVO.ORA' FROM PFILE='C:\ORACLE\ORA92\PFILENUEVO.ORA';

3)LEVANTAR LA BD APARTIR DEL PFILE
SHUTDOWN IMMEDIATE
STARTUP PFILE='C:\ORACLE\ORA92\PFILENUEVO.ORA';


4)ABRIR LA BD EN MODO DE SOLO LECTURA
STARTUP OPEN READ ONLY;
STARTUP OPEN READ WRITE;//MODO LECTURA ESCRITURA

5)PARA ABRIR LA BASE DE DATOS EN BASE DE UN SPFILE QUE SE ENCUENTRA EN OTRA LOCALIZACION, LO QUE HAY QUE HACER ES EDITAR EL ARCHIVO PFILE CORRIENTE Y AGREGAR EN EL PARAMETRO SPFILE LA DIRECCION DEL ARCHIVO QUE DESEAMOS USE PARA CARGAR LA BD.


//////////////////// DE EXAMENES ////////////////////////////////////////////////


1) DETERMINAR CUANDO SE REALIZO EL ULTIMO ANALISIS A NUESTRAS TABLAS
//PARA VERIFICAR
SELECT TABLE_NAME, LAST_ANALYZED FROM USER_TABLES;
//PARA ANALIZAR
ANALIZE TABLE MATERIA COMPUTE STATISTICS FOR TABLE;

2)OBTENER LA TABLA CON EL MAYOR NUMERO DE REGISTROS
SELECT TABLE_NAME FROM DBA_TABLES WHERE NUM_ROWS=(SELECT MAX(NUM_ROWS)FROM DBA_TABLES);

3)OBTENER EL NOMBRE Y DUEÑO DE LOS INDICES EN LOS CUALES TENGAMOS PROBLEMAS
SELECT INDEX_NAME,OWNER,STATUS FROM DBA_INDEXES WHERE STATUS='N/A';
SELECT INDEX_NAME,OWNER,STATUS FROM DBA_INDEXES WHERE STATUS!='VALID';

4)OBTENER MEDIANTE EL DICCIONARIO DE DATOS LA VERSION DE ORACLE INSTALADA
SELECT * FROM V$VERSION;

5)OBTENER MEDIANTE EL DICCIONARIO LOS TIPOS DE SEGMENTOS EXISTENTES EN NUESTRA BASE DE DATOS
SELECT UNIQUE(SEGMENT_TYPE) FROM DBA_SEGMENTS;

6)OBTENER EL ESTATUS Y NOMBRE DE LOS DATAFILES
SELECT FILE_NAME, STATUS FROM DBA_DATA_FILES;

7)CREAR UNA CONSULTA QUE MUESTRE EL NUMERO DE EXTENTS QUE TIENE UN SEGMENTO(TABLA) POR EJEMPLO: EL SEGMENTO VENTAS DEL ESQUEMA VENTAS
SELECT COUNT(EXTENT_ID) FROM DBA_EXTENTS WHERE SEGMENT_NAME='IDL_UB1$';


8)OBTENER LOS USUARIOS DEL SISTEMA QUE NO SE ENCUENTREN BLOQUEADOS
SELECT USERNAME, ACCOUNT_STATUS FROM DBA_USERS WHERE ACCOUNT_STATUS='OPEN';

9)OBTENER LOS TABLESPACES DEL SISTEMA Y EL TAMAÑO DE LOS MISMOS EN MB
SELECT FILE_NAME,TO_NUMBER(BYTES/1024/1024) FROM DBA_DATA_fILES WHERE TABLESPACE_NAME='SYSTEM';


////////////////////////////////// MOVER DATAFILES ///////////////////////////////
EXISTEN DOS TIPOS DE DATAFILES LOS QUE PERTENECEN AL SYSTEMA Y LOS QUE NO, PARA LOS DATAFILES DE SYSTEM HAY QUE MOVERLOS TENIENDO LA BASE DE DATOS UNICAMENTE MONTADA, MIENTAS QUE LOS OTROS HAY QUE MOVERLOS CON LA BASE DE DATOS ABIERTA, EL CAMBIO DESDE EL ORACLE SE HACE LOGICAMENTE, POR LO QUE LOS ARCHIVOS FISICOS YA SE DEBERAN DE ALLAR EN LA DIRECCION A LA QUE DESEAMOS CAMBIARLOS, ES DECIR EL DESTINO FISICO YA DEBE DE ALLARSE, PARA EVIAR HACER ESTE PROCEDIMIENTO PASO POR PASO, PODEMOS CREAR SCRIPT ATRA VEZ DE UN SELECT, PARA HACER ESTE CAMBIO POR LOTES, ESTE PROCESO ES EL SIGUIENTE:

1) COPIAR FISICAMENTE TODOS LOS DATAFILES YA SEAN DE SYSTEM O NO:
SELECT 'HOST COPY '||FILE_NAME ||' S'||FILE_NAME FROM DBA_DATA_FILES;


2)REDIRECCIONAR DATAFILES DE SYSTEM:
SHUTDOWN IMMEDIATE
STARTUP MOUNT
SELECT 'ALTER DATABASE FILE '||FILE_NAME ||' TO S'||FILE_NAME FROM DBA_DATA_FILES WHERE TABLESPACE_NAME IN ('SYSTEM','TEMP','UNDOTBS1');



3) ABRIR LA BD, DAR DE BAJA LOS TS Y REDIRECCIONAR TODOS LOS DATAFILES QUE NO SON DE SYSTEM:

ALTER DATABASE OPEN;

SELECT 'ALTER TABLESPACE '|| TABLESPACE_NAME|| ' OFFLINE' FROM DBA_DATA_FILES WHERE TABLESPACE_NAME NOT IN ('SYSTEM','UNDOTBS1');

SELECT 'ALTER TABLESPACE '|| TABLESPACE_NAME ||' RENAME DATAFILE '||FILE_NAME||' TO S'||FILE_NAME FROM DBA_DATA_FILES WHERE TABLESPACE_NAME NOT IN ('U
NDOTBS1','SYSTEM');


4)LEVANTAR TODOS LOS TABLE ESPACE QUE SE ENCONTRABAN EN OFFLINE

SELECT 'ALTER TABLESPACE '|| TABLESPACE_NAME|| ' ONLINE' FROM DBA_DATA_FILES WHERE TABLESPACE_NAME NOT IN ('SYSTEM','UNDOTBS1');

5) REINICIAR LA BD:
SHUTDOWN IMMEDIATE
STARTUP



////////////////// VARIAS FUNCIONES UTILES /////////////////////////////////////////
set long 1000 PARA VER POR COMPLETO EL TEXTO DE UNA CONSULTA

Funciones SQL
Las funciones SQL permiten mostrar columnas calculadas dentro de sentencias DML (SELECT, INSERT, DELETE y UPDATE).

Funciones de tratamiento numérico

|| Función || Descripción ||

|| ABS( n ) || Retorna el valor absoluto del parámetro. ||
|| CEIL( n ) || Retorna el entero mayor del parámetro. ||
|| FLOOR( n ) || Retorna el entero menor del parámetro. ||
|| MOD( m,n ) || Retorna el resto de la división m/n ||
|| POWER( m,n ) || Retorna mn ||
|| ROUND( m[,n] ) || Retorna m, redondeado a n decimales. Si m se omite es 0. ||
|| SIGN( n ) || Retorna 1 si n es positivo, -1 si negativo y 0 si es 0. ||
|| TRUNC( n[,m] ) || Trunca un número a m decimales. Si m se omite es 0. ||

Funciones de tratamiento alfanumérico Funciones de tratamiento de fechas

|| Función || Descripción ||

|| CHR( n ) || Retorna el carácter equivalente al código n en la tabla de ||
|| || conjunto de caracteres utilizado (ASCII, UNICODE...) ||
|| CONCAT( s1, s2 ) || Concatena dos cadenas de caracteres. Equivalente al operador ||
|| || || ||
|| INITCAP( s ) || Pasa el mayúscula la primera letra de cada palabra ||
|| LOWER( s ) || Pasa a minúsculas toda la cadena de caracteres ||
|| LPAD( s, n ) || Retorna los n primeros caracteres de la cadena s. ||
|| RPAD( s, n ) || Retorna los n últimos caracteres de la cadena s. ||
|| LTRIM( s1[, s2] ) || Elimina todas las ocurrencias de s2 en s1 por la izquierda. Si se ||
|| || omite s2, se eliminarán los espacios. ||
|| RTRIM( s1[, s2] ) || Elimina todas las ocurrencias de s2 en s1 por la derecha. Si se ||
|| || omite s2, se eliminarán los espacios. ||
|| REPLACE( s1, s2, s3 ) || Retorna s1 con cada ocurrencia de s2 reemplazada por s3. ||
|| SUBSTR( s, m, n ) || Retorna los n caracteres de s desde la posición m. ||
|| UPPER( s ) || Pasa a mayúsculas toda la cadena de caracteres ||
|| LENGTH( s ) || Retorna la longitud (en caracteres) de la cadena pasada. ||
|| Función || Descripción || ||
|| ADD_MONTHS( d, n ) || Suma un número (positivo o negativo) de meses fecha. || a una ||
|| LAST_DAY( d ) || Retorna el ultimo día de mes de la fecha pasada. || ||
|| MONTHS_BETWEEN( d1, d2 ) || Retorna la diferencia en meses entre dos fechas. || ||
|| ROUND( d, s ) || Redondea la fecha d según el formato indicado en s. ( || *) ||
|| TRUNC( d, s ) || Trunca la fecha d según el formato indicado en s. (*) || ||

Formatos para ROUND y TRUNC para fechas:

|| Formato || Descripción ||

|| ‘MONTH’, ‘MON’, ‘MM’ || Principio de mes ||
|| ‘DAY’, ‘DY’, ‘D’ || Principio de semana ||
|| ‘YEAR’, ‘YYYY’, ‘Y’ || Principio de año ||

Funciones de grupo

Estas funciones actúan sobre un conjunto de valores, retornando sólo un registro.

|| Función || Descripción ||

|| SUM( valores ) || Retorna la suma. ||
|| AVG( valores ) || Retorna la media aritmética ||
|| MAX( valores ) || Retorna el máximo. ||
|| MIN( valores ) || Retorna el mínimo ||
|| COUNT(valores|* ) || Retorna la cuenta. ||
|| Todas estas funciones permite incluir el modificador DISTINCT delante de la lista de valores para que omita los repetidos. ||

Funciones de conversión

|| Función || Descripción ||

|| CHARTOROWID( s ) || Convierte una cadena en tipo de dato ROWID. ||
|| ROWIDTOCHAR( rowid ) || Convierte un tipo de dato ROWID en cadena de caracteres. ||
|| TO_CHAR( *[, s] ) || Convierte el tipo de dato * en cadena de caracteres. Si * ||
|| || es una fecha, se podrá utilizar la cadena s como formato ||
|| || de conversión. ||
|| TO_DATE( s1[, s2] ) || Convierte la cadena s1 en fecha, conforme al formato de ||
|| || convesión s2. ||
|| TO_NUMBER( s ) || Convierte una cadena de caracteres en valor numérico. ||

Otras funciones

|| Función || || Descripción ||

|| DUMP( columna ) || || Retorna información de almacenamiento para la columna ||
|| || || indicada. ||
|| GREATEST( expr1, expr2 || , ... || Retorna la expresión mayor. ||

/////////////////////////////////////////// PROCEDIMIENTOS /////////////////////////

- CREAR PROCEDIMIENTO

CREATE or replace PROCEDURE AUMENTO (PCT_AUMENTO IN NUMBER)
AS
BEGIN UPDATE EMP_TABLE
SET SAL=SAL+(SAL*(PCT_AUMENTO/100));
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('No hay ningun empleado.');
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Error ejecución.');

[RAISE_APPLICATION_ERROR(-20000,'ERROR: '||SQLCODE); | RAISE;]

END;


- EJEMPLO
NOTA_ PARA ACTIVAR LOS MENSAGES DESDE LA LINEA DE TEXTO HAY QUE PONER EN CONSOLA LA SIGUIENTE LINEA:
set serveroutput on

CREATE OR REPLACE PROCEDURE MIPROCEDIMIENTO(VALOR IN NUMBER)
AS
BEGIN
DECLARE
VALOR2 NUMBER;
NUEVA NUMBER:=0;
BEGIN
SELECT EDAD INTO VALOR2 FROM PRUEBAS WHERE ID=VALOR;
IF VALOR2<30 nueva="1" codigo="5;" codigo="5;" proceso="" execute="" esquema="" name="" param="" pl="" sql_subprogram="" los="" modificadores="" indican="" si="" el="" parametro="" es="" salida="" o="" procedimiento="" con="" de="" procedure="" p1="" table_name="" out="" open="" for="" variable="" refcursor="" exec="" dual="" print="" c="" funciones="" crear="" funcion="" consulta_inventario="" cosa="" precio="" regreso="" inventario="" existe="" tal="" articulo="COSA;" funcion_aumento="" id_emp="" in="" as="" pct_aumento="" into="" emp="" where="" empno="ID_EMP;" exception="" no_data_found="" then="" no="" hay="" ningun="" empleado="" when="" others="" then         ="" error="" para="" ejecutar="" otra="" select="" porcentaje="" from="" ejemplo="" tiwire="" ejemplilloo="" create="" or="" replace="" function="" valor="" number="" is="" begin="" return="" n="" sql=""> var x number;
SQL> exec :x:=ejemplo(5);

Procedimiento PL/SQL terminado correctamente.

SQL> print x;

X
----------
10

//////////////////////////// EXAMENES RESUELTOS //////////////////////////////////
1)REALIZAR IMPORTACION DEL RESPALDOLOGICO
PRIMERO HAY QUE SABER QUE SE ESTA EXPORTANDO, ESTO SE HACE HACIENDO UNA IMPORTACION COMPLETA:
HOST IMP SYSTEM/ABCD FILE=C:\v$audit_hcge.dmp FULL=Y SHOW=Y;

EN ESTE CASO OBSERVAMOS QUE QUEREMOS IMPORTAR UNA TABLA, EN EL MISMORESULTADO PODEMOS VER EL NOMBRE Y DUEÑO DE LA TABLA, POR LO QUE AHORA REALIZAMOS EL RESPALDO DE LA SIGUIENTE MANERA:

HOST IMP SYSTEM/ABCD FILE=C:\v$audit_hcge.dmp FROMUSER=SYS TOUSER=SCOTT TABLES=v$audit_hcge

2)REALIZAR RESPALDO LOGICO DEL ESQUEMA HR
HOST EXP USERID=SYSTEM/ABCD FILE =C:\REPHRAVL.DMP OWNER=HR LOG= HRLOG.LOG;

3)RESPALDO EN FRIO DE LA BD
SHUTDOWN IMMEDIATE
COPIAR CARPETA DE LA INSTANCIA (DEBERA CONTENER ARCHIVOS REDOLOG,DATAFILES Y CONTROLFILES)
COPIAR EL SPFILE Y EL PFILE
COMPRIMIR CARPETA
DAR DE ALTA LA BD
STARTUP

4)ACTIVAR AUDITORIA Y MOSTRAR REGISTROS
CHECAMOS QUE ESTE ACTIVA LA UDITORIA
SHOW PARAMETERS AUDIT_TRAIL=TRUE

SI NO ESTA ACTIVA, ACTIVARLA CON:

SHUTDOWN IMMEDIATE
STARTUP MOUNT
ALTER SYSTEM SET AUDIT_TRAIL=TRUE SCOPE=SPFILE;
SHUTDOWN IMMEDIATE
STARTUP

AUDIT SESSION WHENEVER SUCCESSFUL;
SELECT USERNAME, ACTION_NAME FROM DBA_AUDIT_TRAIL;


5)TRIGGER




6)CALCULAR LAS ESTADISTICAS SOBRE EL SEGMENTO SCOTT.EMP
ANALYZE TABLE SCOTT.EMP COMPUTE STATISTICS;
SELECT TABLE_NAME,CHAIN_CNT FROM ALL_TABLES WHERE CHAIN_CNT>0;

7)OBTENER LOS TABLESPACES DEL SYSTEMA Y SU TAMAÑO:
SELECT TABLESPACE_NAME,SUM(BYTES)/1024/1024 FROM DBA_DATA_FILES GROUP BY TABLESPACE_NAME;



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

PARA EXPORTAR UTILIZANDO QUERIS

exp scott/tiger tables=HR.emp query="where deptno=10"

exp scott/tiger file=abc.dmp tables=abc query=\"where sex=\'f\'\" rows=yes



////////////////////////////////////////// EXEPCIONES //////////////////////////////
set serveroutput on


DECLARE
vprecio inventario.precio%TYPE;
BEGIN
SELECT precio INTO vprecio FROM inventario
WHERE cantidad = 100;


EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('No hay ningún artículo.');
WHEN TOO_MANY_ROWS THEN
DBMS_OUTPUT.PUT_LINE('Hay más de un artículo');
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Error, abortando ejecución.');


END;
[Otras sentencias]
END;



DUP_VAL_ON_INDEX - Se produce cuando se intenta almacenar un valor ya existente en una columna que tiene restricción de índice único.

TIMEOUT_ON_RESOURCE - Se excedió el tiempo máximo de espera por un recurso en Oracle.

NOT_LOGGED_ON - El programa efectuó una llamada a Oracle sin estar conectado.

LOGIN_DENIED - El login o la contraseña utilizados para entrar en Oracle son inválidos.

NO_DATA_FOUND - Una sentencia SELECT INTO no devolvió ningún registro.

TOO_MANY_ROWS - Una sentencia SELECT INTO devolvió más de un registro.

ZERO_DIVIDE - Se ha ejecutado una división donde el divisor valía cero.

STORAGE_ERROR - Si no se dispone de más memoria o la memoria esta dañada.

PROGRAM_ERROR - Ocurrió un problema interno al ejecutar el código PL/SQL.

INVALID_NUMBER - Cuando falla la conversión de una cadena de caracteres hacia un número porque la cadena no representa un número válido.

VALUE_ERROR - Ocurrió un error aritmético, de conversión o truncamiento. Por ejemplo, esto sucede cuando se intenta dar un valor muy grande a una variable que no soporta dicho tamaño.

ROWTYPE_MISMATCH - Los elementos de una asignación (el valor a asignar y la variable que lo contendrá) son de tipos incompatibles. También se presenta este error cuando un parámetro pasado a un subprograma no es del tipo esperado.

SYS_INVALID_ROWID - Falla la conversión de una cadena de caracteres hacia un tipo rowid porque la cadena no representa un número.

INVALID_CURSOR - Se efectuó una operación no válida sobre un cursor. Suele ocurrir cuando un cursor no está abierto y se ejecuta una sentencia para cerrar dicho cursor.

CURSOR_ALREADY_OPEN - Cuando se intenta abrir un cursor que ya estaba abierto. Hay que recordar que un cursor de tipo FOR se abre automáticamente por lo que no se debe ejecutar la sentencia OPEN.

ACCESS_INTO_NULL - Se intentó asignar un valor a los atributos de un objeto no inicializado.

COLLECTION_IS_NULL - Se intentó asignar un valor a una tabla anidada aún no inicializada.

SELF_IS_NULL - El parámetro SELF (el primero que es pasado a un método MEMBER) es nulo.


/////////////////////////// TRIGGERS //////////////////////////////////////////

TRIGGER:


1- Primero seleccionar una tabla como esta:

* create table alukno(nombre varchar(10), salon number);


**********************************************************
2- crear una tabla que va a guardar lo que le manda el trigger


* create table piglet(nombre varchar(10), salon number, salon_nuevo number);


**********************************************************
3- crear trigger:


SQL> create trigger alumno
2 before
3 insert or update of salon
4 on alukno
5 for each row
6 begin
7 insert into piglet values(:old.nombre, :old.salon, :new.salon);
8 end;
9 /


Explicacion:
- (before) puede llevar before o after, segun queramos que se ejecute el trigger antes o despues de
actualizar la tabla.
- (insert or update of salon) especificamos cuando queremos qe se ejecute el trigger y sobre qe
campo.
- (on alukno) le decimos que tabla es la qe esperamos qe se actualice
- (insert into piglet values(:old.nombre, :old.salon, :new.salon);) le4 decimos en qe tabla
va a guardar lo qe especificamos, se pone old qe es lo qe jala de la tabla y qe ya estaba, y
y se pone new qe son los valores nuevos qe cambiamos con el update.


***************************************************************
4- Por ultimo hacer un update a la tabla y verificar qe la nueva tabla contenga un nuevo registro


SQL> select * from alukno;

NOMBRE SALON
---------- ----------
chabela 400
karla 333
ariadna 123


SQL> update alukno set salon=333 where nombre='chabela';

1 fila actualizada.

SQL> select * from alukno;

NOMBRE SALON
---------- ----------
chabela 333
karla 333
ariadna 123

SQL> select * from piglet;

NOMBRE SALON SALON_NUEVO
---------- ---------- -----------
chabela 400 333



- ESTRUCTURA:

CREATE [OR REPLACE] TRIGGER
BEFORE|AFTER
DELETE|INSERT|UPDATE|SELECT
OF COL1,COL2,COL3....
[OR DELETE|INSERT|UPDATE OF COL1,COL2....]
ON TABLE
[REFERENCING OLD AS OLDNAME, NEW AS NEWNAME]
[FOR EACH ROW [WHEN (CONDICION)]]
BEGIN
.
.
.
CODIGO PLSQL;



////////////////////////////////// PLSQL /////////////////////////////////////

IF CONDICION THEN
.
.
.
ELSE
.
.
.END IF;



WHILE CONDICION LOOP
.
.
.
END LOOP;



FOR I IN 1..5 LOOP
.
.
.
END LOOP

///////////////////////////////// CURSORES /////////////////////////////////

DECLARE CURSOR NOMBRE_CURSOR (PARAMETRO)
IS
CONSULTA;

EJEMPLO:

DECLARE CURSOR CVENTAS(CFECHA DATE)
IS
SELECT ARTICULO,VALOR FROM VENTAS WHERE FECHA=CFECHA ORDER BY VALOR DESC;
XARTICULO VENTAS.ARTICULO%TYPE;
XVALOR VENTAS.VALOR%TYPE;

BEGIN
OPEN CVENTAS('11-02-08');//ABRIENDO CURSOR
FOR I IN 1..5 LOOP
FETCH CVENTAS INTO XARTICULO,XVALOR;
EXIT WHEN CVENTAS%NOFOUND;
INSERT INTO VENTAMAYOR VALUES(XARTICULO,XVALOR);
COMMIT;
END LOOP;
CLOSE CVENTAS;// CERRAR CURSOR
END;

/////////////////////////// RESPALDOS LOGICOS //////////////////////////////////////

EXPORT E IMPORT
-OJO PRIMERO PORNER LA BASE DE DATOS EN MODO RESTRICTED:
ALTER SYSTEM ENABLE RESTRICTED SESSION;
ALTER DATABASE RESTRICTED SESSION;


HOST IMP HELP=YES;
HOST EXP HELP=YES;

para import:
inctype=complete -- tipo de exportacion incremental (solo cambios dados en
un lapso de tiempo)
constraints=Y -- exporta los constraints

usar el parametro SHOW para mostrar los archivos que se van a importar

COPIA DEL FICHERO DE CONTROL EN MODO BINARIO
(puede ser copiado mientras la BD está abierta):

ALTER DATABASE BACKUP CONTROLFILE TO 'C:\CTRLFILECOPYBIN.CTL';

COPIA DEL FICHERO DE CONTROL EN MODO TEXTO (SCRIPT)
(puede ser copiado mientras la BD está abierta):
ALTER DATABASE BACKUP CONTROLFILE TO TRACE AS c:\CTRLFILECPYTXT.SQL’;

--------------------------------------------- IMPORT --------------------------------
Importando las tablas de un usuario
imp userid=system file=ventas.dmp fromuser=ventas touser=userx log=ventas.log

Utilizar la copia más reciente del import para restaurar las definiciones del sistema:
$ imp userid=sys/passwd inctype=system full=Y file=export_filename

Poner los segmentos de rollback online.
Importar el fichero de exportación completa más reciente:
$ imp userid=sys/passwd inctype=restore full=Y file=filename

Importar los ficheros de exportación en modo acumulación desde la exportación completa más reciente, en orden cronológico:
$ imp userid=sys/passwd inctype=restore full=Y file=filename

Importar los ficheros de exportación en modo incremental desde la exportación completa o acumulativa más reciente, en orden cronológico:
$ imp userid=sys/passwd inctype=restore full=Y file=filename

IMPORTAR ESQUEMA
IMP USERID=SYSTEM FILE=MINSUPER_JUAN.DMP FROMUSER=ELBUENAS TOUSER=JUAN_EL_TRAIDOR SHOW=Y;
IMP USERID=ELBUENAS/BUENAS FILE=MINSUPER_JUAN.DMP FROMUSER=ELBUENAS TOUSER=JUAN_EL_TRAIDOR SHOW=Y;

IMPORTAR TABLAS DE USUARIO

IMP USERID=SYSTEM/SYSTEM@CONEXIONNUEVA FILE=C:\EXPORTA.DMP FROMUSER
(ORIGEN)VENTAS TOUSER ALQUESEPASAUSERS TABLES CLIENTES ROWS=N LOG=LOGOLD.LOG


BACKUP LOGICO
//OJO PRIMERO PORNER LA BASE DE DATOS EN MODO RESTRICTED
alter system enable restricted session
SHUTDOWN
STARTUP RESTRICT
alter database default temporary tablespace temp;
DESDE MS-DOS
IMP HELP=YES;
EXP HELP=YES;
exp userid=system/itt2006@itt2006 full=yes file=itt2006.dmb

------------------------------------------ EXPORT ----------------------------------

-RESPALDO COMPLETO:
EXP USERID=SYSTEM INCTYPE=COMPLETE FILE=C:\NOMBRE.DAT FULL=Y LOG=LOG_NOMBRE.LOG

-Respaldar los objetos de un usuario:
Indicamos que haremos el respaldo con usuario system y exportar todos los
objetos en los que el dueño sea ventas.

HOST exp userid=system owner=ventas file=ventas.dmp log=ventas.log


-EXPORTAR TABLAS DE UNA BD:

HOST exp userid=system file=ventas_ventas.dmp tables=(ventas.ventas,ventas.productos,ventas.proveedores) log=ventas.log


-ACOMULATIVA (OBJETOS CREADOS DEPUES DEL ULTIMO EXPORT)
EXP userid=system/manager full=y inctype=cumulative constraints=Y file=cumulative_export_filename


INCREMENTAL(OBJETOS MODIFICADOS O CREADOS DESDE ULTIMO EXPORT)
Exp userid=system/manager full=y inctype=incremental constraints=Y file=incremental_export_filename

FULL EXPORT (TODA LA BD)
EXP USERID=SYSTEM FILE = MINSUPER.DMP FULL=YES LOG= MINSUPER.LOG;
//DONDE SYSTEM ES UN USUARIO CON PRIVS DE SYSDBA

TODA LA BASE
EXP userid=system/manager full=y inctype=complete constraints=Y file=full_export_filename;

OBJECT EXPORT (SOLO UN OBJETO)
EXP USERID=SYSTEM FILE = MINSUPER_ELBUENAS_MARACAS.DMP
TABLES=ELBUENAS.MARACAS LOG= MINSUPER_ELBUENAS_MARACAS.LOG;

USER EXPORT (SOLO UN ESQUEMA)
EXP USERID=SYSTEM FILE = MINSUPER_JUAN.DMP OWNER=JUAN LOG= MINSUPER_JUAN.LOG;


BACKUP MAS OPTIMO
Activar el modo ARCHIVELOG:
CHECAR QUE NO ESTE ACTIVO: SELECT LOG_MODE FROM V$DATABASE;
SHUTDOWN IMMEDIATE
STARTUP MOUNT
ALTER DATABASE ARCHIVELOG;
SELECT LOG_MODE FROM V$DATABASE;
ALTER SYSTEM SET LOG_ARCHIVE_FORMAT='%S.ARC' SCOPE=SPFILE;
ALTER SYSTEM SET LOG_ARCHIVE_DEST='C:\' SCOPE=SPFILE;
ALTER SYSTEM SET LOG_ARCHIVE_START=TRUE SCOPE=SPFILE;
SHUTDOWN IMMEDIATE
STARTUP
ALTER SYSTEM SWITCH LOGFILE;
Realizar un backup al menos una vez a la semana si la BD se puede parar. En otro caso, realizar backups en caliente cada día.
Copiar todos los ficheros redo log archivados cada cuatro horas. El tamaño y el número de ellos dependerá de la tasa de transacciones.
Efectuar un export de la BD semanalmente en modo RESTRICT.

///////////////////// RESPALDOS EN CALIENTE Y FRIO ////////////////////////////


-------------------------- RESPALDO EN FRIO -----------------------------

CONN SYSTEM
SELECT LOG_MODE FROM V$DATABASE;
SHOW PARAMETER LOG_ARCHIVE_START;

SHUTDOWN IMMEDIATE
STARTUP MOUNT
ALTER DATABASE ARCHIVELOG;
SELECT LOG_MODE FROM V$DATABASE;
ALTER SYSTEM SET LOG_ARCHIVE_FORMAT='%S.ARC' SCOPE=SPFILE;
ALTER SYSTEM SET LOG_ARCHIVE_DEST='C:\' SCOPE=SPFILE;
ALTER SYSTEM SET LOG_ARCHIVE_START=TRUE SCOPE=SPFILE;
SHUTDOWN IMMEDIATE
STARTUP
ALTER SYSTEM SWITCH LOGFILE;

1. Listar los datafiles, controlfiles y logfiles. Esto se hace ejecutando:
select file_name from dba_datafiles;
select name from v$controlfile;
select member from v$logfile;
2. Ejecutar un shutdown normal o inmediato de la base de datos.
3. Copiar con un utilitario del sistema operativo todos los archivos listados en el paso 1 hacia un medio de backup preferido como cinta, disco duro, otra máquina, etc.



--------------------------- RESPALDO EN CALIENTE ----------------------------------

BACKUP EN CALIENTE (SE HACE POR CADA TSPACE A RESPALDAR)
ALTER TABLESPACE TS_USERS BEGIN BACKUP;
COPIAMOS EL ARCHIVO FISICAMENTE A LA DIRECCION DESEADA
ALTER TABLESPACE TB_USERS END BACKUP;
ALTER SYSTEM SWITCH LOGFILE;
HACEMOS RESPALDO DE LOS ARCHIVOS DE CONTROL:
ALTER DATABASE BACKUP CONTROLFILE TO TRACE AS 'C:\RESPCONTROLFILE.SQL';



SELECT LOG_MODE FROM V$DATABASE;
SHUTDOWN NORMAL;
STARTUP MOUNT;
ALTER DATABASE ARCHIVELOG;
ALTER DATABASE OPEN;
SELECT LOG_MODE FROM V$DATABASE;
SHOW PARAMETER LOG_ARCHIVE_START;
ALTER SYSTEM SET LOG_ARCHIVE_DEST='C:\ARCHIVE\' SCOPE=BOTH;
ALTER SYSTEM SET LOG_ARCHIVE_START=TRUE SCOPE=SPFILE;
ALTER TABLESPACE USERS BEGIN BACKUP;
HOST COPY C:\oracle\oradata\minsuper\users01.DBF C:\backup;
ALTER TABLESPACE USERS END BACKUP;
ALTER SYSTEM SWITCH LOGFILE;
ALTER DATABASE BACKUP CONTROLFILE TO TRACE AS ‘C:\CTRLFILECOPYTXT.SQL’;

SCRIPT QUE HACE BACKUP EN CALIENTE DE TODOS LOS TSPACE
SELECT 'ALTER TABLESPACE '||TABLESPACE_NAME||'BEGIN BACKUP; HOST COPY '||FILE_NAME||' C:\BACKUP ‘FROM DBA_DATA_FILES;

///////////////////////////// RECUPERACION /////////////////////////////////

RECUPERAR DE UN TABLESPACE (la parte que no se usa de la bd puede estar abierta pero el ts a recuperarse debe estar en offline)
RECOVER FROM redologfile TABLESPACE nom_ts

RECUPERAR DE UN DATAFILE(bd abierta (si es el de system debe estar la bd en modo mount Y fichero en offline)
RECOVER FROM redologfile DATAFILE ruta+nom_datafile
SQL> alter database datafile 'c:\oracle\oradata\salab07\USERS01.dbf' OFFLINE;
SQL> RECOVER datafile 'c:\oracle\oradata\salab07\USERS01.dbf';
SQL> alter database datafile 'c:\oracle\oradata\salab07\USERS01.dbf' ONLINE;

CREACION DE UN FICHERO DE CONTROL (cuando se pierde)
//bd en estado nomount
CREATE CONTROL FILE

RECUPERAR REDOLOG POR DIA
ARCHIVE LOG LIST;

MANTENER CONTROLFILE A SALVO
alter database backup controlfile to trace;

FORZAR A UN CHECKPOINT (OBLIGANDO QUE TRANSACCIONES SE ESCRIBAN EN LA BD)
ALTER SYSTEM LOG FILE;
ALTER SYSTEM CHECKPOINT LOCAL;
ALTER SYSTEM CHECKPOINT GLOBAL;

APLICACION DEL REDOLOG
Cuando una BD se arranca con el comando startup, la BD pasa por los estados nomount, mount y open. En este tercer
estado, se verifica que se pueden abrir todos los ficheros de log y de datos. Si la BD se arranca por primera vez
después de una caida, se necesitará efectuar una recuperación que consiste en dos pasos: avanzar la BD hacia adelante
aplicando los registros redo log, deshacer las transacciones no confirmadas.

RECUPERACION INCOMPLETA Y LEVANTAR BASE
ALTER DATABASE OPEN RESETLOGS;

RECUPERACION

bd modo archive;
bd mount

RECOVER [AUTOMATIC] [FROM 'localizacion'] [VALOR] nombre_valor
[UNTIL CANCEL]
[UNTIL TIME fecha]
[UNTIL CHANGE entero]
[USING BACKUP CONTROLFILE] donde valor puede ser de un datafile, de la bd completa o del redo != al log_archive_dest)
UNTIL CANCEL recuperar un redo log cada vez, parando cuando se teclea CANCEL.
UNTIL TIME recuperar hasta un instante dado dentro de un fichero de redo log
UNTIL CHANGE recuperar hasta un SCN dado.
USING BACKUP CONTROLFILE utiliza una copia de seguridad del fichero de control para gobernar la recuperación.


//////////////////////////////////////// AUDITORIA ////////////////////////////
1) COMPROBAR SI ESTA HABILITADA LA AUDITORIA:
SHOW PARAMETERS AUDIT_TRAIL
SI NO ESTA ACTIVADA HACER:
SHUTDOWN IMMEDIATE
STARTUP MOUNT
ALTER SYSTEM SET AUDIT_TRAIL=TRUE SCOPE=SPFILE;
SHUTDOWN IMMEDIATE
STARTUP

- PARA VER LOS USUARIOS CON PRIVILEGIOS DE AUDITSYSTEM Y AUDIT ANY
SELECT * FROM DBA_SYS_PRIVS WHERE PRIVILEGE='AUDIT ANY';
SELECT * FROM DBA_SYS_PRIVS WHERE PRIVILEGE='AUDIT SYSTEM';

-PARA AUDITAR TODAS LAS CONEXIONES EXITOSAS Y FALLIDAS
AUDIT SESSION;

2)ABRIR SESSION CON DOS USUARIOS DIFERENTES. COMPROBAR QUE INFORMACION SE AH GUARDADO EN LA AUDITORIA Y CONSULTAR
DBA_AUDIT_TRAIL

SELECT USERNAME, ACTION_NAME FROM DBA_AUDIT_TRAIL;

-PARA AUDITAR CONECCIONES DE PRUEBA1 Y PRUEBA2 HACER:

AUDIT SESSION BY PRUEBA1, PRUEBA2;

-AUDITAR SELECT TABLE,DELETE TABLE PARA CUALQUIER CASO

AUDIT SELECT TABLE,DELETE TABLE, UPDATE TABLE, INSERT TABLE BY SCOOT;

VER TABLA DBA_STMT_AUDIT PARA CHECAR LAS OPCIONES ACTIVAS
SELECT USER_NAME USUARIO,AUDIT_OPTION OPCION, SUCCESS, FAILURE FROM DBA_STMT_AUDIT_OPTS ORDER BY USER_NAME;

ESPECIFICAR OPCIONES DE AUDITORIA PARA OBJETOS CREADOS EN UN FUTURO, DE FORMA QUE REGISTRARA INFORMACION SIEMPRE QUE SE HAGA UN ALTER, GRANT,INSERT,UPDATE O DELETE
AUDIT ALTER,GRANT,INSERT,UPDATE,DELETE ON DEFAULT;
PARA VERIFICAR:
SELECT * FROM ALL_DEF_AUDIT_OPTS;

-PARA DESACTIVAR LA AUDITORIA DE SESSIONES:
NOAUDIT SESSION;
NOAUDIT SESSION BY PRUEBA1,PRUEBA2;
NOAUDIT SELECT TABLE,INSERT TABLE,DELETE TABLE BY SCOTT;
NOAUDIT ALL ON DEFAULT;
HACER PARA VERIFICAR:
SELECT USER_NAME USUARIO,AUDIT_OPTION OPCION, SUCCESS, FAILURE FROM DBA_STMT_AUDIT_OPTS ORDER BY USER_NAME,AUDIT_OPTION;

ACTIVAR AUDITORIA PARA CUALQUIER OPERACION EN UNA TABLA:

AUDIT SELECT,INSERT,DELETE ON SCOTT.CODIGOS_NOTAS;


AUDITORIAS
AUDIT {DELETE||UPDATE||INSERT} (ON ESQUEMA.NOM_TABLE|| ANY TABLE U OBJETO);
AUDIT create any trigger;
AUDIT SELECT ON emi.orders;
AUDIT ALL ON Juan.productos BY ACCESS;
AUDIT ALL ON esquema.tabla BY { ACCESS || SESSION };

audit table;
noaudit table;

DE UN USUARIO:
audit table by perez;
TABLA
audit insert on perez.emp;
audit delete on perez.emp by access


AUDITANDO AL USUARIO SYS

________________________________________________________________________________________________
PARAMETROS: SELECT name, value FROM gv$parameter WHERE name LIKE '%audit%';
________________________________________________________________________________________________
MODIFICAR: ALTER SYSTEM SET audit_sys_operations=TRUE COMMENT='Begin auditing SYS' SCOPE=SPFILE;
shutdown immediate
startup


PARA AUDITORIA POR SISTEMA
VISTAS
DESC SYS.AUD$
ALL_DEF_AUDIT_OPTS
DBA_STMT_AUDIT_OPTS
DBA_PRIV_AUDIT_OPTS
DBA_OBJ_AUDIT_OPTS
DBA_AUDIT_TRAIL
DBA_AUDIT_EXISTS
DBA_AUDIT_OBJECT
DBA_AUDIT_SESSION
DBA_AUDIT_STATEMENT


PROBLEMAS CON TABLESPACE SYSTEM POR AUMENTO DE TAMAÑO

ALTER SYSTEM SET audit_trail='XML' COMMENT='Audit trail as XML' SCOPE=SPFILE;
shutdown immediate
startup

ALTER SYSTEM SET audit_trail='db' COMMENT='Change auditing to sys.aud$' SCOPE=SPFILE;

NONE Deshabilita la auditoría
BD Habilita la auditoría, escribiendo en la tabla SYS.AUD$.
OS Habilita la auditoría, dejando al SO su gestión.

____________________________________________________________________________________________________________________
____________________________________________________________________________________________________________________

SESIONES

SVRMGR> audit session;

Para determinar si se deben registrar sólo los éxitos, o sólo los fracasos se pueden utilizar los siguientes comandos:
____________________________________________________________________________________________________________________

audit session;
audit session whenever successful; (EXITOS)
audit session whenever not successful; (FRACASOS)

SELECT USERID, USERHOST,TERMINAL FROM SYS.AUD$;
____________________________________________________________________________________________________________________

select
os_username, /* nombre de usuario SO */
username, /* nombre de usuario BD */
terminal,
decode(returncode,'0','Conectado',
'1005','Solo username, sin password',
'1017','Password incorrecto',
returncode), /* comprobacion de error */
to_char(timestamp,'DD-MON-YY HH24:MI:SS'), /* hora de entrada */
to_char(logoff_time,'DD-MON-YY HH24:MI:SS') /* hora de salida */
from dba_audit_session;

noaudit session;

ACCIONES SOBRE SYS.ADU$
audit all on sys.aud$ by access;

DEFINIR GUIA DE AUDITORIA
ALTER SYSTEM SET AUDIT_TRAIL = TRUE SCOPE = SPFILE;
SHUTDOWN IMMEDIATE;
STARTUP;


////////////////////////////////////////////// CADENA DE CONEXION //////////////////////////////////////////
PARA HACER LA CADENA DE CONEXION MANUALMENTE
BUSCAR ARCHIVO TNSNAMES.ORA Y MODIFICAR UN BLOQUE P.E:

ALFONSO=
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.103.123)(PORT = 1521))
)
(CONNECT_DATA =
(SID=EXFINAL)
(SERVER = DEDICATED)

)
)

Y CONECTARSE DESDE CONSOLA CON:
CONN SYSTEM/ABCD @ALFONSO
PARA CONECTARSE A OTRA MAQUINA Y EXPORTAR TABLAS:
HOST EXP USERID=SYSTEM/ABCD@ALFONSO TABLES=SYSTEM.ABEL,SCOTT.EMP FILE='C:\ARCHIVO3.DMP' LOG='C:\MMDA.LOG';
PARA EXPORTAS ESQUEMAS
HOST EXP USERID=SYSTEM/ABCD@ALFONSO OWNER=SYSTEM FILE='C:\ARCHIVO.DMP' LOG='C:\MMDA.LOG';

PARA DESCONECTARTE HACER:
DISCONN

///////////////////////////////// PLAN DE EJECUCION ////////////////////////////////


1)CREAR TABLA PLAN_TABLE MEDIANTE EL SCRIPT UTLXPLAN.SQL

2)PONER: SET AUTOTRACE ON
ESTO VERIFICA LA CORRECTA CREACION DE LA TABLA

3)CREAMOS SINONIMO DE TABLA: CREATE PUBLIC SYNONYM plan_table FOR plan_table;

4)ASIGNARLE PRIVILEGIOS PUBLICOS A LA TABLA: GRANT ALL ON plan_table TO public

5)ACTIVAR ROL PLUSTRACE CON EL ARCHIVO PLUSTRCE.SQL

6)ASIGNAR ESTE ROL PRIVILEGIOS PUBLICOS: GRANT plustrace TO PUBLIC;
SET AUTOTRACE OFF;

7)VERIFICAR QUE LOS DEMAS USUARIOS YA PUEDAN TENER ACCESOS DESDE PUBLIC

8)VERIFICAMOS EL CAMPO COSTO Y OPTIMIZAMOS Y VOLVEMOS A CHECAR EL CAMPO PARA VER SI SE REDUCIO Y NUESTRA OPTIMIZACION FUNCIONO.





PÀRA un tabla;
explain plan for select * from tablauno;

PARA PLAN DE EJECUCION
La diferencia es que la información del plan se muestra después de completarse la consulta mientras que la información de salida de explain plan se genera sin llegar a ejecutar el comando.


//El Explain plan nos permite llenar la tabla PLAN_TABLE creda con datos sobre el plan de ejecución de la consulta en una tabla del esquema.
Explain plan Set Statement_Id= ‘TEST’ For Select * from EMP Where sal>’0’;

//Checarlo con
SELECT ID,TIMESTAMP,CPU_COST,COST,IO_COST,OPERATION FROM PLAN_TABLE WHERE STATEMENT_ID=‘TEST’;




SET AUTOTRACE OFF
No genera el reporte (default).

SET AUTOTRACE ON EXPLAIN
Muestra la ruta de ejecución de la consulta.

SET AUTOTRACE ON STATISTICS
Muestra solo las estadísticas de la ejecución de la consuta.

SET AUTOTRACE ON
Reporta las rutas y estadisticas de ejecución de la consulta.

SET AUTOTRACE TRACEONLY
Elimina la salida de la consulta.

SET AUTOTRACE ON
Genera reporte.

//En sTATISTICS tambien podemos observar el numero de bytes
enviados/recibidos por la red
//en base a el "peso" de la consulta

////////////////////////////////// ESTADISTICAS //////////////////////////////

CHECA TODA LA BD:
Exec DBMS_utility.analyze_database(‘COMPUTE’);

- Calcula estadisticas sobre un esquema
Exec DBMS_utility.analyze_schema(‘HR’,’compute’);

- Calcula estadisticas sobre una tabla
Analyze table ser_esc.alumnos compute statistics;

- Verificar si hay migración de datos
Select table_name,chain_cnt from all_tables where chain_cnt>0;


Ejecutar como sysdba este package el cual nos da informacion estadistica
hacerca de la B.D

connect / as sysdba
exec DBMS_UTILITY.ANALYZE_DATABASE('COMPUTE');

EXEC DBMS_UTILITY.ANALYZE_SCHEMA('SCOTT','COMPUTE');

/HACER CONSULTA

SELECT table_name,chain_cnt FROM all_tables WHERE CHAIN_CNT>0;


CHAIN_CNT>0 son la tablas que se deberian de reconstruir por que tienen
bloques enlazados
moviendola de TSpace y regresarlas a su TS

ANALIZAR ESTADISTICAS DE TABLA
EXEC DBMS_STATS.gather_table_stats('SCOTT', 'EMPLOYEES');


ANALIZAR ESTADISTICAS DE ESQUEMA
EXEC DBMS_STATS.gather_schema_stats('SCOTT');

ANALIZAR ESTADISTICAS DE LA BD. COMPLETA
EXEC DBMS_STATS.gather_database_stats;

ANALIZAR UNA TABLA Y SU INDICE
ANALYZE TABLE employees COMPUTE STATISTICS; Select table_name,chain_cnt from all_tables where chain_cnt>0;
ANALYZE INDEX employees_pk COMPUTE STATISTICS;

ANALIZAR LA BD. COMPLETA
EXEC DBMS_UTILITY.analyze_database('COMPUTE');

Indices Funcionales
//Sirven para crear índices a partir de condiciones//QUERY REWRITE y el parámetro QUERY_REWRITE_ENABLED en true.
Create index emp_upper_name on employees(upper(name))

MOVER INDICE A OTRO TSPACE
ALTER INDEX CLIENTE.SYS_C003006 REBUILD TABLESPACE nomts COMPUTE STATISTICS;

VERIFICAR INDICES DE UN USUARIO
SELECT INDEX_NAME, OWNER,STATUS, TABLESPACE_NAME FROM DBA_INDEXES WHERE OWNER = 'CLIENTE';

RECONSTRUIR INDICES (REINDEXAR)
//lo correcto es tener un ts_d para las tablas y un ts_x para los indices
pero de no existir ambos irian al mismo. (LOS INDICES NO SE PUEDEN COMPRIMIR COMO LAS TABLAS SOLO SE RECONSTRUYEN)
ALTER INDEX ser_esc.hist_eval_docente_pk REBUILD TABLESPACE ser_escx COMPUTE STATISTICS;

SENTENCIA PARA RECONSTRUIR INDICES INUTILIZABLES
SELECT 'DEBES DE HACER UN ALTER INDEX '||OWNER||'.'||INDEX_NAME||' REBUILD TABLESPACE '||TABLESPACE_NAME ||'COMPUTE STATISTICS'|| FROM DBA_INDEXES WHERE STATUS = 'UNUSABLE';


CREAR INDICE SIMPLE
//Cuando el campo no es unique
CREATE INDEX index_name ON table_name (column_name);

CREAR INDICE UNICO
//2 registros no pueden tener el mismo valor de indice (usarlo en campos que son unique).
CREATE UNIQUE INDEX index_name ON table_name (column_name);




//////////////////////////////// FRAGMENTACION ///////////////////////


1-SELECT count(1) FROM SYS.FET$;

2)VER LAS TABLAS QUE NECESITAN RECREARSE

select substr(owner,1,20) own, substr(table_name,1,30) tabla, chain_cnt from dba_tables
where owner not in ('SYS','SYSTEM','OUTLN') and chain_cnt>0;


-- Colapsar todos los tablespaces
select 'PROMPT Colapsando el tablespace '||tablespace_name||' alter tablespace '||tablespace_name||' coalesce;' from dba_tablespaces where tablespace_name !='TEMP';

-- ver la fragmentacion
select substr(owner, 1,20) own, substr(table_name,1,30) tabla, substr(tablespace_name,1,20) tbspace, chain_cnt from dba_tables where owner not in ('SYS','SYSTEM','OUTLN') and chain_cnt > 0;

-- desfragmentacion: mover a otro tablespace la tabla
alter table biblioteca.ejemplares move tablespace se_paso;

-- Regresar las tablas al tablespace original
alter table biblioteca.ejemplares move tablespace bibliotecad;

-- Verificar los indices que quedaron no utilizables:
select index_name, owner, tablespace_name from dba_indexes where status='UNUSABLE';

-- Reconstruir estos indices:
alter index ser_esc.HIST_EVAL_DOCENTE_PK rebuild tablespace SER_ESCx compute statistics;

-- scripts mover segmentos

Spool c:\mover.sql
select 'alter table '||owner||'.'||table_name||' move tablespace se_paso;'
From dba_tables where chain_cnt>0 and owner not in ('SYS','SYSTEM','OUTLN');
Spool off;

-- regresa segmentos
Spool c:\regresar.sql
select 'alter table '||owner||'.'||table_name||' move tablespace '||tablespace_name||';'
from dba_tables where chain_cnt>0 and owner not in ('SYS','SYSTEM','OUTLN');
Spool off;

Reconstruir Indices
select 'alter index '||owner||'.'||index_name|| ' rebuild tablespace example compute statistics;'
from dba_indexes where status='UNUSABLE';

-- Ejecutar el script:
@mover.sql
-- Y después :
@regresar.sql

Indices que no podemos usar:
select index_name, owner, tablespace_name from dba_indexes where status='UNUSABLE';

--------------- estos son unos comando para generar los scripts que mueven los TB de la BD---------------------------------------------------------------------------

/////////////////////////////////MOVER///////////////////////////////////////////////////
select 'alter table '||owner||'.'||table_name||' move tablespace se_paso;'
from dba_tables where chain_cnt>0 and owner not in ('SYS', 'SYSTEM', 'OUTLN');



//////////////////////////////////REGRESAR////////////////////////////////////////////////
select 'alter table '||owner||'.'||table_name||' move tablespace '||tablespace_name||';'
from dba_tables where chain_cnt>0 and owner not in ('SYS', 'SYSTEM', 'OUTLN');



/////////////////////////HACER UN SCRIP QUE RECONSTRUYA LOS INDICES//////////////////////
select 'alter index'||table_owner||'.'||index_name||'rebuild' from dba_indexes where status='UNUSABLE' and owner not in ('SYS','SYSTEM','OUTLN');

----------------- estos son las intrucciones parta mover las tablas de la bd y asi generar la fragmentacion de la misma -------------------------------------


<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>


Primero verificamos si existe fragmentación:


select count(1) from sys.fet$;

COUNT(1)
----------
0


NOTA: Recordar que la fragmentación sólo existe en Oracle 8i

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


Para ver que tablas necesitamos recrear, usamos el CHAIN_CNT:

select substr(owner,1,20) own, substr(table_name,1,30) tabla, chain_cnt
from dba_tables where owner not in('SYS','SYSTEM','OUTLN') and chain_cnt>0;

OWN TABLA CHAIN_CNT
-------------------- ------------------------------ ----------
PM ONLINE_MEDIA 7
PM PRINT_MEDIA 2
SH PROMOTIONS 68
SH CUSTOMERS 2460
SH PRODUCTS 35


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


checamos indices que no podemos usar:

select index_name, owner, tablespace_name from dba_indexes where status='UNUSABLE';


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


Creamos un tb de paso para mover las tablas, y luego regresarlas a su tb original y reconstruir sus indices:

create tablespace de_paso datafile 'c:\oracle\oradata\itt2006\de_paso.dbf' size 100M;


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


--> Creamos el script para mover las tablas, y lo guardamos en un archivo para despues ejecutarlo:

select 'alter table '||owner||'.'||table_name||' move tablespace de_paso;'
from dba_tables where owner not in('SYS','SYSTEM','OUTLN') and chain_cnt>0;

'ALTERTABLE'||OWNER||'.'||TABLE_NAME||'MOVETABLESPACEDE_PASO;'
--------------------------------------------------------------------------------
alter table PM.PRINT_MEDIA move tablespace de_paso;
alter table SH.PROMOTIONS move tablespace de_paso;
alter table SH.CUSTOMERS move tablespace de_paso;
alter table SH.PRODUCTS move tablespace de_paso;


Nota: No ejecutar sino hasta después de crear el script para regresar las tablas


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


--> Después creamos el script para regresar las tablas:

select 'alter table '||owner||'.'||table_name||' move tablespace '||tablespace_name||';'
from dba_tables where owner not in('SYS','SYSTEM','OUTLN') and chain_cnt>0;

'ALTERTABLE'||OWNER||'.'||TABLE_NAME||'MOVETABLESPACE'||TABLESPACE_NAME||';'
--------------------------------------------------------------------------------
alter table PM.PRINT_MEDIA move tablespace EXAMPLE;
alter table SH.PROMOTIONS move tablespace EXAMPLE;
alter table SH.CUSTOMERS move tablespace EXAMPLE;
alter table SH.PRODUCTS move tablespace EXAMPLE;


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


--> Ejecutamos el script para mover las tablas:

@c:\mover.sql

alter table PM.PRINT_MEDIA move tablespace de_paso
*
ERROR at line 1:
ORA-00997: illegal use of LONG datatype


NOTA: El error que aparece es porque pm.print.media no se puede mover porque contiene imagenes


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


--> Ejecutamos el script para regresar las tablas:

@c:\regresar.sql

alter table PM.PRINT_MEDIA move tablespace EXAMPLE
*
ERROR at line 1:
ORA-00997: illegal use of LONG datatype


NOTA: El error que marca es porque esa tabla no la movimos y por lo tanto no la podemos regresar


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


--> Por lo tanto la única tabla que nos queda para reconstruir es la de imagenes:

select substr(owner,1,20) own, substr(table_name,1,30) tabla, chain_cnt, tablespace_name
from dba_tables where owner not in('SYS','SYSTEM','OUTLN') and chain_cnt>0;


OWN TABLA CHAIN_CNT
-------------------- ------------------------------ ----------
TABLESPACE_NAME
------------------------------
PM PRINT_MEDIA 2
EXAMPLE




--> Esta consulta también puede ser así:

select substr(owner,1,20) own, substr(table_name,1,30) tabla, chain_cnt, substr(tablespace_name,1,20) tablespace
from dba_tables where owner not in('SYS','SYSTEM','OUTLN') and chain_cnt>0;


OWN TABLA CHAIN_CNT
-------------------- ------------------------------ ----------
TABLESPACE
--------------------
PM PRINT_MEDIA 2
EXAMPLE


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


--> Ahora nos marca que no podemos usar los indices de las tablas que reconstruimos:

select index_name, owner, tablespace_name from dba_indexes where status='UNUSABLE';


INDEX_NAME OWNER
------------------------------ ------------------------------
TABLESPACE_NAME
------------------------------
ONLINEMEDIA_PK PM
EXAMPLE


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


--> Por lo tanto hacemos un script para reconstruir los indices:

select 'alter index '||owner||'.'||index_name|| ' rebuild tablespace example compute statistics;'
from dba_indexes where status='UNUSABLE';


'ALTERINDEX'||OWNER||'.'||INDEX_NAME||'REBUILDTABLESPACEEXAMPLECOMPUTESTATISTICS

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

alter index PM.ONLINEMEDIA_PK rebuild tablespace example compute statistics;
alter index SH.PROMO_PK rebuild tablespace example compute statistics;
alter index SH.CUSTOMERS_PK rebuild tablespace example compute statistics;
alter index SH.PRODUCTS_PK rebuild tablespace example compute statistics;


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


--> Lo ejecutamos:

@c:\reconstruir_indices.sql



--> Y ya no tenemos ningún indice unusable:

select index_name, owner, tablespace_name from dba_indexes where status='UNUSABLE';

no rows selected


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


y bueno por el momento de oracle es todo, espero que les sirva y ya saben cualquier duda pregunten sin temor y por favor no dejen de participar y complementar esta informacion que seguro le falta mucho. bye

MySQL en Debian

Hola pues aqui otro rapidito tutorial de como instalar mysql en el S.O debian, es muy sencillo pero espero que les sirva :)

#para instalar mysql3.23.56, entramos en el directorio donde se encuentra nuestro paquete y lo descomprimimos.
cd /opt
tar -xvzf mysql-3.23.58.tar.gz

#creamos una nueva carpeta
mkdir /opt/mysql
cd mysql-3.23.58

#configuramos las opciones de instalacion del mysql, hay mas si quieren saberlas solo chequen el manual de instalacion que viene dentro del mismo paquete, el prefix como siempre es para darle la ruta donde se instalara el mysql, en este caso en la carpeta que creamos con anterioridad. :)
./configure --without-debug --prefix=/opt/mysql

#compilamos MySQL
make

#eh instalamos
make install

#creamos un usuario para el mysql, se le pone -m para que nos cree las variables de ambiente, si estas en otra distro diferente a debian y sus hijos, no es necesario poner esta -m.

useradd -m mysql -g root

#creamos la base de datos default
cd /opt/mysql/bin
./mysql_install_db

#cambiar permisos para el usuario
chown -R mysql /opt/mysql/var

#iniciamos el demonio de MySQL
cd /opt/mysql/bin
./safe_mysqld &

#asignamos un password para el administrador en este caso root
./mysqladmin -u root password '123456'

#para que el usuario root pueda entrar desde el localhost
./mysqladmin -u root -p -h localhost password '123456'

#accesamos a la linea de comandos de mysql
./mysql -u root -p

#salimos de la linea de comando
exit

#damos de baja la base de datos con
./mysqladmin shutdown -p

Y listoooooo!!!!!!
espero que este sencillo tutorial les alla servido un poco. :)

Apache SSL en linux

Bueno aqui les dejo un pequeño tutorial de como instalar apache seguro version 1.3.37 bajo el sistema operativo linux, espero que les sea de utilidad:

nota: para instalar solamente apache se descomprime el archivo, se configura con su ./configure [ parametros que se quieran modificarp.e --prefix=/www/micarpeta/apache], se compila la informacion con make y se instala con make install, facil no??? :)


ahora bien para instalar apache seguro o tambien llamado ssl se deben de seguir algunos pasos mas que detallo acontinuacion:

nota2: Esta instalacion se hizo en un SO tipo Debian, por lo cual se usaron paquetes .tar, en caso de que tengas paquetes .rpm recuerda que estos en distribuciones debian solo funcionan usando el programa alien y en otras distribuciones tales como Fedora o Suse que son S.O que si admiten estos paquetes, basta con darles doble click para instalarlos ya que la naturaleza de estos paquetes es como la de cualquier ejecutable en windows, solo que no olvides que el usar este tipo de paquetes te limita a la hora de configurar los detalles de la instalacion, pero esto a fin de cuentas es tu eleccion :).

1)#copiar todos los paquetes de apache ssl y php a una carpeta en /www
cd /home/abel/todoliga/
cp apache_1.3.37.tar.gz openssl-0.9.8d.tar.gz mod_ssl-2.8.28-1.3.37.tar.gz /www



2)#nos dirigimos a la carpeta donde copiamos los paquetes, en este caso:
cd /www


3)#descomprimiendo archivos
tar -xvzf apache_1.3.37.tar.gz
tar -xvzf openssl-0.9.8d.tar.gz
tar -xvzf mod_ssl-2.8.28-1.3.37.tar.gz


4)#instalar las librerias openssl, estas deben de instalarse primero que todo ya que estas librerias son las que buscara el apache para poderse instalar como apache ssl.

#entramos en la carpeta
cd openssl-0.9.8d
#configuramos las opciones de instalacion
./config --prefix=/www/openssl-0.9.8d
#compilamos librerias
make
#instalamos librerias openssl
make install


5)#pasamos ahora a configurar la liga mod_ssl que es el vinculo que nos unira a las librerias openssl y al servidor apache.

#entramos en la carpeta
cd /www/mod_ssl-2.8.28-1.3.37

#configuramos las opciones de instalacion, aqui le decimos que me habilite el modulo ssl para el sistema operativo,
que me habilite la comparticion de librerias ssl
habilite el modulo proxy (este si no se bien para que sea pero siempre lo ponen)
indicamos la ubicacion de la carpeta de apache descomprimida
indicamos la hubicaccion de las librerias ssl
y por ultimo le decimos donde se instalara la liga en este caso en /www


./configure --enable-module=so --enable-shared=ssl --enable-module=proxy --with-apache=/www/apache_1.3.37 --with-ssl=/www/openssl-0.9.8d --prefix=/www

#vamos a la carpeta de apache
cd /www/apache_1.3.37

#compilamos apache
make

#creamos el certificado por medio de:
make certificate
#llenamos los datos del certificado segun nuestro gusto :P

#instalamos apache ssl
make install

OTROS TIPS
#iniciamos el demonios de apache con cd /www/bin
#./apachectl start

#y lo detenemos con./apachectl stop

#iniciamos apache seguro con ./apachectl startssl

#e igual lo detenemos con ./apachectl stop

#el archivo de configuracion de apache es el vim /www/conf/httpd.conf

#Verifica que tenga habilitado el port 80, y los Listen 80 y 443 esto es revisando el archivo de configuracion httpd.conf.

#ServerName nombredelservidor que esta linea exista si no la agregamos


#para correr el apache normal (port 80) desde un navegador solo hay que poner http:\\nombre del host

#para arrancar el apachessl https:\\nombre del host:443, el :443 puede ir o no ir, se volvera obligatorio si cambiamos
#o agragamos puertos al apachessl


espero que les sirva y cualquier problema que se les presente no duden en preguntar, eso si que sean distros dependientes de debian tal como ubuntu, kubuntu y todas sus variedades :P.bye

Monk




Alguna vez a lo largo de nuestra vida a todos creo yo nos ah dado una mania como la de trapear bien el piso hasta que todo quede perfectamente limpio, o la de verificar 5 o 6 veces que una puerta este bien cerrada o tal vez les alla pasado que en un piso rustico no quieras tocar las franjas que lo dividen ahora imaginense todas lamanias posibles juntas en una sola persona y no cualquier persona si no un fabuloso policia (bueno ex-policia) pues bien esa es la descripcion de Adrian Monk, una fantastica y divertida serie donde muchos encontraremos seguramente alguna de nuestras manias caracterizadas por este singular detective, bueno la serie pesa 100M por capitulo, y se encuentra en la gran comunidad de vagos asi que si tienen curiosodad chequen este link:

http://vagos.wamba.com/showthread.php?t=321664