jueves, 15 de diciembre de 2011

viernes, 11 de noviembre de 2011

Comprender Lockeos en SQL2000

http://msdn.microsoft.com/en-us/library/aa213039(v=sql.80).aspx

Hints en SQL server

Hints en SQL Server PDFImprimirE-mail
Escrito por Esteban Grinber
Martes, 31 de Julio de 2007 21:00
Los hints en SQL Server (y en la mayoria de las bases de datos relaciones del mercado), son agregados a un comando SQL que indica que debe ejecutarse de manera diferente a la predeterminada por el motor. Existen 4 tipos de hints diferentes:
  • Join Hints: Especifican que tipo de join (mergue, hash, loop) vamos a usar en la query.
  • Index Hints: Fuerzan el uso de uno o mas indices en la ejecucion de la query.
  • Lock Hints: Especifican un tipo de lockeo.
  • Processing Hints: Especifican una estrategia particular en la ejecucion de la query.

Hints en SQL Server

Los hints en SQL Server (y en la mayoria de las bases de datos relaciones del mercado), son agregados a un comando SQL que indica que debe ejecutarse de manera diferente a la predeterminada por el motor. Existen 4 tipos de hints diferentes:
  • Join Hints: Especifican que tipo de join (mergue, hash, loop) vamos a usar en la query.
  • Index Hints: Fuerzan el uso de uno o mas indices en la ejecucion de la query.
  • Lock Hints: Especifican un tipo de lockeo.
  • Processing Hints: Especifican una estrategia particular en la ejecucion de la query.
En situaciones normales, no se deberia utilizarlos, pero sin embargo, hay veces que es necesario. Por otra parte, en situaciones donde el volumen de informacion esta en constante cambio, es importante recordar que un hint puede funcionar bien el dia de hoy, pero no tan bien la semana siguiente. Es conveniente retestear todos las queries que utilizan hints periodicamente.

Join Hints:

HASH JOIN: Se utiliza cuando se quiere forzar el uso del HASH JOIN entre dos tablas.

Ejemplo:
SELECT title_id, pub_name, title FROM titles INNER HASH JOIN publishers ON titles.pub_id = publishers.pub_id

MERGE JOIN: Se utiliza cuando se quiere forzar el uso del MERGE JOIN entre dos tablas. Ejemplo: SELECT title_id, pub_name, title FROM titles INNER MERGE JOIN publishers ON titles.pub_id = publishers.pub_id

LOOP JOIN: Se utiliza cuando se quiere forzar el uso del LOOP JOIN entre dos tablas.
Ejemplo:

SELECT title_id, pub_name, title
FROM titles INNER LOOP JOIN publishers ON titles.pub_id = publishers.pub_id

Generalmente no deberiamos usar estos hints, pero si por alguna razon el motor no esta generando
el plan de ejecucion mas optimo, entonces es valida esta metodologia. Pero hay que tener CUIDADO en usarlo.

Index Hints:

Este tipo de hints, se utiliza cuando queremos forzar el uso de un indice en particular, para optimizar la consulta. El plan de ejecucion generado por el SQL Server suele ser el mas optimo, pero en algunos casos excepcionales, no. Al igual que con los Join Hints, hay que tener cuidado a la hora de usarlos.
Ejemplo para forzar un Table Scan:
SELECT * FROM authors WITH (INDEX(0))
Poniendo como ID de INDEX, el valor 0, se fuerza un Table Scan.


Ejemplo para forzar el uso del Clustered Index:
SELECT * FROM authors WITH (INDEX(1))

Poniendo como ID de INDEX, el valor 1, se fuerza el uso del indice Clustered de la tabla. En caso de que no existe, tira error.


Ejemplo para forzar el uso de un Non Clustered Index:
SELECT * FROM authors WITH (INDEX(NOMBRE_DEL_INDICE))


Lock Hints:

