Mostrando entradas con la etiqueta base de datos. Mostrar todas las entradas
Mostrando entradas con la etiqueta base de datos. Mostrar todas las entradas

domingo, 9 de junio de 2013

Algunos Scripts para monitorear SQL Server

Para monitorear el estado de los jobs que fallaron en su última ejecución:
SELECT name FROM msdb.dbo.sysjobs A, msdb.dbo.sysjobservers B 
WHERE A.job_id = B.job_id AND B.last_run_outcome = 0
Espacio en cada disco para la instancia SQL:
EXEC master..xp_fixeddrives
el resultado lo probe en mi maquina y salio lo siguiente
Para ver un listado de Jobs Deshabilitados:
SELECT name FROM msdb.dbo.sysjobs 
WHERE enabled = 0 ORDER BY name
Para ver un listado de los jobs que están actualmente en ejecución:
msdb.dbo.sp_get_composite_job_info
NULL, NULL, NULL, NULL, NULL, NULL, 1, NULL, NULL
Para ver logines que son miembros de los roles de servidor (este script funciona en SQL 2000 pero no en SQL 2005 o superiores porque la tabla master.dbo.sysxlogins no existe):
SELECT 'ServerRole' = A.name, 'MemberName' =  B.name 
FROM master.dbo.spt_values A, master.dbo.sysxlogins B 
WHERE A.low = 0 AND A.type = 'SRV' AND B.srvid IS NULL
Para ver la última vez que las bases de datos fueron backupeadas:
SELECT  B.name as Database_Name, ISNULL(STR(ABS(DATEDIFF(day, GetDate(),
 MAX(Backup_finish_date)))), 'NEVER') as DaysSinceLastBackup,
 ISNULL(Convert(char(10), MAX(backup_finish_date), 101), 'NEVER') as LastBackupDate
 FROM master.dbo.sysdatabases B LEFT OUTER JOIN msdb.dbo.backupset A
 ON A.database_name = B.name AND A.type = 'D' GROUP BY B.Name ORDER BY B.name
Para leer las ultimas entradas del archivo de log (NO el transaction log):
CREATE TABLE #Errors (vchMessage varchar(255), ID int)
CREATE INDEX idx_msg ON #Errors(ID, vchMessage)
INSERT #Errors EXEC xp_readerrorlog
SELECT vchMessage
FROM #Errors
WHERE vchMessage
NOT LIKE '%Log backed up%' AND vchMessage
NOT LIKE '%.TRN%' AND vchMessage
NOT LIKE '%Database backed up%' AND vchMessage
NOT LIKE '%.BAK%' AND vchMessage
NOT LIKE '%Run the RECONFIGURE%' AND
vchMessage NOT LIKE '%Copyright (c)%'
ORDER BY ID

DROP TABLE #Errors

Ver las relaciones de todas las tablas de la base de datos


Si se requiere reportar las relaciones que tienen en su base de datos, este pequeño codigo sirve mucho.
select name as relacion, object_name(parent_object_id) as tabla
from sys.objects where type in (N'F')
pero con eso solo podemos ver la relacion y en que tabla esta, ahora podemos cambiar a esto:
select name as relacion_fk, object_name(parent_object_id) as tabla ,
object_name(referenced_object_id) as tabla_referencia from sys.foreign_keys
que nos muestra la tabla a la que pertenece la relacion y la tabla a la que hace referencia la clave foranea.
Ahora si agregamos una tablita mas podemos ver las columas relacionadas:
select f.name as relacion_fk, object_name(f.parent_object_id) as tabla ,
        col_name( c.parent_object_id, c.parent_column_id) as columna,
        object_name(f.referenced_object_id) as tabla_referencia,
        col_name( c.referenced_object_id, c.referenced_column_id) as columna_referencia
from sys.foreign_keys f inner join sys.foreign_key_columns as c
       on f.object_id = c.constraint_object_id

Contar el número de filas de todas las tablas en SQL Server

Aqui hay otro script SQL que encontre por los foros que quisiera compartirles aqui: Como contar registros en todas las tablas. Al utilizarlo se vera de la siguiente forma (tome la bd AdventureWorks para esta captura)
A quien no le ha sucedido en mas de una vez que queremos saber cuales son las tablas con mas registros en relacion al numero de filas?
Se podria pensar en hacer la siguiente consulta: SELECT COUNT(*) from each user table, pero es muy ineficiente. Un mondo mejor para consultar las tablas es con el script de abajo:
SELECT
    sysobjects.Name
    , sysindexes.Rows
