Insertar datos en una vista

Posted by Miguel Egea | Posted in Relacional | Posted on 23-05-2013

0

Hay mucha gente que cree que las vistas en SQL Server son de solo lectura por naturaleza, la verdad es que no es así, se pueden administrar, dar permisos de insert, select, update y no importa si las vistas tienen joins, si la consulta se puede resolver, (puede averiguarse a cual de las tablas del join van los datos) también se puede insertar, aquí teneis un ejemplo de como funciona

use test
go
create login test with password='Contraseña01'
go
create user test 
go
create table demoinsertvistas(id int identity(1,1) not null primary key, descripcion varchar(10))
go
create view vw_demoinsertvistas as select * from demoinsertvistas
go
grant select on demoinsertvistas to test
go
setuser 'test'
go
insert into demoinsertvistas values ('test')
 
/*
Msg 229, Level 14, State 5, Line 1
The INSERT permission was denied on the object 'demoinsertvistas', database 'test', schema 'dbo'.
*/
go
select * from demoinsertvistas
go
setuser
go
grant insert on demoinsertvistas to test
grant select,insert on vw_demoinsertvistas to test
go
setuser 'test'
insert into demoinsertvistas values ('test')
insert into vw_demoinsertvistas values ('test 2')
go
Select * from demoinsertvistas

Video con conceptos básicos

Posted by Miguel Egea | Posted in Basicos Newsgroup, Relacional | Posted on 18-05-2013

0

De mi charla en Gusenet hace un mes.. espero que os guste.
https://drive.google.com/folderview?id=0B4jb4DhnTRGRRm1NZzd1aUtNcmM&usp=sharing

 

Trigger Sencillo

Posted by Miguel Egea | Posted in Relacional | Posted on 07-05-2013

0

Hace unos dias me mandaban este correo.

 

Hago una consulta a esta tabla

select * from Saldos

 

La cual me arroja los siguientes resultados

T015_idComercio T015_saldo
201735 0.00
201735 0.00
201735 0.00
201735 0.00
201758 0.00
201758 0.00
201758 0.00

 

Cree una tabla con la siguiente estructura

create table Activaciones(Cid int, BloqueoB bit, BloqueoV bit, Bloqueo bit)

Realizar un Trigger que se ejecute cada vez que se inserte un nuevo T015_idComercio

De la tabla Saldos , que ese T015_idComercio se inserte mediante el Trigger en la tabla Activaciones del campo Cid

Y aquí está la solución.

create table saldos (T015_idComercio int, saldo numeric(18,2))
go
create table Activaciones(Cid int, BloqueoB bit, BloqueoV bit, Bloqueo bit)
go
create trigger tr_saldos on saldos for insert,update 
as begin
 merge into Activaciones as target
   using (select distinct t015_idcomercio from inserted) as source on target.cid=source.t015_idcomercio
   when not matched then
    insert values (source.t015_idcomercio,0,0,0);
 
end
go
 
insert into saldos values (201735	,0.00),
(201735	,0.00),
(201735	,0.00),
(201735	,0.00),
(201758	,0.00),
(201758	,0.00),
(201758	,0.00)
go
select * from saldos
select * from Activaciones

Recorriendo árboles

Posted by admin | Posted in Relacional | Posted on 02-05-2013

0

Ayer un amigo me preguntaba por como recorrer un árbol en orden, particularmente cuando puedes hacer movimientos de hojas completas, y le mandé este ejemplo

create table arbol (ID INT IDENTITY NOT NULL primary key,
NAME NVARCHAR(50) NOT NULl,
PARENT_ID INT NULL
);

Creada la tabla le insertamos algunos valores a modo de ejemplo

insert into arbol values ('nodo padre',null),('nodo hijo A',1),('nodo hijo B',1),('nodo hijo A-A',2),('nodo hijo A-B',2),('nodo hijo A-C',2);

Y ahora la función Recursiva que lo recorre. La primera de las partes indica la condición de entrada (where parent_id is null), tras el union all hacemos referencia a nosotros mismos entrando en modo recursivo, hasta que se acaben los elementos, es decir hasta llegar a las hojas.
El único truco está que que añadimos la ruta que vamos recorrriendo, concatenando el identificador en cada uno de esos pasos recursivos