Por lejos, los mas usados. Este tipo de hints especifican que tipo de lockeo se debe efectuar en una operacion. Existen varios hints de este tipo, pero el mas usado es el NOLOCK y ROWLOCK.
NOLOCK: (equivalente al READUNCOMMITTED): Se usa en la sentencia SELECT. Indica al motor que ignore los a lockeos exclusivos de datos y lea directamente de la tabla, lo que
suele llamarse "lectura sucia". Con esto ganamos mayor performance y escalabilidad, pero al riesgo de leer datos de una transaccion que todavia no finalizo, lo que significa una perdida en la fiabilidad de los datos. Es un riesgo que tenemos que tener en cuenta. Por ejemplo, si queremos sacar un reporte de ventas entre dos periodos que ya terminaron, no tiene sentido realizar y verificar lockeos a la hora de leer, por lo cual un NOLOCK es totalmente valido. Pero si tenemos que leer datos entre periodos vigentes, donde pueden efectuarse transacciones, habria que evaluar el riesgo de leer datos que podrian llegar a ser invalidos. Algo importante que hay que aclarar, es que el NOLOCK no ignora TODOS los lockeos, de hecho, adquieren lockeos Sch-S (estabilidad del esquema). Por ejemplo, si se esta corriendo un comando DDL que afecte a la tabla, esta adquiere un lockeos Sch-M (modificación del esquema), y por lo tanto, si se ejecuta una consulta aun teniendo el hint NOLOCK, se bloqueara hasta que no termine la transaccion anterior.
En muchos sitios que requieren alta disponibilidad, se suele usar este hint en practicamente todas las sentencias SELECT, salvo en aquellas donde se quiere garantizar la integridad de los datos.
Ejemplo:
SELECT COUNT(*)
FROM Usuarios WITH (NOLOCK) INNER JOIN MenuUsuario WITH (NOLOCK) ON Usuarios.UsuarioID = MenuUsuario.UsuarioID
ROWLOCK: Especifica que se apliquen bloqueos de fila cuando normalmente se aplicarían bloqueos de página o de tabla.
Aplica solo a sentencias UPDATE, DELETE e INSERT. Tambien, como en el caso del NOLOCK, este hint sirve para ganar mayor performance en entornos muy concurrentes. Algo que hay que tener cuidado aca, es que si ocurren muchos update sobre la misma tabla, se puede saturar el servidor de tantos lockeos por fila
Ejemplo:
UPDATE Usuarios WITH (ROWLOCK) SET UsuarioID = 20 WHERE UsuarioID = 1

http://www.alejandrosueldo.com.ar/joomla15/index.php?option=com_content&view=article&id=33:hints-en-sql-server&catid=21:cursos-y-tutoriales&Itemid=2

martes, 27 de septiembre de 2011

SQL Triggers

ALTER TRIGGER [STK35].[OrdFsstkCntUpd]

ON [STK35].[ORDFS]

AFTER UPDATE

AS

declare @OrdFsStkCnt as decimal(12,2), @OrdfsIdPrd AS CHAR(18), @MSAG AS CHAR(100)

BEGIN

-- SET NOCOUNT ON added to prevent extra result sets from

-- interfering with SELECT statements.

SET NOCOUNT ON;

select @OrdFsStkCnt=OrdFsStkCn, @OrdfsIdPrd =OrdfsIdPrd FROM inserted

SET @MSAG = 'UPD' + @OrdfsIdPrd + ' - ' + CAST(@OrdFsStkCnt AS CHAR)

INSERT INTO [dbo].[DebugTrigger]([sqltxt]) values (@MSAG )



END

viernes, 9 de septiembre de 2011

Genexus 9.0 - Visual Fox - Leer TXT

/*
&Archivo C(200)
&CntError n(10)
&Error  c(100)
&i n(2)
&IdArchi n(10)
&Linea c(350)
*/
&Archivo='navegacion'                       
        Call('gxSelFile',&Archivo ,'C:\scastriotta\KBS\GX90\UTL\DATA002','HTML' ,'Archivo' , , 0 )
DBase   if file([!&Archivo!])
DBase   [!&IdArchi!] = FOPEN([!&Archivo!],0)       
        If &IdArchi  < 0
            Msg('Error al leer el archivo.')
        Else               
