Buscar este blog

Mostrando entradas con la etiqueta Respuestas a Consultas. Mostrar todas las entradas
Mostrando entradas con la etiqueta Respuestas a Consultas. Mostrar todas las entradas

martes, 15 de noviembre de 2016

Property Owner is not Available for Database '[ ]'. This property may not exist for this object, or may not be retrivable due to insufficient acces rights (Microsoft.SqlServer.Smo) // SOLUCION AL PROBLEMA

Buen dia amigos,

   Hoy quiero contestar una pregunta de don Armando Gonzalez del Rio quien nos escribe desde Monterrey en el querido país Azteca.

    Don Armando refiere que trabaja para una cia donde fueron despedidos empleados del Depto de Sistemas, alguno de los cuales cumplían funciones de DBA.
 
    Concreteamente el problema que nos refiere es "cuando intento clickear sobre una base de datos y obtener sus propiedad me encuentro imposibilitado de hacerlo y me aprece este cartel:"


Solución:

 Don Armando ud no puede acceder a las propiedades de las bases de datos puesto que el owner de las mismas a quedado ligado a los empleados de la empresa que han sido desafectados de la misma.

  Tiene pues que correr un comando asignando la base de datos a un login, preferentemente de domino, que esté asignado a un empleado del payroll actual de la Cia.

  Cómo se hace? Pues de la siguiente forma, utilizando el sp sp_changedbowner.

  use [base de datos]

exec sp_changedbowner 'gherrera';


En el ejemplo precedente se asigna un nuevo owner al login "gherrera".

Es todo amigos, nos vemos proximamente.

Saludos desde Argentina.



   




jueves, 27 de octubre de 2016

Problemas al Renombrar Una Base de Datos

Amigos, 

   Hoy es un dia de respuesta a preguntas. Tabaré Montero de Las Cañas Uy me refiere un problema a la hora de renombrar las bases de datos... 
   Tbaré me comenta que lo hace a través de la consola, "parándose sobre la base de datos", "clickeando" con botón derecho y utilizando la opción "rename". El resultado... obtiene siempre un mensaje de error.
   Pablo, para evitar errores a la hora de renombrar una base de datos no hay otra forma que hacerlo en modo monousuario y con sentencias t-sql , no con la consola, veamos:

-----------------------------------------------
 -- Autor GH para
 -- Detalle: Renombrar Una Base de Datos
 -----------------------------------------------

-- 1 Seteo la Base de Datos a Single User

Alter Database Repuestos
Set Single_User with Rollback Immediate

2-- Renombro la Base de Datos

ALTER DATABASE Respuestos
Modify Name = RespuestosFord ; 

-- 3 Seteo la Base de Datos a Multi User
Alter Database RepuestosFord

Set Multi_User

 
Amigo, un saludo grande a la gente de Fray Bentos, Las Cañas. A su disposición



Scriptear Todos los Indices de Una Base de Datos (con un solo script)

Amigos,

   Cuantas veces nos encontramos ante una migración con la necesidad de contar con la ayuda de un script que nos permita scriptear todos los Indices de todas las tablas de una base de datos?
   Estoy seguro que muchas veces se han efrentado a esta situación y, por cierto, no parece la situación ideal "pararse" sobre cada tabla y con el botón derecho scriptear cada uno de los idx...
   Les dejo entonces un script que hace esto por ustedes, solo lo ejeutan y el resultado en formato texto será el script con el cual podrán regenerar uno a uno todos los índices de todas las tablas de una base de datos.
   Aprovecho para saludar al amigo Agapito Buenaventura quien me ha escrito preguntando por este tema desde la querida Bolivia.

  ---------------------------------------------------------------------------
-- Autor Gustavo Herrera                                                
-- Detalle: Este código scriptea todos los indices correspondientes a una BD 
-----------------------------------------------------------------------------

