jueves, 30 de agosto de 2012

Usuarios y privilegios en Oracle

1. Crear Usuarios y asignar privilegios en Oracle
El siguiente es un resumen de algunas consideraciones al momento de crear un usuario o cuenta en Oracle, y los privilegios y roles que le podemos asignar.
  • El nombre de usuario no debe superar 30 caracteres, no debe tener caracteres especiales y debe iniciar con una letra.
  • Un método de autentificación. El mas común es una clave o password, pero Oracle 10g soporta otros métodos (como biometric, certificado y autentificación por medio de token).
  • Un Tablespace default, el cual es donde el usuario va a poder crear sus objetos por defecto, sin embargo, esto no significa que pueda crear objetos, o que tenga una cuota de espacio. Estos permisos se asignan de forma separada, salvo si utiliza el privilegio RESOURCE el que asigna una quota unlimited, incluso en el Tablespace SYSTEM!  Sin embargo si esto ocurre, ud. puede posteriormente mover los objetos creados en  el SYSTEM a otro Tablespace.
  • Un Tablespace temporal, donde el usuario crea sus objetos temporales y hace los sort u ordenamientos.
  • Un perfil o profile de usuario, que son las restricciones que puede tener su cuenta (opcional).
Por ejemplo, conectado como el usuario SYS, creamos un usuario y su clave asi:
SQL> CREATE USER ahernandez IDENTIFIED BY ahz
         DEFAULT TABLESPACE users;
Si no se indica un Tablespace por defecto, el usuario toma el que está definido en la BD (generalmente el SYSTEM). Para modificar el Tablespace default de un usuario se hace de la siguiente manera:
SQL> ALTER USER jperez DEFAULT TABLESPACE datos;
También podemos asignar a los usuarios un Tablespace temporal donde se almacenan operaciones de ordenamiento. Estas incluyen las cláusulas ORDER BY, GROUP BY, SELECT DISTINCT, MERGE JOIN, o CREATE INDEX (también es utilizado cuando se crean Tablas temporales).
SQL> CREATE USER jperez IDENTIFIED BY jpz
DEFAULT TABLESPACE users
TEMPORARY TABLESPACE temp;
Adicionalmente,  a cada usuario se puede asignar a un profile o perfil, que tiene dos propósitos principalmente:
  • Limita el uso de recursos,  lo que es recomendable, por ejemplo en ambientes de Desarrollo
  • Garantiza y refuerza reglas de Seguridad a nivel de cuentas
Ejemplos, cuando se crea el usuario o asignar un perfil existente:
SQL> CREATE USER jperez IDENTIFIED BY jpz
DEFAULT TABLESPACE users
TEMPORARY TABLESPACE temp
PROFILE resource_profile;
SQL> ALTER USER jperez
PROFILE perfil_desa;
2. Eliminar un Usuario de la Base de Datos
Para eliminar un usuario de la BD se hace uso de la clausula DROP USER y opcionalmente se puede utilizar CASCADE, para decirle que también elimine todos los objetos creados por ese usuario.
SQL> DROP USER jperez CASCADE;
3. Modificar cuentas de Usuarios
Para modificar un usuario creado, por ejemplo cambiar su clave, tenemos la sintáxis:
SQL> ALTER USER NOMBRE_USUARIO
 IDENTIFIED BY CLAVE_ACCESO
