martes, 28 de diciembre de 2010

Backup Automático en Sql Server Express

El sql server express es una herramienta muy útil, desafortunadamente no cuenta con el sql server agent, asi que ¿como hacer para programar los backups automáticos?
 Lo haremos utilizando El programador de tareas de windows y el OSQL

1. Lo primero sera crear un dispositivo de backup para nuestra base de datos de prueba.


2.Lo segundo crear el script para realizar el backup a través de la utilidad OSQL (Object Structured Query Language), este script lo ponemos en un archivo con extension  .bat
 Osql -S Nombre_Servidor -U Login(p.ejemplo sa)  -P clave -Q "backup database Prueba to BKP_Pruebas WITH INIT,NOUNLOAD"

3.Finalmente ponemos en el programador de tareas de windows. :)




lunes, 27 de diciembre de 2010

Autonomous Transaction


Es una funcionalidad del PL/SQL en la cual un subprograma puede actuar independientepemente de la transacción que lo contiene.




Miremos como funciona con este ejemplo ....

CREATE TABLE tabla1 (campo int);
CREATE TABLE tabla2 (campo int);
CREATE SEQUENCE secuencia_s ;


/* Este es un trigger normal de inserción, si la transaccion se deshace,
se deshace la insercion en la tabla2 */

CREATE OR REPLACE TRIGGER pa_trigger
AFTER INSERT ON tabla1 FOR EACH ROW
DECLARE
 i PLS_INTEGER;
BEGIN
  select secuencia_s.nextval into i from dual;
  INSERT INTO tabla2
  VALUES
  (i);
END;
 

INSERT INTO tabla1 VALUES (1);
SELECT COUNT(*) FROM tabla1;
count(*)
1
SELECT COUNT(*) FROM tabla2;
count(*)
1
Rollback;
SELECT COUNT(*) FROM tabla1;
count(*)
0
SELECT COUNT(*) FROM tabla2;
count(*)
0


Ahora miremoslo con la transacción autónoma

CREATE OR REPLACE TRIGGER PA_trigger
AFTER INSERT ON tabla1 FOR EACH ROW
DECLARE
  PRAGMA AUTONOMOUS_TRANSACTION;
 i PLS_INTEGER;
BEGIN
  select secuencia_s.nextval into i from dual;
  INSERT INTO tabla2
  VALUES
  (i);
  COMMIT;
END;

/*Realizamos la inserción */
 INSERT INTO tabla1 VALUES (1);
SELECT COUNT(*) FROM tabla1;
count(*)
1
SELECT COUNT(*) FROM tabla2;
count(*)
1

/* si deshacemos la transacción  de la tabla1 */
Rollback;
SELECT COUNT(*) FROM tabla1;
count(*)
0


/* la transacción de la tabla2 quedara confirmada, Es ideal para  manejar logs */
SELECT COUNT(*) FROM tabla2;
count(*)
1

jueves, 16 de diciembre de 2010

Controlando el Acceso a los Datos A través de Vistas

A veces necesitamos controlar el acceso a los datos por columnas o filas, esto se puede realizar fácilmente a través de Vistas. 
En este caso asumiremos que no podemos crear la vista con el dueño del esquema,crearemos  dos usuarios, uno llamado us_consulta que contendrá una  vista del esquema scott y otro llamado us_con_clerk que tendrá solo permisos sobre la vista.

C:\oraclexe>sqlplus / as sysdba
SQL*Plus: Release 10.2.0.1.0 - Production on Wed Dec 15 13:38:44 2010
Copyright (c) 1982, 2005, Oracle.  All rights reserved.
Connected to:
Oracle Database 10g Express Edition Release 10.2.0.1.0 - Production

--- Creamos los dos usuarios ---
SQL> create user us_consulta identified by  consulta;
User created.
SQL> create user us_cons_clerk identified by consulta;
User created.

--- Asignamos Permisos ---
SQL> grant create session to us_consulta;
Grant succeeded.
SQL> grant create view to us_consulta,us_cons_clerk ;
Grant succeeded.   