DECLARE cIX CURSOR FOR
   SELECT
   OBJECT_NAME(SI.Object_ID),
   SI.Object_ID,
   SI.Name,
   SI.Index_ID,
   F.NAME
   FROM Sys.Indexes SI
   LEFT JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS TC
   ON
    SI.Name = TC.CONSTRAINT_NAME AND
    OBJECT_NAME(SI.Object_ID) = TC.TABLE_NAME
   LEFT JOIN sys.filegroups f -- para saber el filegroup
   ON SI.data_space_id = f.data_space_id
   WHERE --TC.CONSTRAINT_NAME IS NULL --AND
         OBJECTPROPERTY(SI.Object_ID, 'IsUserTable') = 1
          ORDER BY OBJECT_NAME(SI.Object_ID), SI.Index_ID

   DECLARE
   @IxTable SYSNAME,
   @IxTableID INT,
   @IxName SYSNAME,
   @IxID INT,
   @PKSQL varchar (50),
   @FILEGROUP VARCHAR (50)

   -- Loopea a través de todos los idx
   OPEN cIX
   FETCH NEXT FROM cIX INTO
   @IxTable, @IxTableID, @IxName, @IxID, @FILEGROUP
  
   WHILE (@@FETCH_STATUS = 0)
   BEGIN
       DECLARE @IXSQL NVARCHAR(4000) SET @PKSQL = ''
       SET @IXSQL = 'CREATE '

       -- Chequea si el indice es unique
       IF (INDEXPROPERTY(@IxTableID, @IxName, 'IsUnique') = 1)
        SET @IXSQL = @IXSQL + 'UNIQUE '
       -- Chequea si el idx es clustered
       IF (INDEXPROPERTY(@IxTableID, @IxName, 'IsClustered') = 1)
        SET @IXSQL = @IXSQL + 'CLUSTERED '
        SET @IXSQL = @IXSQL + 'INDEX ' + @IxName + ' ON ' + @IxTable + '('

         -- Obtiene todas las columnas que contienen índices
         DECLARE cIxColumn CURSOR FOR
              SELECT SC.Name
              FROM Sys.Index_Columns IC
                   JOIN Sys.Columns SC ON IC.Object_ID = SC.Object_ID AND IC.Column_ID = SC.Column_ID
              WHERE IC.Object_ID = @IxTableID AND Index_ID = @IxID
              ORDER BY IC.Index_Column_ID

            DECLARE
            @IxColumn SYSNAME,
            @IxFirstColumn BIT
            SET @IxFirstColumn = 1

            -- Loopea a través de todas las columnas que forman un idx y les agrega un CREATE
            OPEN cIxColumn
            FETCH NEXT FROM cIxColumn INTO @IxColumn
            WHILE (@@FETCH_STATUS = 0)
            BEGIN
                IF (@IxFirstColumn = 1)
                    SET @IxFirstColumn = 0
                ELSE
                    SET @IXSQL = @IXSQL + ', '
             SET @IXSQL = @IXSQL + @IxColumn

                  FETCH NEXT FROM cIxColumn INTO @IxColumn
            END
            CLOSE cIxColumn
            DEALLOCATE cIxColumn

            SET @IXSQL = @IXSQL + ') '+'ON '+@FILEGROUP
            
            
           
          -- Imprime CREATE statement para los índices
   PRINT @IXSQL

   FETCH NEXT FROM cIX INTO @IxTable, @IxTableID, @IxName, @IxID, @FILEGROUP
END

CLOSE cIX
DEALLOCATE cIX
 

Listar TABLAS IDENTITY de una Base de Datos

Buenas tardes amigos.
Estoy en el dia de hoy respondiendo una pregunta hecha por don José Bermudez de la bella zona de Cartagena Colombia.
Don José me pregunta si es posible identificar con un script aquellas tablas que tienen una columna autoincremental "identity".

Pues claro que si, le dejo pues el script y mis saludos a la tierra del buen café y los hermosos paisajes.

 --------------------------------------------------------------------------
 -- Autor GH para SQL SERVER PARA TODOS                                                               
 -- Detalle: Lista todas las tablas que tengan columna identity de una BD --
 ---------------------------------------------------------------------------

 SELECT
 TABLE_NAME,
 COLUMN_NAME
 FROM INFORMATION_SCHEMA.COLUMNS
 WHERE
 TABLE_SCHEMA = 'dbo' and
 COLUMNPROPERTY(object_id(TABLE_NAME), COLUMN_NAME, 'IsIdentity') = 1
 ORDER BY

 TABLE_NAME