FROM
    sysobjects
    INNER JOIN sysindexes
    ON sysobjects.id = sysindexes.id
WHERE
    type = 'U'
    AND sysindexes.IndId < 2
ORDER BY
    sysobjects.Name

viernes, 7 de junio de 2013

Obtener número de registros de varias tablas en SQL

Mira por donde, hoy estoy encontrando solución a varias cosillas que había querido hacer antes y por tiempo no me habían salido. En este caso, lo que pretendía era obtener el número de registros de todas las tablas de una base de datos, para saber cuales son las más pesadas. La manera rápida y potente que he encontrado es usar la tabla sysindexes. En mi caso la he usado de esta forma:
select object_name(id) nombreTabla, convert(varchar(50), cast(rowcnt as money),1) nRegistros from sysindexes
Si se quiere la de una tabla en concreto, se puede poner un where indicando el nombre de tabla:
select object_name(id) nombreTabla, convert(varchar(50), cast(rowcnt as money),1) nRegistros from sysindexes where id=object_id('Nombre de tabla')

Agregar un Trigger para auditar tu base de datos SQL Server

Aqui les dejo un ejemplo de como hacer un trigger que sirve para auditar tus bases de datos de SQL Server.
Navegando me encontre con una excelente solucion hecha por Jon Galloway, en la cual consiste en crear un solo script y que este se encarge de crear los triggers necesarios para cada tabla de la base de datos seleccionada, la diferencia con SQLTableHistory es que con nuestra herramienta podemos seleccionar las tablas que queremos que se le haga su respectiva auditoria y con la solucion presentada en este blog.
Aqui un ejemplo de como se verian los datos con la solucion de Jon Galloway

Con esta informacion podemos hacer reportes de una manera sencilla tales como:
  • Cuales tablas han sufridos cambios recientemente.
  • Cuales tablas no sufrieron cambios el pasado año.
  • Cuales tablas jamaz han sufrido cambios.
  • Mostrar todos los cambios a las tablas por un usuario y periodo especifico.
  • Mostrar las tablas mas activas en un determinado periodo.Con estas herramientas es posible volver al estado anterior de la tabla y volver en un punto especifico, claro esta ya depende de las nuevas extensiones que ustedes le hagan.Aqui os dejo el script completo que crea la tabla de auditoria y corre el script para crear los triggers a todas las tablas de la base de datos.
USE Northwind
GO
 
IF NOT EXISTS(SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME= 'Audit')
CREATE TABLE Audit
(
AuditID [int]IDENTITY(1,1) NOT NULL,
Type char(1),
TableName varchar(128),
PrimaryKeyField varchar(1000),
PrimaryKeyValue varchar(1000),
FieldName varchar(128),
OldValue varchar(1000),
NewValue varchar(1000),
UpdateDate datetime DEFAULT (GetDate()),
UserName varchar(128)
)
GO
 
DECLARE @sql varchar(8000), @TABLE_NAME sysname
SET NOCOUNT ON
 
SELECT @TABLE_NAME= MIN(TABLE_NAME)
FROM INFORMATION_SCHEMA.Tables
WHERE
TABLE_TYPE= 'BASE TABLE'
AND TABLE_NAME!= 'sysdiagrams'
AND TABLE_NAME!= 'Audit'
 
WHILE @TABLE_NAME IS NOT NULL
 BEGIN
EXEC('IF OBJECT_ID (''' + @TABLE_NAME+ '_ChangeTracking'', ''TR'') IS NOT NULL DROP TRIGGER ' + @TABLE_NAME+ '_ChangeTracking')
SELECT @sql =
'
create trigger ' + @TABLE_NAME+ '_ChangeTracking on ' + @TABLE_NAME+ ' for insert, update, delete
as
 
declare @bit int ,
@field int ,
@maxfield int ,
@char int ,
@fieldname varchar(128) ,
@TableName varchar(128) ,
@PKCols varchar(1000) ,
@sql varchar(2000),
@UpdateDate varchar(21) ,
@UserName varchar(128) ,
@Type char(1) ,
@PKFieldSelect varchar(1000),
@PKValueSelect varchar(1000)
 
select @TableName = ''' + @TABLE_NAME+ '''
 