with ObtenerArbol(ID,NAME,PARENT_ID, ruta)   as
(select folders.ID,folders.NAME,folders.PARENT_ID, cast(cast(id as varchar)+ '->' as varchar(5000)) ruta  From arbol folders 
 where PARENT_ID is null   
 union ALL 
   select f.ID,f.NAME,f.PARENT_ID,  cast(ruta + cast(f.id as varchar) + '->' as varchar(5000)) from arbol f   
 inner join ObtenerArbol mc on f.PARENT_ID=mc.ID )
 select * from ObtenerArbol ORDER BY ruta

Ahora movemos un nodo de posición

update arbol set PARENT_ID=3 where id=2

Y volvemos a sacar el árbol

Renovar las pilas

Posted by Miguel Egea | Posted in Noticias | Posted on 23-11-2012

4

Acabo de volver del evento #estechday y el community day que organiza Microsoft Ibérica para MVP’s de España y portugal, además de para invitados que han destacado por su trabajo para la comunidad técnica de Microsoft. Mi compañero y amigo Salva Ramos acaba de dejarme en casa, Pedro Hurtado se quedó en la estación del Carmen y Miguel López nos abandonó en Albacete para disfrutar de su familia.

Quizá os pregunteis que estoy haciendo, creé este sitio con mi amigo y ahora empleado de Microsoft Argentina Emilio Boucau hace más años de los que me gustaría reconocer, y no hay ni un solo artículo que no sea técnico (salvo error u omisión), o como mucho noticia técnica. Pero la verdad es que estoy haciendo lo que me pide el cuerpo, que es reflexionar sobre Microsoft, sobre tecnología sobre amigos y sobre la maravillosa comunidad que tanto me ha dado y a la que espero haber aportado, aunque sea solo un poquito.

Hace 11 años, recibí una llamada de Microsoft, no estoy muy seguro de si fué Alberto Amescua, entonces MVP lead, o si fué otra persona, solo sé que me puse a saltar (literalmente) de alegría por la oficina de la empresa donde trabajaba (todos informáticos) diciendo, ¡soy mvp! ¡soy MVP!, dice el título que me dió Microsoft que fué en 2001. El primer “Community day” en el que estuve, los invitados eramos un total de 5 si mal no recuerdo, Svetlana, Julian peris, Tella, Amengual y un servidor cenamos en un restaurante que yo no me puedo permitir y hablamos de tecnología. Estaba Alberto Amescua y me hizo sentir en mi casa, le daba un valor a la tarea que haciamos que ni yo mismo creía que tuviera. La velada estuvo llena de anécdotas.  Antes en el tren a madrid, el mismo tren del que me acabo de bajar, me encontré con mi amiga Teresa (que tampoco sabía que era un MVP) que iba a ver al que hoy es su marido, Pedro, que me llevó al restaurante.

De esa semilla, alimentada por gente como Alfonso Rodriguez, David Carmona, Murillo , y nuestra actual MVP Lead Cristina (que maja, y que hijos mas guapos), nació el evento de ayer. Que yo conozca a la familia de Alfonso,  que sienta mía la compañia más “odiada” por informáticos y personajes varios es culpa de vosotros, gente de Microsoft, que lejos de formalismos, sabeis que lo importante siguen siendo las personas. David Salgado hizo 120 kilos en sentadillas (su peso), que no es relevante para lo que sabe de Visual Studio, pero que si dice que tiene entre esta gente gran parte de sus amigos, creo que yo soy uno de ellos.. así lo siento.

Fué un dia de reencuentros, no pudimos excomulgar a Paniagua, pero si nos reimos con él. Estuve con Pep Lluis, cacharreando con chips para encender y apagar cositas, descubriendo el .NET MicroFramework http://netmf.codeplex.com/releases/view/82448 , hablé de foros con mi amigo y también MVP de SQL server como yo Alberto López. Me reí con Palel, (no sabemos hacer cables palel, hay que reconocerlo), disfruté con el Guille, que para mi sorpresa sigue siendo de Neja (Nerja en malagueño), fumé con Lluis Franco, la verdad es que seguro que me olvido de la mitad de los que estuve hablando.. no os enfadéis.. os quiero igual :)

Con Chema Alonso, disfruté de una charla de seguridad, divertida como siempre, espeluznante, porque hay que saber mucho para estar protegido y .. ni siquiera así ..