--- Le damos permiso sobre la tabla emp al usuario us_consulta
--- ES muy importante otorgar el permiso con with grant option
--- Para que el usuario us_consulta pueda otorgar el permiso sobre la vista
--- a Otros usuarios
c:\> scott/tiger
SQL> grant select on emp to us_consulta with grant option;
Grant succeeded.

--- Creamos la vista, filtrada por donde necesitamos
SQL> connect us_consulta/consulta
Connected.
SQL> create view VW_CLERK as select * from scott.emp where job='CLERK';
View created.
-- Asignamos permiso
SQL> grant select on vw_clerk to us_cons_clerk;
Grant succeeded.

--- Ya el usuario tiene permiso sobre los datos pero filtrados
SQL> connect us_cons_clerk/consulta
Connected.
SQL> select empno, ename, job, hiredate, sal
  2  from us_consulta.vw_clerk;

     EMPNO ENAME      JOB       HIREDATE         SAL
---------- ---------- --------- --------- ----------
      7369 SMITH      CLERK     17-DEC-80        800
      7876 ADAMS      CLERK     23-MAY-87       1100
      7900 JAMES      CLERK     03-DEC-81        950
      7934 MILLER     CLERK     23-JAN-82       1300

sábado, 27 de noviembre de 2010

Acucobol + Oracle

Aún en esta época nos encontramos con instalaciones de Cobol, que soportan ambientes de producción, es por eso que me he visto en la necesidad de conectar oracle con Acucobol, para quienes tengan esta misma necesidad, aquí va una ayuda.

1. Lo primero es que debemos contar con un driver para Acucobol , Microfocus ofrece uno muy interesante. (http://www.microfocus.com/products/micro-focus-developer/extend/acu4GL.aspx)

Una vez instalado el driver configuramos el Oracle Heterogeneos Services que es una tecnología ofrecida por Oracle para conectar bases de datos no-Oracle, así que no solo permite conectar ambientes cobol, también nos sirve para SQL server, Excel, Access etc.

2.Crear  el ODBC  con el Drriver AcuODBC Drivers, especificando donde se encuentran los datos y los archivos XFD



3.Modificar el listener .ora que se encuentra en la ruta C:\oraclexe\app\oracle\product\10.2.0\server\NETWORK\ADMIN  , agregar la entrada del ODBC
SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = PLSExtProc)
      (ORACLE_HOME = C:\oraclexe\app\oracle\product\10.2.0\server)
      (PROGRAM = extproc)
    )
    (SID_DESC =
      (SID_NAME = ACUODBC)
      (ORACLE_HOME = C:\oracle\product\10.2.0\db_1)
      (PROGRAM = hsodbc)
    )

    (SID_DESC =
      (SID_NAME = CLRExtProc)
      (ORACLE_HOME = C:\oraclexe\app\oracle\product\10.2.0\server)
      (PROGRAM = extproc)
    )
  )

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC_FOR_XE))
      (ADDRESS = (PROTOCOL = TCP)(HOST = Pruebas)(PORT = 1522))
    )
  )
DEFAULT_SERVICE_LISTENER = (XE)

4.Adicionar en el Tnsnames.ora la entrada del acucobol, el SID= el nombre del ODBC creado en el punto 1 
 
Acucobol=
  (DESCRIPTION=
    (ADDRESS=(PROTOCOL=TCP)(HOST=Pruebas)(PORT=1522))
    (CONNECT_DATA=(SID=Acucobol))
    (HS=OK)
  )

5.Crear el archivo init.ora en la ruta C:\oraclexe\app\oracle\product\10.2.0\server\hs\admin, el archivo debe llamase init + NomODBC  + .ora relacionado en el punto uno (initAcucobol.ora), puede tomar el archivo de ejemplo inithsodbc.ora y modificar el nombre y las entradas.


# This is a sample agent init file that contains the HS parameters that are
# needed for an ODBC Agent.
# HS init parameters
HS_FDS_CONNECT_INFO = Acucobol
HS_FDS_TRACE_LEVEL = OFF
# Environment variables required for the non-Oracle system
#set <envvar>=<value>