DBase       Store fseek([!&IdArchi!]  ,0) to top           
DBase       Do WHILE .NOT. FEOF([!&IdArchi!])
DBase           [!&Linea!] = FGETS([!&IdArchi!])
                if
            (StrSearch(&Linea,'Update on')>0) .or.
                        (StrSearch(&Linea,'Delete from')>0) .or.  
                        (StrSearch(&Linea,'Insert into')>0)
                Do Case
                    Case StrSearch(&Linea,'Update on')>0
                    &NavAcc = 'Update on'
                    Case StrSearch(&Linea,'Delete from')>0
                    &NavAcc = 'Delete from'
                    Case StrSearch(&Linea,'Insert into')>0
                    &NavAcc = 'Insert into'
                EndCase
               
                DBase           [!&Linea!] = FGETS([!&IdArchi!])
                DBase           [!&Linea!] = FGETS([!&IdArchi!])
                    new
                        NavTable=   &Linea
                        NavAcc  =   &NavAcc
                    endnew
                endif
DBase       EndDo
DBase       fclose([!&IdArchi!] )
            If &CntError = 0
                Msg('El archivo se proceso correctamente')
            Else
                &Error = 'El archivo se proceso con errores(' + trim(str(&CntError )) + ')'
                msg(&Error)
            EndIf
        EndIf
Dbase   Else
            Msg('Error al tratar de leer el archivo.')       
Dbase   Endif

jueves, 8 de septiembre de 2011

SQL ver tablas lockeadas

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

You can use sp_lock (and sp_lock2), but in SQL Server 2005 onwards this is being deprecated in favour of querying sys.dm_tran_locks:
select   
    object_name(P.object_id) as TableName,  
    resource_type, resource_description 
from 
    sys.dm_tran_locks L 
    join sys.partitions P on L.resource_associated_entity_id = p.hobt_id 

sp_lock
When reading sp_lock information, use the OBJECT_NAME( ) function to get the name of a table from its ID number, for example:
SELECT object_name(16003073)
EDIT :
There is another proc provided by microsoft which reports objects without the ID translation : http://support.microsoft.com/kb/q255596/

http://dev.mysql.com/doc/refman/5.0/es/lock-tables.html`

select

object_name(P.object_id) as TableName,

resource_type, resource_description

from

sys.dm_tran_locks L

join sys.partitions P on L.resource_associated_entity_id = p.hobt_id

http://msdn.microsoft.com/es-es/library/ms186301.aspx

SELECT OBJECT_NAME(23007163)

sp_who2

sp_who   http://msdn.microsoft.com/es-es/library/ms174313.aspx

sp_lock

viernes, 19 de agosto de 2011

Genexus - Tablas Temporales

Para poder utilizarlas este tipo de tablas en GeneXus se debe tener por un lado un DataView en donde la tabla por ejemplo llamada internamente en GeneXus 'MiTemporal' tenga asociado el nombre externo '#MiTemporal' esto nos permitirá utilizar el carácter '#' que dentro de GeneXus no esta permitido. Por otro lado antes de acceder a esta tabla es necesario ejecutar un comando de 'create' con una sentencia SQL, por ejemplo