Esta mañana estuve en el equipo ganador de la gimkana por el centro de madrid, con Jose Bonín, que le pasa como a mí, que no nos gusta perder ni a las canicas, fué divertido, y aunque parezca mentira, 5 geeks, y no se dijo ni una sola vez HTML, XML ni javascritp, ni siquiera .NET. Solo hablamos una vez de MDX pero solo porque era una habilidad necesaria para mojar la oreja a los otros 20 equipos :-P

Me faltaron amigos, Eladio Rincón, Rubén Pertusa, Paco González, el maestro Fernando Guerrero que tiene la mayor parte de la culpa de lo que soy, mi compañero Antonio Soto, con el que impartí de las primeras sesiones en mi vida…, en fin.. no puede ser todo bordado :)

En resumen, vengo con las pilas puestas, creo que lo que hacemos merece la pena, que ayudar a los demás informáticos a resolver cuestiones a veces simples, a veces jodidas, es algo que nos hace felices.

Quiero terminar con un deseo, para mi mismo, y para todos vosotros (los pocos que leais esto porque con lo abandonado que tengo el blog sereis pocos), no es mia la frase, pero creo que viene muy al caso

Que nunca te falte un sueño por el que luchar, un proyecto que realizar,  algo que aprender, un lugar a donde ir y alguien a quien amar.

 

SSMS para manejar Extended events

Posted by Miguel Egea | Posted in Noticias, Relacional | Posted on 04-07-2012

0

Esta mañana navegando para contestar una pregunta en el foro de noticias de microsoft, me encontré con esta explicación , y me parece muy interesante. Se trata de una explicción escrita por el MVP Devon Musgrave en donde cuenta como desde SSMS se puede hacer algo parecido a profiler pero con eventos extendidos, este es el link y si os gusta el tema en este otro artículo de mi compañero Enrique Catalá encontrareis información muy interesante

Generando script con los inserts de una tabla

Posted by Miguel Egea | Posted in Noticias | Posted on 18-12-2011

3

Hoy en el grupo de noticias de SQL Server vi un post en el que se preguntaba por como generar los comandos de insert de una tabla, sin embargo es fácil confundirse y no buscar esa generación en el lugar adecuado, así pues, me decidí a escribir un paso a paso sobre como hacer esto

  • Lo primero será concetar el object explorer a un servidor sql

  • Desplegaremos la opcion Databases (en la aplicación traducida seguramente se llame bases de datos)
  • Sobre una base de datos pulsamos boton derecho, Task- y dentro generate scripts..
  • En ese momento nos aparecerá un wizard de 4 pasos en el que seleccionaremos los objetos de base de datos, especificaremos las opciones de scripting, revisaremos lo que hemos hecho y por último se generará el script.
  • Tras pulsar next encontraremos una pantallla que nos pedirá que seleccionemos los objetos, en nuestro caso vamos a seleccionar 3 tablas.
  • Tras selecionar las tablas nos pide las opciones de scripting, en esta opción aparece un botón advanced, es en las opciones avanzadas donde se puede configurar que clase de script vamos a generar.
  • En las opciones avanzadas vemos que se puede elegir que se genere el objeto, pero también sus datos, o ambas cosas. eso es lo que hemos hecho en nuestro caso
  • Tras elegir scthema an Data, seguimos el asistente, hasta el final, primero revisando las opciones que hemos tomado.
  • Comprobando que funcionaron, finalmente.
  • Despues abrimos el fichero y este es una parte del script generado.

De esta forma pueden generarse script, no solo con la estructura, sino también con algunos datos importantes de nuestro proyecto sin necesidad de generar complicados scripts para hacerlo.

24 horas PASS Latam

Posted by Miguel Egea | Posted in Noticias | Posted on 06-12-2011

0

Ya están listas para la descarga todas las sesiones del ultimo 24 horas de PASS que organizaron nuestros compañeros y amigos de LATAM, podeis acceder a las grabaciones desde aquí

Reindexar una base de datos Express por linea de comandos

Posted by Miguel Egea | Posted in Basicos Newsgroup, Relacional | Posted on 03-12-2011

0

graba el contenido del código T-SQL en un fichero que se llame reindexa.SQL  El código está sacado de los libros en pantalla de la ayuda del producto.