[DEFAULT TABLESPACE ESPACIO_TABLA]
[TEMPORARY TABLESPACE ESPACIO_TABLA]
[QUOTA {ENTERO {K | M } | UNLIMITED } ON ESPACIO_TABLA
[PROFILE PERFIL];
4. Privilegios de Sistema y de Objetos
En Oracle existen dos tipos de privilegios de usuario.
4.1 System: Que permite al usuario hacer ciertas tareas sobre la BD, como por ejemplo crear un Tablespace. Estos permisos son otorgados por el administrador o por alguien que haya recibido el permiso para administrar ese tipo de privilegio. Existen como 100 tipos distintos de privilegios de este tipo.
En general los permisos de sistema, permiten ejecutar comandos del tipo DDL (Data definition Language), como CREATE, ALTER y DROP o del tipo DML (Data Manipulation Language). Oracle 10g tiene mas de 170 privilegios de sistema los cuales pueden ser vistos consultando la vista: SYSTEM_PRIVILEGE_MAP
Entre todos los privilegios de sistema que existen, hay dos que son los importantes: SYSDBA y SYSOPER. Estos son dados a otros usuarios que serán administradores de base de datos.
Para otorgar varios permisos a la vez, se hace de la siguiente manera:
SQL> GRANT CREATE USER, ALTER USER, DROP USER TO ahernandez;
4.2 Object: Este tipo de permiso le permite al usuario realizar ciertas acciones en objetos de la BD, como una Tabla, Vista, un Procedure o Función, etc.  Si a un usuario no se le dan estos permisos sólo puede acceder a sus propios objetos (véase USER_OBJECTS). Este tipo de permisos los da el owner o dueño del objeto, el administrador o alguien que haya recibido este permiso explícitamente (con Grant Option).
Por ejemplo, para otorgar permisos a una tabla Ventas para un usuario particular:
SQL> GRANT SELECT,INSERT,UPDATE, ON analista.venta TO jperez;
Adicionalmente, podemos restringir los DML a una columna de la tabla mencionada. Si quisieramos que este usuario pueda dar permisos sobre la tabla Factura a otros usuarios, utilizamos la cláusula WITH GRANT OPTION. Ejemplo:
SQL> GRANT SELECT,INSERT,UPDATE,DELETE ON venta TO mgarcia WITH GRANT OPTION;
5. Asignar cuotas a Usuarios
Por defecto ningun usuario tiene cuota en los Tablespaces y se tienen tres opciones para poder proveer a un usuario de una quota:
5.1Sin limite, que permite al usuario usar todo el espacio disponible de un Tablespace.
5.2 Por medio de un valor, que puede ser en kilobytes o megabytes que el usuario puede usar. Este valor puede ser mayor o nenor que el tamaño del Tablespace asignado a él.
5.3 Por medio del privilegio UNLIMITED TABLESPACE, se tiene prioridad sobre cualquier cuota dada en un Tablespace por lo que tienen disponibilidad de todo el espacio incluyendo en SYSTEM y SYSAUX.
No se recomienda dar cuotas a los usuarios en los Tablespaces SYSTEM y SYSAUX, pues tipicamente sólo los usuarios SYS y SYSTEM pueden crear objetos en éstos. Tampoco dar cuotas en los Tablespaces Temporal o del tipo Undo.
6. Roles
Finalmente los Roles, que son simplemente un conjunto de privilegios que se pueden otorgar a un usuario o a otro Rol. De esa forma se simplifica el trabajo del DBA en esta tarea.
Por default cuando creamos un usuario desde el Enterprise Manager se le asigna el permiso de connect, lo que permite al usuario conectarse a la BD y crear sus propios objetos en su propio esquema. De otra manera, debemos asignarlos en forma manual.
Para crear un Rol y asignarlo a un usuario se hace de la siguiente manera:
SQL> CREATE ROLE appl_dba;
Opcionalmente, se puede asignar una clave al Rol:
SQL> SET ROLE appl_dba IDENTIFIED BY app_pwd;
Para asignar este Rol a un usuario:
SQL> GRANT appl_dba TO jperez;
Otro uso común de los roles es asignarles privilegios a nivel de Objetos, por ejemplo en una Tabla de Facturas en donde sólo queremos que se puedan hacer Querys e Inserts:
SQL> CREATE ROLE consulta;
SQL> GRANT SELECT,INSERT on analista.factura TO consulta;
Y finalmente asignamos ese rol con este “perfil” a distintos usuarios finales:
SQL> GRANT consulta TO ahernandez;
Nota: Existen algunos roles predefinidos, tales como:
CONNECT, CREATE SESSION, CREATE TABLE, CREATE VIEW, CREATE SYNONYM, CREATE SEQUENCE, CREATE DATABASE LINK, CREATE CLUSTER,
ALTER SESSION, RESOURCE, CREATE PROCEDURE, CREATE SEQUENCE, CREATE TRIGGER, CREATE TYPE, CREATE CLUSTER, CREATE INDEXTYPE, CREATE OPERATOR SCHEDULER, CREATE ANY JOB, CREATE JOB, EXECUTE ANY CLASS, EXECUTE ANY PROGRAM,
MANAGE SCHEDULER, etc.
DBA: Tiene la mayoría de los privilegios, no es recomendable asignarlo a usuarios que no son administradores.
SELECT_CATALOG_ROLE: No tiene privilegios de sistema, pero tiene cerca de 1600 privilegios de objeto.
Para consultar los roles definidos y los privilegios otorgados a través de ellos, utilize las vistas:
SQL> select * from DBA_ROLES;
SQL> select * from DBA_ROLE_PRIVS order by GRANTEE;
Etiquetas: ,

miércoles, 29 de agosto de 2012

Consultas en bases de datos SQL Server


Para realizar una consulta a una base de datos SQL Server, realizaremos lo siguiente como lo veremos en el ejemplo:

using System;
using System.Data;
using System.Data.SqlClient;

class Program
{
    static void Main()
    {
        string connectionString =
            "Data Source=(local);Initial Catalog=Northwind;"
            + "Integrated Security=true";

        // Provide the query string with a parameter placeholder.
        string queryString =
            "SELECT ProductID, UnitPrice, ProductName from dbo.products "
                + "WHERE UnitPrice > @pricePoint "
                + "ORDER BY UnitPrice DESC;";

        // Specify the parameter value.
        int paramValue = 5;

        // Create and open the connection in a using block. This
        // ensures that all resources will be closed and disposed
        // when the code exits.
        using (SqlConnection connection =
            new SqlConnection(connectionString))
        {
            // Create the Command and Parameter objects.
            SqlCommand command = new SqlCommand(queryString, connection);
            command.Parameters.AddWithValue("@pricePoint", paramValue);

            // Open the connection in a try/catch block.
            // Create and execute the DataReader, writing the result
            // set to the console window.
            try
            {
                connection.Open();
                SqlDataReader reader = command.ExecuteReader();
                while (reader.Read())
                {
                    Console.WriteLine("\t{0}\t{1}\t{2}",
                        reader[0], reader[1], reader[2]);
                }
                reader.Close();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            Console.ReadLine();
        }
    }

lunes, 27 de agosto de 2012

SECUENCIAS EN ORACLE (PARA SIMULAR EL AUTOINCREMENTO) CONCEPTO

muestra cómo utilizar las secuencias de Oracle para simular el tipo de datos autoincremento de otros motores de bases de datos (Access, MySQL, Paradox, DBase, etc). Incluye ejemplos en SQL utlizando el comando  create sequence
Mediante las secuencias, Oracle puede proporcionar una lista consecutiva de números unívocos que sirve para simplificar las tareas de programación. La primera vez que una consulta llama a una secuencia, se devuelve un valor predeterminado. En las sucesivas consultas se obtendrá un valor incrementado según el tipo de incremento especificado. Las secuencias pueden ser útiles, por ejemplo, para simular el tipo de datos AUTOINCREMENTO de Paradox, Access y MySQL.
¿Cómo crear una secuencia mediante SQL?
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)