En la variable HS_FDS_CONNECT_INFO  debe colorcase el nombre del ODBC creado en el punto 1.

6.Ya estamos listos para probar nuestro servicio de acucobol, bajamos el  listener

C:\oraclexe\app\oracle\product\10.2.0\server\BIN>lsnrctl stop
LSNRCTL for 32-bit Windows: Version 10.2.0.1.0 - Production
Copyright (c) 1991, 2005, Oracle.  All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC_FOR_XE)))
The command completed successfully

7.Subimos el listener y debemos ver la entrada que creamos con el nombre ACUCOBOL
C:\oraclexe\app\oracle\product\10.2.0\server\BIN>lsnrctl start
LSNRCTL for 32-bit Windows: Version 10.2.0.1.0 - Production
Copyright (c) 1991, 2005, Oracle.  All rights reserved.
Starting tnslsnr: please wait...
TNSLSNR for 32-bit Windows: Version 10.2.0.1.0 - Production
System parameter file is C:\oraclexe\app\oracle\product\10.2.0\server\network\ad
min\listener.ora
Log messages written to C:\oraclexe\app\oracle\product\10.2.0\server\network\log
\listener.log
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(PIPENAME=\\.\pipe\EXTPROC_FOR
_XEipc)))
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=Pruebas)(PORT=1522)))

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC_FOR_XE)))
STATUS of the LISTENER
------------------------
Alias                       LISTENER
Version                   TNSLSNR for 32-bit Windows: Version 10.2.0.1.0
Start Date               17-NOV
Uptime                    0 days 0 hr. 0 min. 2 sec
Trace Level              off
Security                   ON: Local OS Authentication
SNMP                      OFF
Default Service         XE
Listener Parameter File  C:\oraclexe\app\oracle\product\10.2.0\server\network\a
dmin\listener.ora
Listener Log File        C:\oraclexe\app\oracle\product\10.2.0\server\network\l
og\listener.log
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(PIPENAME=\\.\pipe\EXTPROC_FOR_XEipc)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=Pruebas)(PORT=1522)))
Services Summary...
Service "ACUCOBOL" has 1 instance(s).
  Instance "ACUCOBOL", status UNKNOWN, has 1 handler(s) for this service...
Service "CLRExtProc" has 1 instance(s).
  Instance "CLRExtProc", status UNKNOWN, has 1 handler(s) for this service...
Service "PLSExtProc" has 1 instance(s).
  Instance "PLSExtProc", status UNKNOWN, has 1 handler(s) for this service...
The command completed successfully

8.Ingresamos como un usuario y creamos el data base link

C:\oraclexe>sqlplus pruebas/pruebas@XE
SQL*Plus: Release 10.2.0.1.0 - Production on Sat Nov 27 12:01:30 2010
Copyright (c) 1982, 2005, Oracle.  All rights reserved.
Connected to:
Oracle Database 10g Express Edition Release 10.2.0.1.0 - Production
SQL> create database link Acucobol using 'Acucobol';
Database link created.

8.Ahora hacemos una prueba sencilla para usar el dblink creado
SQL> select count(*) from all_tables@Acucobol;
  COUNT(*)
----------
       135

Estamos listos para llamar a cualquier tabla del acuodbc que contenga una describicion XFD



viernes, 26 de noviembre de 2010

Cambiando Charater Set en Oracle XE

Hace unos días instale la base de datos XE, por defecto el character set es AL32UTF8, necesitaba uno diferente , el instalador no me deja cambiar los parametros, que hacer?

la solucion que encontre , fue muy sencilla

1. Instalar la Base de Datos XE
2. Borrar la Base de datos
3. Crear manualmente la Base de datos con el caracter que necesitaba

4. Crear paquetes, utilitarios y esquemas de
administracion y Listo!!




Crear Archivo de Pfile
Antes de borrar la base de datos debemos sacar una copia de los parametros del sistema
que necesitariamos mas adelante.