SQL CREATE TABLE [#MiTemporal] ...

Esto creara la tabla temporal en la base y luego el resto de los programas GeneXus accederán a esta tabla sin diferenciarla de cualquier otra.

Genexus - Ejecutar Sentencia SQL

    &Sent = 'EXECUTE [GX90Ope].[dbo].[SelecProduc] '
    SQL [!&Sent!]

Genexus - SQL External Stores Procedures

List of external stored procedures : SelecProducIns SelecProducDel

Si son de in o out siempre poner output out

CREATE PROCEDURE [dbo].[SelecProducIns]
 @ProdCod int output
AS
BEGIN
 -- SET NOCOUNT ON added to prevent extra result sets from
 -- interfering with SELECT statements.
 SET NOCOUNT ON;
 BEGIN TRANSACTION
 INSERT INTO [dbo].[PRODSELEC]([SelProCod])
 SELECT [ProdCod]  FROM [dbo].[PRODUCTOS]  where ProdCod=@ProdCod
 COMMIT TRANSACTION
END

CREATE PROCEDURE [dbo].[SelecProducDel]
  @ProdCod int output
AS
BEGIN
 -- SET NOCOUNT ON added to prevent extra result sets from
 -- interfering with SELECT statements.
 SET NOCOUNT ON;
 BEGIN TRANSACTION
 delete   FROM [dbo].[PRODSELEC] where SelProCod=@ProdCod
 COMMIT TRANSACTION
END


//////////////////////////////////////////
extprog.ini en la razi de la kb

Si son de in o out siempre poner output out
[SelecProducIns]
ProgramType=StoredProcedure
ProgramName=SelecProducIns
ParmMode=out
ParmType=Number,4,0;
ParmName=ProdCod

[SelecProducDel]
ProgramType=StoredProcedure
ProgramName=SelecProducDel
ParmMode=out
ParmType=Number,4,0;
ParmName=ProdCod

////////////////////////////////////////


CALL('SelecProducIns', &ProdCod)
CALL('SelecProducDel', &ProdCod)

miércoles, 27 de julio de 2011

Frases

"El sabio no habla, los talentosos hablan, y los estúpidos discuten".





Una organización que mantiene a un mal jefe no puede pretender que la cultura corporativa sea una y la de esa persona otra, porque en última instancia, en la instancia cotidiana, prevalecerá la del jefe inmediato a quien el empleado ve y oye todos los días. Un buen jefe puede torcer una decisión ya tomada de irse de una organización.


lunes, 25 de julio de 2011

Visual Basic 6 - Zipear

http://www.elguille.info/colabora/vb/zip32dll.htm

http://winrar.com.es/descargas/fuentes

Genexus GXPublic Filtrar Fechas

Description : Como filtrar fecha en tablas Gxpublic 
 
Sorry, no English translation available; Spanish version displayed.
 
 
Detailed description 
Abstract: Para filtrar por campos fecha en tablas de gxpublic es necesario utilizar la nomenclatura :

{d 2002-02-02}
para time stamp:
{ts 2002-02-02 12:12:12}

en ambos casos ts o d pueden ir en mayúsculas o minúsculas.

Sólo se reconoce ese formato como fecha, con la d o ts y siempre entre llaves {} y no valen barras (/) ni otro separadores, sólo el guión (-) para día y sólo el dos puntos (:) para la hora. Además el minuto máximo es 59 y el día máximo es 39 :)

Por ejemplo
select * from Object where MdlId = 1 ANd ObjCreTS = {ts 2002-02-02 12:12:12}
%0d

http://www2.gxtechnical.com/gxtechyi/hscver01d.aspx?E%3B15%3B4%3B61%3B2%3B1%3BO%3B,2,11413

jueves, 21 de julio de 2011

Genexus - Acceder a la KB



Hasta la version 9 se utiliza GXPublic


Luego
.Net Data Provider for GeneXus Rocha
http://wiki.gxtechnical.com/commwiki/servlet/hwiki?.Net+Data+Provider+for+GeneXus+Rocha,

Tus programas con Key de seguridad

Codigo Visual Basic

Private Sub Command1_Click()
Dim objs
Dim obj
Dim WMI
Dim strMBD

Set WMI = GetObject("WinMgmts:")
Set objs = WMI.InstancesOf("Win32_BaseBoard")
For Each obj In objs
  strMBD = "MotherBoard Number:  " & obj.SerialNumber
Next
 Label1.Caption = strMBD
End Sub

miércoles, 13 de julio de 2011

SMTP para gmail

