Buscar este blog

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