Una vez que tengas ese fichero (llamado en mi caso c:\reindexa.sql ejecuta desde la linea de comandos esta línea

c:\>sqlcmd -S localhost -E -d tubasededatos -i c:\reindex.sql

con esto se ejecutará el script que en principio debe reindexar toda tu base de datos. recuerda cambiar en la ejecutcion de arriba donde pone tubasededatos por el nombre de tu base de datos.

 

SET NOCOUNT ON;
DECLARE @objectid int;
DECLARE @indexid int;
DECLARE @partitioncount bigint;
DECLARE @schemaname nvarchar(130); 
DECLARE @objectname nvarchar(130); 
DECLARE @indexname nvarchar(130); 
DECLARE @partitionnum bigint;
DECLARE @partitions bigint;
DECLARE @frag float;
DECLARE @command nvarchar(4000); 
-- Conditionally select tables and indexes from the sys.dm_db_index_physical_stats function 
-- and convert object and index IDs to names.
SELECT
    object_id AS objectid,
    index_id AS indexid,
    partition_number AS partitionnum,
    avg_fragmentation_in_percent AS frag
INTO #work_to_do
FROM sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL , NULL, 'LIMITED')
WHERE avg_fragmentation_in_percent > 10.0 AND index_id > 0;
 
-- Declare the cursor for the list of partitions to be processed.
DECLARE partitions CURSOR FOR SELECT * FROM #work_to_do;
 
-- Open the cursor.
OPEN partitions;
 
-- Loop through the partitions.
WHILE (1=1)
    BEGIN;
        FETCH NEXT
           FROM partitions
           INTO @objectid, @indexid, @partitionnum, @frag;
        IF @@FETCH_STATUS < 0 BREAK;
        SELECT @objectname = QUOTENAME(o.name), @schemaname = QUOTENAME(s.name)
        FROM sys.objects AS o
        JOIN sys.schemas as s ON s.schema_id = o.schema_id
        WHERE o.object_id = @objectid;
        SELECT @indexname = QUOTENAME(name)
        FROM sys.indexes
        WHERE  object_id = @objectid AND index_id = @indexid;
        SELECT @partitioncount = count (*)
        FROM sys.partitions
        WHERE object_id = @objectid AND index_id = @indexid;
 
-- 30 is an arbitrary decision point at which to switch between reorganizing and rebuilding.
        IF @frag < 30.0
            SET @command = N'ALTER INDEX ' + @indexname + N' ON ' + @schemaname + N'.' + @objectname + N' REORGANIZE';
        IF @frag >= 30.0
            SET @command = N'ALTER INDEX ' + @indexname + N' ON ' + @schemaname + N'.' + @objectname + N' REBUILD';
        IF @partitioncount > 1
            SET @command = @command + N' PARTITION=' + CAST(@partitionnum AS nvarchar(10));
        EXEC (@command);
        PRINT N'Executed: ' + @command;
    END;
 
-- Close and deallocate the cursor.
CLOSE partitions;
DEALLOCATE partitions;
 
-- Drop the temporary table.
DROP TABLE #work_to_do;
print "reindexación completada"
GO

 

 

12 del 12 a las 12 y 12 para presentar SQL Server 2012

Posted by Miguel Egea | Posted in Noticias | Posted on 02-12-2011

0

Las 12 Horas de SQL Server 2012

¡Conoce las principales novedades de SQL Server 2012 en 12 sesiones!

La semana del 12 de Octubre se celebró la convención anual de la organización mundial de usuarios de SQL Server (PASS), el PASS Summit 2011. En este gran evento se realizaron anuncios muy importantes acerca de Microsoft SQL Server 2012. Son tantas las novedades que necesitamos al menos 12 horas para poder contarte las principales.
El 12 de Diciembre, de 12 del mediodía a 12 de la noche, te esperamos en “Las 12 horas de SQL Server 2012”. Un evento totalmente online, en el que en la comodidad de tu casa u oficina podrás disfrutar de 12 sesiones técnicas en las que trataremos de AlwaysON, Power View, el proyecto Apollo y mucho más…
Organizado por el Grupo de Usuarios de SQL de España (PASS Spanish Group), todas las sesiones serán impartidas por expertos y MVPs de SQL Server. Contaremos asimismo con la participación de expertos en SQL del grupo de Producto de Microsoft Corporation en Redmond.

¡Te esperamos el 12/12 a las 12!