&smtpsession.Host = 'smtp.gmail.com'
&smtpsession.Port = 465
&smtpsession.UserName = 'torrilux@gmail.com'
&smtpsession.Password = 'xxxxxxxxx'
&smtpsession.Authentication = 1
&smtpsession.Secure = 1
&message.Subject = 'Prueba '
&message.From.Address = 'torrilux@gmail.com'
&message.From.Name = 'Jose Torres'
&message.To.New( 'LeandroG' , 'leandrominatel@gmail.com' )
&message.CC.New( 'LeandroH' , 'leandrominatel@hotmail.com' )
&smtpsession.Login( )
&smtpsession.Send( &message )
msg( &smtpsession.ErrDescription )

Genexus Errores - Class not registered

Abstract 
Puede ocurrir el Error "class not registered" "Clase no registrada" en varios casos al querer usar funcionalidades de GeneXus y lo que debe hacerse es registrar la clase que corresponda con el comando REGASM desde el prompt de DOS.
 
Descripción Detallada 
Nota: Ejecutar el comando desde la ventana RUN de Windows NO es efectivo.

Algunos casos son:

1) Al intentar abrir el editor de temas.
Solución: Ejecutar
C:\<WINNT>\Microsoft.NET\Framework\<v1.1.4322>\regasm c:\<gx80>\gxthemeeditor.exe

2) Al crear un nuevo modelo con el Wizard.
C:\<WINNT>\Microsoft.NET\Framework\<v1.1.4322>\regasm c:\<gx80>\WizardNewModel.exe

3) Al ejecutar el WSDL inspector
Solución: Ejecutar el comando:
C:\<WINNT>\Microsoft.NET\Framework\<v1.1.4322>\regasm c:\<gx80>\GXWSDLInspector.exe

Notas:
1. En el caso del editor de temas la causa puede ser también que falte copiar en el <windows>\system32 los archivos mfc7X.dll y msvcr7X.dll. (Estas dos DLL son instaladas por el .NET Framework SDK o Visual Studio .NET -el SDK no es requerimiento ya que dichas DLL se pueden distribuir).
2. Utilizar siempre el framework más nuevo, registrar con el regasm de la versión más nueva, en el ejemplo "v1.1.4322"
3. En caso de utilizar una versión superior a la 8.0, colocar el path de la versión correspondiente para registrar el editor de temas.
4. Si puede ejecutar el wizard en forma independiente, desde el explorador de Windows, es porque está levantando correctamente el framework 1.1. Es posible indicarle la versión del framework que se utiliza para llamar a los utilitarios dentro de GX (con Interop). Para esto definir un archivo Gxw32.Exe.Config (en el directorio de instalación de GeneXus) que contenga:
<?xml version ="1.0"?>
<configuration>
<startup>
<supportedRuntime version="v1.1.4322" />
</startup>
</configuration>

Por más información:
http://msdn2.microsoft.com/en-us/library/9w519wzk(VS.80).aspx - Explica cómo configurar el <app>.config para especificar el framework.

http://msdn2.microsoft.com/en-us/library/ms994381.aspx - Explica el por qué al ejecutar uno de los aplicativos .NET nuestros se levanta el framework correcto, pero cuando se hace a través de GX (interop) se levanta el último instalado.

Para usuarios con Windows Vista, o superior es requerimiento ejecutar los comando con la opción "Run as Administrator".

Genexus Errores Tips

c:\<WinDir>\Microsoft.net\framework\v2.0.50727\regasm.exe F:\ARCHIV~1\....\GXThemeEditor.exe
<path GX>\WizardNewModel.exe
<path GX>\GXWSDLInspector.exe

IIS
Agregar Sitio Web services
Propiedades
ASP .NET Version


Error Failed to access IIS metabase

%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis.exe –i


WRN: Assembly binding logging is turned OFF.

ESPECIFICAR TODO


GeneXus Fast Access Message: [Microsoft][SQL Server Native Client 10.0]Dialog failed
Mdac 2.7

 ejecuta el Rbld,  este te reconstruye la base de conocimiento sin cambiarte nada, 
    ve al DOS te pocisionas en tu base de conocimento,  es decir,  c:\mimodelo, luego. 
   c:\mimodelo c:\gxw75\rbld -y.

Usuario SQL GEX