C:\oraclexe\app\oracle\product\10.2.0\server\bin\sqlplus / as sysdba
SQL> create pfile='c:\temp\pfilexe.ora' from spfile;
File created.
Borrar la Base de Datos

rem Ingresamos al Sql plus
C:\oraclexe\app\oracle\product\10.2.0\server\bin\sqlplus / as sysdba
SQL*Plus: Release 10.2.0.1.0 - Production on Fri Nov  2010
Copyright (c) 1982, 2005, Oracle.  All rights reserved.
rem  Bajamos la base de datos
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
rem  Montamos la base de datos en modo exlusivo
SQL> startup mount exclusive
ORACLE instance started.
Total System Global Area  805306368 bytes
Fixed Size                  1289996 bytes
Variable Size             209715444 bytes
Database Buffers          591396864 bytes
Redo Buffers                2904064 bytes
Database mounted.
SQL>alter system enable restricted session;
rem borramos la base de datos
SQL> drop database;
SQL> base de datos borrada;
SQL>Desconectadode Oracle Database

Crear Base de Datos Manual  con usuarios sys

C:\oraclexe\app\oracle\product\10.2.0\server\bin\sqlplus / as sysdba
SQL>startup nomount pfile='c:\temp\pfilexe.ora'
SQL>spool CreaBDD.log

SQL> create database XE
 character set "WE8ISO8859P1" 
 datafile
 'C:\oraclexe\oradata\tbs_SYSTEM_BD_01.dbf' size 340M
  autoextend on next 5M maxsize 5000M
  extent management local
 logfile
  group 1 ('C:\oraclexe\oradata\redo_DB_1.log') size 5M,
  group 2 ('C:\oraclexe\oradata\redo_DB_2.log') size 5M,
  group 3 ('C:\oraclexe\oradata\redo_DB_3.log') size 5M
 SYSAUX datafile 'C:\oraclexe\oradata\sysaux_DB_01.dbf'
        size 400M reuse autoextend ON NEXT  5M MAXsize UNLIMITED
 undo tablespace UNDO
 datafile 'C:\oraclexe\oradata\ts_UNDO_DB_01.dbf' size 90M
 default temporary tablespace TMP
 tempfile 'C:\oraclexe\oradata\ts_TMP_DB.dbf' size 20M
 extent management local uniform size 1M
 maxlogfiles    20
 maxlogmembers  5
 maxdatafiles   500
 maxinstances   2;

SQL>rem creación de catalogo, vistas, sinonimos de la Base de Datos
SQL>@C:\oraclexe\app\oracle\product\10.2.0\server\RDBMS\ADMIN\catalog.sql

SQL>rem creación de catalogo de procedimientos almacenados,paquetes y utilitarios
SQL>@C:\oraclexe\app\oracle\product\10.2.0\server\RDBMS\ADMIN\catproc.sql

SQL>rem creación de synonimos de diccionario de datos
SQL>@C:\oraclexe\app\oracle\product\10.2.0\server\RDBMS\ADMIN\catdbsyn.sql
SQL>spool off;

crear el archivo spfile y subir la base de datos con el spfile
SQL>create spfile from pfile='c:\temp\pfilexe.ora';
SQL>shutdown immediate;
SQL>startup ;

Visual Basic 6.0 + Windows 7

Aunque este blog esta dedicado a las bases de datos, no podía dejar pasar este pequeño error con visual basic 6.0  en Windows 7.0 , cuando ejecutamos el programa. error "ActiveX component can't create object"


Este error  puede ocurrir por 2 razones
1. Faltan las dll asociadas al programa (recomendaría ejecutar los instaladores)

2. No se encuentra instalada la maquina virtual java de Microsoft para x86.


Cuando realices estas dos cosas muy probablemente tu error habrá desaparecido.


La maquina virtual de Microsoft la puedes encontrar en los instaladores de Visual Basic
si no, descárgala de aqui:

 Descargar MSJAVX86