-- date and user
select @UserName = system_user ,
@UpdateDate = convert(varchar(8), getdate(), 112) + '' '' + convert(varchar(12), getdate(), 114)
 
-- Action
if exists (select * from inserted)
if exists (select * from deleted)
select @Type = ''U''
else
select @Type = ''I''
else
select @Type = ''D''
 
-- get list of columns
select * into #ins from inserted
select * into #del from deleted
 
-- Get primary key columns for full outer join
select @PKCols = coalesce(@PKCols + '' and'', '' on'') + '' i.'' + c.COLUMN_NAME + '' = d.'' + c.COLUMN_NAME
from INFORMATION_SCHEMA.TABLE_CONSTRAINTS pk ,
INFORMATION_SCHEMA.KEY_COLUMN_USAGE c
where pk.TABLE_NAME = @TableName
and CONSTRAINT_TYPE = ''PRIMARY KEY''
and c.TABLE_NAME = pk.TABLE_NAME
and c.CONSTRAINT_NAME = pk.CONSTRAINT_NAME
 
-- Get primary key fields select for insert
select @PKFieldSelect = coalesce(@PKFieldSelect+''+'','''') + '''''''' + COLUMN_NAME + ''''''''
from INFORMATION_SCHEMA.TABLE_CONSTRAINTS pk ,
INFORMATION_SCHEMA.KEY_COLUMN_USAGE c
where pk.TABLE_NAME = @TableName
and CONSTRAINT_TYPE = ''PRIMARY KEY''
and c.TABLE_NAME = pk.TABLE_NAME
and c.CONSTRAINT_NAME = pk.CONSTRAINT_NAME
 
select @PKValueSelect = coalesce(@PKValueSelect+''+'','''') + ''convert(varchar(100), coalesce(i.'' + COLUMN_NAME + '',d.'' + COLUMN_NAME + ''))''
from INFORMATION_SCHEMA.TABLE_CONSTRAINTS pk ,   
INFORMATION_SCHEMA.KEY_COLUMN_USAGE c  
where  pk.TABLE_NAME = @TableName  
and CONSTRAINT_TYPE = ''PRIMARY KEY''  
and c.TABLE_NAME = pk.TABLE_NAME  
and c.CONSTRAINT_NAME = pk.CONSTRAINT_NAME
 
if @PKCols is null
begin
raiserror(''no PK on table %s'', 16, -1, @TableName)
return
end
 
select @field = 0, @maxfield = max(ORDINAL_POSITION) from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = @TableName
while @field < @maxfield
begin
select @field = min(ORDINAL_POSITION) from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = @TableName and ORDINAL_POSITION > @field
select @bit = (@field - 1 )% 8 + 1
select @bit = power(2,@bit - 1)
select @char = ((@field - 1) / 8) + 1
if substring(COLUMNS_UPDATED(),@char, 1) & @bit > 0 or @Type in (''I'',''D'')
begin
select @fieldname = COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = @TableName and ORDINAL_POSITION = @field
select @sql = ''insert Audit (Type, TableName, PrimaryKeyField, PrimaryKeyValue, FieldName, OldValue, NewValue, UpdateDate, UserName)''
select @sql = @sql + '' select '''''' + @Type + ''''''''
select @sql = @sql + '','''''' + @TableName + ''''''''
select @sql = @sql + '','' + @PKFieldSelect
select @sql = @sql + '','' + @PKValueSelect
select @sql = @sql + '','''''' + @fieldname + ''''''''
select @sql = @sql + '',convert(varchar(1000),d.'' + @fieldname + '')''
select @sql = @sql + '',convert(varchar(1000),i.'' + @fieldname + '')''
select @sql = @sql + '','''''' + @UpdateDate + ''''''''
select @sql = @sql + '','''''' + @UserName + ''''''''
select @sql = @sql + '' from #ins i full outer join #del d''
select @sql = @sql + @PKCols
select @sql = @sql + '' where i.'' + @fieldname + '' <> d.'' + @fieldname
select @sql = @sql + '' or (i.'' + @fieldname + '' is null and  d.'' + @fieldname + '' is not null)''
select @sql = @sql + '' or (i.'' + @fieldname + '' is not null and  d.'' + @fieldname + '' is null)''
exec (@sql)
end
end
'
SELECT @sql
EXEC(@sql)
SELECT @TABLE_NAME= MIN(TABLE_NAME) FROM INFORMATION_SCHEMA.Tables
WHERE TABLE_NAME> @TABLE_NAME
AND TABLE_TYPE= 'BASE TABLE'
AND TABLE_NAME!= 'sysdiagrams'
AND TABLE_NAME!= 'Audit'
END

domingo, 11 de noviembre de 2012

Agregar y Grabar en datagridview para guardar en SQL con Transacciones en Visual Basic .NET

Crearemos una forma con los objetos como aparece en la imagen, ademas agregaremos la libreria de sqlclient

Imports System.Data.SqlClient
para el ejemplo crearemos una base de datos con el nombre DBPRUEBA, que nos permita almacenar los datos.
CREATE DATABASE DBPRUEBA
USE DBPRUEBA
CREATE TABLE datos(  
id_datos INT PRIMARY KEY IDENTITY(1,1),  
nombre VARCHAR(50),  
deporte VARCHAR(50),  
fecha_inscripcion datetime    )
Ahora crearemos 4 columnas dentro del datagrid. que nos permitan agregar los datos ingresados.
Ahora para agregar los datos, hemos determinado un textbox para un nombre un combobox con unos deportes y por ultimo un datetimepicker para una fecha. tenemos un boton agregar que nos permitira, agregar un row al datagridview.
Este es el codigo para el boton agregar
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
        If Me.TextBox1.Text <> String.Empty Then
            If Me.ComboBox1.Text <> String.Empty Then                  'agregamos la informacion a un row o fila del datagrid                  
                Me.DataGridView1.Rows.Add(Me.TextBox1.Text, Me.ComboBox1.Text, Me.DateTimePicker1.Value.ToShortDateString)                  'limpiamos los controles
                Me.TextBox1.Text = String.Empty
                Me.ComboBox1.SelectedItem = String.Empty
                Me.DateTimePicker1.Value = Today.Date
            Else
                MessageBox.Show("Ingrese un deporte", "", MessageBoxButtons.OK, MessageBoxIcon.Information)
            End If
        Else
            MessageBox.Show("Ingrese un nombre", "", MessageBoxButtons.OK, MessageBoxIcon.Information)
        End If
    End Sub
una vez tenemos datos dentro de nuestro datagrid, si deseamos eliminar uno de nuestros rows o filas damos click en el boton eliminar, la cual quitara la fila del datagrid.
Private Sub DataGridView1_CellContentClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellContentClick
        'se puede hacer referencia al nombre de la columna para saber donde hicieron click o solo con el e.columnindex sabiendo la posicion de la columna          
        'yo lo manejo asi por que se daran cuenta que en algun caso las columnas pueden aumentar o disminuir           
        'y se complicaria la cosa por que si cambia el numero de columnas habria que corregir siembre el indice            
        'si hicieron clic en la columna eliminar          
        If DataGridView1.Columns(e.ColumnIndex).Name = "Eliminar" Then              'eliminar row
            DataGridView1.Rows.RemoveAt(e.RowIndex)
        End If
    End Sub
Ahora podremos guardar nuestra informacion al hacer click en el boton guardar, aqui se validara que existan datos o mejor filas en el datagrid, ahora recorreremos nuestro datagrid por medio de un For. tendremos una varia de tipo string (SqlString ) donde agregaremos la sentencia para guardar en la base de datos (INSERT INTO), ademas de un araylist para agregar las sentencias.
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        If DataGridView1.Rows.Count > 0 Then
            Dim SqlString As String = String.Empty ' variable a la que asignaremos la sentencia              
            Dim ListSqlStrings As New ArrayList  'arregla donde ingresaremos las sentencias              
            'recorremos el datagrid como ya sabemos siempre se toma desde cero
            For i As Integer = 0 To DataGridView1.Rows.Count - 1                  'creamos la sentencia el row siempre tendra el valor de i para ir pasando de row en row                  
                'el campo .cells(0) indica la columna que esta ese dato, tambien puede hacerlo con el nombre de la celda .cells("Nombre")
                SqlString = "INSERT INTO datos (nombre,deporte,fecha_inscripcion) VALUES ('" + DataGridView1.Rows(i).Cells(0).Value.ToString() + "','" + DataGridView1.Rows(i).Cells(1).Value.ToString() + "','" + DataGridView1.Rows(i).Cells(2).Value.ToString() + "')"
                'agregamos la sentencia a la lista                  
                ListSqlStrings.Add(SqlString)
            Next
            If EjecutarTransaccion(ListSqlStrings) Then
                MessageBox.Show("Info. guardada correctamente")
                Close()
            Else
                MessageBox.Show("La Info. no se guardo")
            End If
        Else
            MessageBox.Show("No hay informacion para guardar")
        End If
    End Sub
Ahora una vez hallamos recorrido el datagrid y tengamos nuestras sentencias, podremos ejecutar nuestra transaccion SQl para guardar en la base de datos. En este punto haciendo un parentesis igualmente podra ejecutar una a una las sentencias si lo desea por medio de un executenonquery, pero para mi lo mas optimo es una transaccion. Volviendo al evento guardar la funcion Public Function EjecutarTransaccion(ByVal ListaSentencias As ArrayList) As Boolean recibira el arraylist y retornara un valor booleano para identificar si se realizo la transaccion. para ejecutar nuestra transaccion necesitamos una conexion como la siguiente.
Public Connection1 As New SqlConnection("Data Source=XSaint;Initial Catalog=DBPRUEBA;Integrated Security=SSPI")
Ahora la funcion ejecutartransaccion se ejecutara, si es correcta la transaccion retornara true de ser incorrecta podremos ver un mensaje y retornara un false
Public Function EjecutarTransaccion(ByVal ListaSentencias As ArrayList) As Boolean
        Dim band As Boolean = False
        If AbrirConexion() Then
            Dim command As SqlCommand = Connection1.CreateCommand()
            Dim transaction As SqlTransaction
            Dim strSentencia As Object
            Dim sentencia As String = ""
            transaction = Connection1.BeginTransaction()
            command.Connection = Connection1
            command.Transaction = transaction
            Try
                For Each strSentencia In ListaSentencias
                    sentencia = strSentencia.ToString()
                    command.CommandText = sentencia.ToString()
                    command.ExecuteNonQuery()
                Next
                transaction.Commit()
                band = True
            Catch ex As Exception
                MessageBox.Show(ex.Message)
                Try
                    transaction.Rollback()
                Catch ex2 As Exception
                    MessageBox.Show(ex2.Message)
                End Try
            Finally
                CerrarConexion()
            End Try
        End If
        Return band
    End Function
Si la transaccion es satisfactoria veremos un mensaje de satisfaccion. la clase transaccion utiliza dos funciones dicionales de abrir y cerrar conexion que nos permite establecer si la conexion es correcta o no.
Public Function AbrirConexion() As Boolean
        Dim band As Boolean = False
        Connection1.Open()
        Try

            band = True
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try
        Return band
    End Function
    Public Function CerrarConexion() As Boolean
        Dim band As Boolean = False
        Connection1.Close()
        Try
            band = True
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try
        Return band
    End Function
ahora podremos ver nuestra informacion, en la base de datos.

domingo, 24 de junio de 2012

Video Tutoriales para JoomlaTutoriales para Joomla

Los videtutoriales llegaron para quedarse. Esta comprobado que para una persona "nueva" ver video tutoriales le facilita muchisimo el arco de aprendizaje. De esta forma queremos desde nuestro pequeño rincon ayudar a todos los novatos que se inician en este fantastico cms.

En estos momentos los siguientes videotutoriales se encuentran en fase de creacíon

Primera Parte:

Linux
- Instalación de servicios en linux (Apache/php/mysql/phpmyadmin)
- Instalación de Joomla en localhost

Windows
- Instalación de servicios en windows (Apache/php/mysql/phpmyadmin)
- Instalación de Joomla en localhost

Instalación desde Hosting
- Instalación (Configuracion de cuenta, mysql)
- Instalación desde el Fantastico (Cpanel)

Problemas Frecuentes:
- Solución al Save Path

Segunda Parte:

Idioma
Front de Joomla en español

Instalación
- Modulos
- Componentes
Instalación de los foros Simpleboard
- Templates

Backups
- Como realizar un backup completo de la base de datos Joomla
- Como restaurar un backup de la base de datos
- Ejemplo practico:
* Falla de tablas en joomla .. como volver todo a la normalidad

Nota: En el transcurso de las semanas se iran liberando los videotutoriales

Tambien puedes recomendar que videotutorial te gustaria ver.

Saludos y Buen Día