USE [master]
GO
CREATE LOGIN [GEX] WITH PASSWORD=N'gexxeg' , DEFAULT_DATABASE=[TEST1], DEFAULT_LANGUAGE=[Español], CHECK_EXPIRATION=ON, CHECK_POLICY=ON
GO
USE [TEST1]
GO
CREATE USER [GEX] FOR LOGIN [GEX]
GO
USE [TEST1]
GO
EXEC sp_addrolemember N'db_accessadmin', N'GEX'
GO
USE [TEST1]
GO
EXEC sp_addrolemember N'db_backupoperator', N'GEX'
GO
USE [TEST1]
GO
EXEC sp_addrolemember N'db_datareader', N'GEX'
GO
USE [TEST1]
GO
EXEC sp_addrolemember N'db_datawriter', N'GEX'
GO
USE [TEST1]
GO
EXEC sp_addrolemember N'db_ddladmin', N'GEX'
GO
USE [TEST1]
GO
EXEC sp_addrolemember N'db_denydatareader', N'GEX'
GO
USE [TEST1]
GO
EXEC sp_addrolemember N'db_denydatawriter', N'GEX'
GO
USE [TEST1]
GO
EXEC sp_addrolemember N'db_owner', N'GEX'
GO
USE [TEST1]
GO
EXEC sp_addrolemember N'db_securityadmin', N'GEX'
GO



A connection was successfully established , but then an error ocurred during login process
Connection Error: (provider: Shared Memory Provider, error: 0 - No process is on the other end of the pipe

Reiniciar SQLServer

El usuario no esta asociado a una conexion SQL server de confianza

Esto es porque existen dos tipos de autentificación de cuentas una es con cuentas de Windows y la otra es Mixta (Windows y SQL), para corregirlo tenemos que abrir SQL Server y en el servidor vamos a Propiedades, en la pestaña de Security dentro de Authentication elegimos SQL Server and Windows.



][SQL Native Client]Error al asignar memoria


Crear inicio de Sesion SACXP\ASPNET

martes, 12 de julio de 2011

Visual Basic 6 - Rutinas - Coneccion

'Base de datos
Public Wks As DAO.Workspace
Dim db As DAO.Database
Public Rs As DAO.Recordset
Public sql As String







Public Function Conn(sql As String)
  Set Wks = DBEngine.Workspaces(0)
  Set db = Wks.OpenDatabase(Principal.UbicBD & "\BaseDatos.mdb", False, False, ";User=Admin;Pwd=xxxx")
  Set Rs = db.OpenRecordset(sql)
End Function


Public Function ConnSnap(sql As String)
  Set Wks = DBEngine.Workspaces(0)
  Set db = Wks.OpenDatabase(Principal.UbicBD & "\BaseDatos.mdb", False, False, ";User=Admin;Pwd=xxxx")
  Set Rs = db.OpenRecordset(sql, dbOpenSnapshot)
End Function


Public Function ConnFin()
  Rs.Close
  Set Rs = Nothing
  db.Close
  Set db = Nothing
  Wks.Close
  Set Wks = Nothing
End Function

viernes, 1 de julio de 2011

Consideraciones de seguridad para una instalación de SQL Server

Consideraciones de seguridad para una instalación de SQL Server


La seguridad resulta importante, no sólo para Microsoft SQL Server y Microsoft, sino también para todos los productos y empresas. Si aplica las siguientes prácticas recomendadas de seguridad, puede evitar muchas vulnerabilidades de seguridad. En este tema se tratan algunas prácticas recomendadas de seguridad que debe utilizar antes y después de instalar SQL Server. En los temas de referencia para estas características se incluyen directrices de seguridad para características específicas.


http://msdn.microsoft.com/es-es/library/ms144228(v=sql.90).aspx



Siga estas prácticas recomendadas cuando configure el entorno del servidor.

Mejorar la seguridad física