viernes, 26 de agosto de 2016

Diferentes Status de una Sesión (Spid) en Sql Server // Scheduler Qué Es y Cuál es su Función?


Hola amigos…

Luego de unos meses en los cuales la actividad me impidió estar en contacto con Uds. quiero retomar el mismo, con la promesa de intentar no volver a interrumpirlo, a través de este artículo…

Gracias por los mails recibidos con preguntas, y todo tipo de cuestiones relacionadas con nuestra actividad. Como siempre, las voy respondiendo con toda la urgencia que puedo y con la privacidad requerida por uds.

Justamente quiero abordar un tema que suele ser muy frecuente en los correos que recibo. Tiene que ver con los distintos estados por los que una sesión – SPID - (proceso),   puede pasar hasta ser resuelta por el motor de base de datos. Para ello considero fundamental ahondar previamente en un concepto que pocos colegas parecen tener claro, hablo de qué es y qué función cumple el Scheduler en el motor de base de datos.

 Particularmente noto que el estado “Suspended” es el que más inquieta a los colegas.. Pero eso será objeto de un próximo post.

Hoy quiero concentrarme en una breve pero explícita explicación de los posibles estados de un SPID.
Un SPID es una sesión abierta para la ejecución de un proceso en nuestra base de datos.  Los SPID  1 al 49 están reservados para los procesos del sistema, el resto (del 50 en adelante), para los procesos de usuario.

Hay un concepto aquí que es fundamental entender y es el que tiene que ver con el SCHEDULER.
Qué es el scheduler? Básicamente es un proceso madre encargado de Organizar y Asignar a cada Spid un hilo de ejecución (Worker Thread).

Cada Scheduler puede estar corriendo una, y solo una,  tarea activa. El resto de las tareas son puestas por el scheduler en una cola de espera, que da origen, como verán luego, a algunos de los status por los que un proceso puede pasar.

Pero cuántos Scheduler hay en nuestro motor de base de datos?. Uno por cada procesador lógico (no físico).  Es decir que si vuestro equipo tiene tan sólo un procesador, pero tiene habilitado  hyperthreading, van a existir dos Schedulers.

 Una consulta para entender los schedulers presentes en nuestro sistema? Pues claro que si.. Microsoft nos asiste con la siguiente vista a saber:
SELECT * FROM sys.dm_os_schedulers WHERE STATUS = ‘VISIBLE ONLINE’

Entonces, y pasando en limpio, el Scheduler es quien se encarga de asignar a cada spid un hilo de ejecución del cpu. Es un intermediario entre los procesos y el cpu.

Pensemos en estos términos. Supongamos que vamos de compras a un mercado en el que solo 2 operarios están atendiendo (procesadores lógicos).  Pues bien, sería un caos si todos los clientes vamos a abordar a los pobres vendedores al mismo tiempo verdad?. Por suerte hay dos encargados que reparten números para que nosotros podamos ser atendidos, cada uno a su tiempo. Estos dos encargados en el contexto del sql server serían los Schedulers).

Recordemos que los procesos que se están ejecutando actualmente en nuestro SQL pueden ser consultados entre otras herramientas por medio del sp_who2 o la vista del sistema sys.sysprocesses. (por más detalles consultar en este mismo blog en post anteriores).

Vamos a la explicación de los estados entonces. Si bien hay mucha bibliografía al respecto noto por las consultas recibidas que muchos colegas necesitan de una explicación más amena que y simple que la de Microsoft da en su web.

Vamos con la explicación entonces al estilo Sql Server Para Todos. Es decir, sencilla y en castellano para todos los hermanos de Latinoamérica:

“Running”:  este estado es “música para nuestros oídos de DBA”,  puesto que implica que nuestro proceso está en plena ejecución, utilizando el thread asignado por el Scheduler y en camino de ser resuelto.

Runnable”: no confundir con “running”… Es un estado en el cual la sesión ha obtenido un worker thread (hilo de ejecución) por parte del Scheduler, mas está esperando la resolución de un proceso previo que libere al cpu y así poder utilizar el thread de trabajo que le fue asignado.  Pensemos en nuestro ejemplo el mercado… El cliente ya tiene el número, pero tienen que esperar que el vendedor se desocupe…