El aislamiento físico y lógico constituye la base de la seguridad de SQL Server. Para mejorar la seguridad física de la instalación de SQL Server, realice las siguientes tareas:
  • Coloque el servidor en una sala inaccesible para personas no autorizadas.
  • Coloque los equipos que alojan bases de datos en una ubicación protegida físicamente, como una sala de equipos cerrada con sistemas supervisados de detección de inundaciones y de extinción o detección de incendios.
  • Instale las bases de datos en una zona segura de la intranet corporativa que nunca esté conectada directamente a Internet.
  • Realice periódicamente una copia de seguridad de los datos y almacene las copias en una ubicación segura fuera de las instalaciones.

Usar firewalls

Los firewalls son fundamentales para garantizar la seguridad de la instalación de SQL Server. Los firewalls serán más efectivos si sigue estas instrucciones:
  • Instale un firewall entre el servidor e Internet.
  • Divida la red en zonas de seguridad separadas por firewalls. Bloquee todo el tráfico y, a continuación, admita sólo el necesario. 
  • En un entorno de varios niveles, utilice varios firewalls para crear subredes filtradas.
  • Si instala el servidor en un dominio de Windows, configure firewalls internos para permitir la autenticación de Windows. 
  • En un dominio de Windows en el que todas las versiones de Windows son Windows XP o Windows Server 2003 o versiones posteriores, deshabilite la autenticación NTLM. .
  • Si la aplicación utiliza transacciones distribuidas, debe configurar el firewall para permitir que el tráfico del Coordinador de transacciones distribuidas de Microsoft (MS DTC) fluya entre instancias independientes de MS DTC y entre MS DTC y administradores de recursos como SQL Server.

Aislar servicios

El aislamiento de servicios reduce el riesgo de que se utilice un servicio cuya seguridad se haya vulnerado para vulnerar la seguridad de otros servicios. Para aislar los servicios, siga estas instrucciones:
  • Siempre que sea posible, no instale SQL Server en un controlador de dominio.
  • Ejecute los servicios de SQL Server por separado en distintas cuentas de Windows.
  • En un entorno de varios niveles, ejecute la lógica Web y la lógica de negocios en equipos independientes.

Crear cuentas de servicio con privilegios mínimos

La instalación de SQL Server configura automáticamente las cuentas de servicio con los permisos necesarios para SQL Server. Cuando se modifican o se configuran los servicios de Windows utilizados por SQL Server 2005, sólo debería otorgar los permisos que precisan. Para obtener más información, vea Configurar cuentas de servicio de Windows.

Deshabilitar NetBIOS y Bloque de mensajes de servidor

Los servidores de la red perimetral deberían tener los protocolos innecesarios deshabilitados, incluido NetBIOS y Bloque de mensajes de servidor (SMB).
NetBIOS utiliza los siguientes puertos:
  • UDP/137 (servicio de nombre NetBIOS)
  • UDP/138 (servicio de datagrama NetBIOS)
  • TCP/139 (servicio de sesión NetBIOS)
SMB utiliza los siguientes puertos:
  • TCP/139
  • TCP/445
Los servidores Web y los servidores del Sistema de nombres de dominio (DNS) no requieren NetBIOS o SMB. En estos servidores, deshabilite los dos protocolos para mitigar la amenaza de enumeración de usuarios. Para obtener más información acerca de cómo deshabilitar estos protocolos, vea Cómo deshabilitar NetBIOS sobre TCP/IP y Cómo deshabilitar SMB (Server Message Block).
Tras la instalación, puede mejorar la seguridad de la instalación de SQL Server si sigue estas prácticas recomendadas relativas a las cuentas y los modos de autenticación:
Cuentas de servicio
  • Ejecute servicios de SQL Server con los privilegios mínimos.
  • Asocie los servicios de SQL Server con cuentas de Windows.
Modo de autenticación
  • Requiera la autenticación de Windows para las conexiones a SQL Server.
Contraseñas seguras
  • Asigne una contraseña segura a la cuenta sa.
  • Habilite siempre la comprobación de directivas de contraseñas.
  • Utilice contraseñas seguras en todos los inicios de sesión de SQL Server.