Pending”:  la sesión está esperando la asignación por parte del Scheduler de un Thread de Ejecución. El cliente está en el mercado esperando un nº para entonces si entrar en la cola y poder ser atendido por el vendedor…

Background”: generalmente un estado de los spids que corren “tras bambalinas” y que corresponden al sistema, no al usuario. Todos tienen un spid menor a 50 y no debiera de llamar nuestra atención de modo particular.

Sleeping”:  refiere a una sesión abierta cuyo proceso ya fue ejecutado y  no está desarrollando ninguna actividad en el server. Es típico ver este tipo de sesiones en programas mal diseñados o en usuarios que abren “new queries” constantemente en la consola del Sql Server sin cerrar las mismas una vez utilizadas. Ojo..toda sesión abierta, aún inactiva,  genera consumo de recursos, no debiera permitirse este comportamiento

Dormant” = el dormant es el estado en el cual una conexión hecha a través de un server linkeado permanece inactiva una vez que la misma deja de ser utilizada. El tiempo de permanencia de la sesión en este estado es de aproximadamente 4 a 5 minutos (antes de ser cerrada automáticamente por el SQL)

Rollback” =  indica que una transacción está en medio de un rollback. No recomiendo hacer ningún tipo de acción por más que el rollback se prolongue en el tiempo. Alguna vez he visto a un colega reiniciar el servicio de sql server pensando que eso iba a solucionar la demora.. Desde ya no es asi…

 “Suspended” = La session está ejecutándose (tal el caso de la sesión que muestra el valor running), mas está esperando por la liberación de recursos a nivel de I/O, memoria etc… Sin dudas es un estado que no debiera reflejar las constante de nuestro sistema y que merece un tratamiento aparte que, les prometo, he de abordarlo en mi próximo post.


Amigos espero que el post le haya sido de utilidad. Ya retomamos el contacto. Nos vemos próximamente con otro nuevo post. Sigan enviando sus mail que son muy bien recibidos (y por favor tengan paciencia y no olviden de apuntar la privacidad con la que quieren que sean contestados)..

martes, 7 de julio de 2015

Pasando Datos Numéricos Largos Desde Sql Server Hacia Excel (evitar el truncamiento)

Amigos,

Me ha llegado una consulta desde la hermana República de Panamá. Don Omar Alfanno me cuenta de un inconveniente que tiene "al bajar datos desde el sql server al excel, cuando intento copiar y pegar la columna con mis números telefónicos, pues veo que los últimos tres dígitos se truncan y el Excel los cambia por tres números ceros. No encuentro la solución puede ud. ayudarme?"

Respuesta:

Ante todo don Omar quiero contarle que es un error con el que todos quienes trabajamos alguna vez con el SQL Server nos hemos topado y es de muy fácil resolución.

Simplemente debe (y en este orden, de lo contrario no funciona)

1) Abrir el excel y darle formato texto (text) a las columnas en las cuales ud. quiere pegar sus datos numéricos extensos.

2) Luego si copiar y pegar los datos desde el sql server en el excel.

Es muy importante que no invierta el orden, le repito. No pegue para luego cambiar el formato porque sus datos serán truncados.

Eso es todo, mi saludo desde Argentina.

miércoles, 10 de diciembre de 2014

Pregunta: Cómo identifico cual dts package está siendo llamado por el job?

PREGUNTA:


Bruno xxxx
 xxxxx@hotmail.com





Buenas tardes Gustavo.

Te saluda Bruno de Lima-Perú. Estuve buscando la solución a un problema que tengo en sql server y me encontré con tu blog, déjame felicitarte por el trabajo que realizas, he encontrado mucha información.

Te comento que no soy DBA, pero tengo nociones. Estoy realizando un inventario de todos los Jobs y dts de la base de datos sql server 2000.

Cuando estuve inventariando los dts me encontré con esta sorpresa.

He encontrado en la línea de ejecución lo sgte:


DTSRun /~Z0xAABAD4ECCF4B2A08AC5ACF14850EF2865FE933FCD50929A5FB0B21F1200CE14D2A492C5F73D719EAFBCA077C0AC0079B52FC5B1B26771622389205196AA5D334DF6F163A895DFB9F6B66507626FF70285419B49123265B8368DFB9F4777D5A2B4F00238BCB7D2B75A960DC14C00BFC1464C23A7F69114D48108EAD49F684055F26066F7E82A236ABF58F9202EC071FA8F60193

Aquí esta mi duda, no se como se llama el dts.
Que puedo hacer para saber el nombre del dts y de sus parámetros?
Espero me puedas ayudar.
Muchas gracias por todo y que sigas ayudando !!

Respuesta.

Estimado Bruno, muchas gracias por tus conceptos, sigue los siguientes pasos:

1) Copia la línea DTSRUN
2) Abre una ventana de Windows Command
3) Pega la línea DTSRUN dentro de la ventana
4) Al final de la línea agrega (textual) /!X/!C = copy results onto Windows Clipboard
5) Corre el comando
6) Abre el notepad
7) Cliquea "EDIT PASTE", esto va a pegar el comando actual dentro del Notepad
 y te mostrará a ti el nombre del Package.

Suerte y quedo a tu disposición

Gustavo Herrera.

Pregunta "En la empresa donde trabajo utilizan sql server standard edition y no tiene disponible la opción de particionar, que puedo hacer si tengo una tabla de 10 millones de registros?"



PREGUNTA

Alejandro xxxxxxx @yahoo.com




Cordial saludo
Buenos días , señor Gustavo
Mi nombre es Fabio Hernández , trabajo en el área de desarrollo .net y bases de datos sql server , vi un blog suyo muy interesante y habla del tema de particionamiento de tablas SQL SERVER PARA TODOS Gustavo Ricardo Herrera : PARTICIONAR TABLAS EN 5 PASOSEn la empresa donde trabajo utilizan sql server standard edition y no tiene disponible la opcion de particionar, que puedo hacer si tengo una tabla de 10 millones de registros , en donde hay información histórica desde el año 2000 hasta el 2014, normalmente la información consultada es del 2012-2014 , pero en la tabla esta todo el historico, como no puedo particionar por la version del sql server que otra opcion podria hacer
Muchas gracias .
Att
xxxxxxx


CONTESTACION

Que tal Alejandro, saludos desde BsAs.

Perdón por la demora en contestarte, estoy muy atareado por estos dias.

Lo que te ocurre a Ti le ocurre a mucha gente... Van mis consideraciones...

-  Se te ha abierto una oportunidad de solicitarles a los dueños de la compañía para la cual trabajas el upgrade hacia una versión más profesional de Sql Server.  Has pie en la ecuación costo/beneficio y trata pues de explicarles - en el lenguaje más sencillo posible - uno de los problemas a los que se enfrenta la compañía (perfromance pobre de sus bases de datos), por no tener la versión adecuada de Sql Server.

- Una tabla de 10 millones de registros es, a priori, una tabla que no tendría que particionarse, al menos por la cantidad de registro que refieres. Recuerda siempre que el mantenimiento de una partición es una tarea más a futuro...

- Entiendo que tu problema pasa por otro lado...., veamos...

   Pienso que deberías hacer pie en algunos de los siguientes items antes de pensar en particionar.

   -  Determinación de las queries que más tiempo tardan en resolverse (hay un script en mi blog para ello)

   -  Estudio de los planes de ejecución de dichas queries. Apuesto hacia falta de un indexado apropiado o de una lógica "pobre" en las queries a las que te hago referencia.
    
   Por otra parte, desconozco si dispones de, al menos 3 discos físicos para poder distribuir los archivos de datos, log e índices en distintos discos y aprovechar de ese modo la lecto escritura paralela del sql server.

   Una última solución puede ser, yo no te la aconsejo, el crear una base de datos por año y luego simplemente joinear las consultas.

   Entiendo que habiendo revisado los anteriores puntos (planes de ejecución, indexado y lógica de las queries),  encontrarás la solución, sin precisar hacer esto último. 

   Suerte y quedo atento ante cualquier inquietud.

    Saludos desde Buenos Aires, Gustavo Herrera.