lunes, 31 de marzo de 2008

Nuevo paquete de actualización para SQL 2005...

...que hace el número 7 para el SP2. Aún no hay fecha exacta para su lanzamiento (sólo que ocurrirá dentro del próximo mes) ¿No sería mejor publicar ya de una vez el SP3?

Más información en Microsoft

miércoles, 19 de marzo de 2008

Eliminar usuarios alias

Los alias en SQL sirven para mapear un usuario en una bbdd. A partir de la versión 7.0 se sustituyen por los ‘Roles’, pero se conservan por compatibilidad con versiones anteriores.
Si la bbdd se crea a partir de versiones anteriores (backups o sp_attach) os encontraréis que estos alias aparecen como usuarios huérfanos . Sin emabargo en el Enterprise Manager o Managment Studio no hay señal de ellos.
Un ejemplo de cómo aparecen en sysusers o sys.sysusers :

status 16
name \nombre
roles NULL
altuid 5
hasdbaccess 0
islogin 1
isntname 0
isntgroup 0
isntuser 0
issqluser 0
isaliased 1
issqlrole 0
isapprole 0

Si analizamos el procedimiento sp_addalias, vemos que status= 16 indica que el usuario es un alias.
-- INSERT SYSUSERS ROW --
insert into sysusers select
@newuid, @status | 16, @loginame, @sid, 0x00,
getdate(), getdate(), @targuid, NULL

La barra inclinada [\] es otro distintivo que SQL Server añade al crear un nuevo alias con el fin de evitar conflictos en names space :

- ALTER NAME TO AVOID CONFLICTS IN NAME SPACE --
select @loginame = '\' + @loginame


i se intenta elimiar el alias con sp_dropalias resulta el siguiente error:

Server: Msg 15401, Level 11, State 1, Procedure sp_dropalias, Line 49
Windows NT user or group '[\nombre]' not found. Check the name again.

Sp_helpuser ‘\nombre’ tambíen da error:

Server: Msg 15198, Level 16, State 1, Procedure sp_helpuser, Line 189
The name supplied ([\nombre ]) is not a user, role, or aliased login.

La causa es que el alias está huérfano; el/los usuario/s a los que estaba asociado no existen en la base de datos.
La solución es crear un nuevo usuario al que se le asignará el mismo sid :

sp_addlogin @loginame = 'test, @passwd = 'test', @sid = 0x sid del alias

Y ahora ya se puede eliminar el alias:

Sp_dropalias ‘\nombre’

jueves, 13 de marzo de 2008

Configurar Database Mail en SQL Server 2005 para notificar Alertas

Un simple tutorial sobre cómo configurar la notificación mediante email.

Una vez que creáis la alerta, lo primero es habilitar Database Mail en SQL Server Surface Area Configuration (SQL Mail es el que aparecía en versiones anteriores y que necesitaba Outlook para funcionar)

A continuación en Managment- Database Mail, botón derecho y elegir la opción de configurar. Ahí poned nombre de la cuenta dirección de correo y el nombre del servidor de correo que usaréis (el resto de valores por defecto):

Siguiente
y finalizar

Necesitamos crear operadores a los cuales enviar los correos. En SQLServerAgent- Operadors, botón derecho y crear nuevo. Ahí rellenáis nombre y dirección de correo del operador

Debemos ahora habilitar el Agente:
en SQLServerAgent-Propiedades, seleccionar la terecera opción (Alerta) y clic en 'Mail Session'. como sistema selgís Database MAil (el que configuramos primero) y le asignáis el perfil o uno de los perfiles que anteriormente creastéis


Para que estos cambios tengan efecto en el Agente sólo queda reiniciarlo



miércoles, 12 de marzo de 2008

1Tb en menos de 30 minutos

El nuevo SSIS (SQL Server Integration Services, los nuevos DTS) integrado en SQL Server 2008 impresiona. El equipo de SQL Performance ha establecido un nuevo record mundial de carga en base de datos usando una herramienta ETL (Extract Transform and Load) Tenéis todos los detalles en su propia bitácora

Problema con SQLAgent.out

Este fichero es el log del agente de SQL Server. Generalmente no da ningún problema; pero ayer descubrimos que había crecido desmesuradamente, ocupando 27Gb de espacio.


Por si os pasa, revisad bien si algún trabajo ha sido recientemente deshabilitado, y algún proceso, por ejemplo una alerta, está repetidamente intentando ejecutarlo (mi caso)

viernes, 7 de marzo de 2008

VSS y NT Authority system login failure

SQL Server 2005 instala automáticamente el servicio SQL Server VSS Writer sin permiso, ni consentimiento; ni siquiera da la opción de configurarlo!

Este servicio lo emplean softwares de backup para, entre otras cosas, obtener información de archivos (de datos) abiertos (usandos por el motor SQl Server) (para más información recomiendo que leáis este artículo)

Windows 2003 incluye un servicio similar: VSSVC.exe (Volume Sow Copy Service)

Mediante una traza podemos ver qué hacen estos dos servicios:

SQL Server Writer:

select name, recovery_model_desc, state_desc, CONVERT(integer, is_in_standby) from master.sys.databases

Y para cada base de datos la siguiente consulta

select rtrim(physical_name),rtrim(type_desc),rtrim(state_desc), is_name_reserved from sys.master_files where DB_ID(N'database_name_here') = database_id


VSSVC.exe:

Exactamente lo mimso pero con otra sintáxis:

select name,convert (int,status) from master.dbo.sysdatabases

Y sobre cada bbdd:

select rtrim(filename),status & 64 from sysaltfiles where DB_ID(N'database_name_here') = dbid

Problema: Login failed for user 'NT AUTHORITY\SYSTEM'

Los dos servico VSS arrancan con 'local system account' . Una de las recomendaciones más básicas (recogio en el 'Best Practises' de Microsoft incluso) es la de eliminar los accesos de la cuenta 'builtin\administrators' (en SQL 2000 y 2005). en SQL2005 aparece una nueva cuenta, NT AUTHORITY\SYSTEM, ¿ similar a 'builtin'? Si ambas cuentas se eliminan, comienzan los 'login failures'

Como no tenemos control sobre lo que hacen los 2 servicios VSS (Volume Shadow Copy Service y/o SQL Server VSS Writer) o lo que pueden hacer a petición de un programa de backup, no me parece buena idea arrancar estos servicios con una cuenta que sea sysadmin de SQL Server (aunque esto eliminaría el problema de los login failures)


Como tampoco controlamos el software y los procedimientos de backup no parece buena elección desactivar los servicios, ya que podríamos estar cargándonos el sistema de backup de archivos abiertos.


Solucion intermedia:

En SQL 2000 añadir el login NT AUTHORITY\SYSTEM con permisos read-only sobre la master

En SQL 2005 limitar los permisos de NT AUTHORITY\SYSTEM a read-only sobre la master


Temas relacionados

Full text search también utiliza nt authority\system, y no sé si esta solucion afectaría a su funcionamiento pero eso es otra historia.

(entrada creada en colaboración con Javier González)

jueves, 6 de marzo de 2008

SQL Server Data Services (SSDS)

Microsoft anunció ayer, día 5, el lanzamiento en versión beta de SQL Server Data Services (también conocido como SSDS, le cogieron gusto a los acrónimos SS*S!)
¿Y en qué consiste este revolucionario producto, según venden en su sitio web? Principalmente en llevar SQL Server a la web de una forma barata; Microsoft se preocupa del software y el hardware y el cliente sólo de manejar los datos.
Algunas de sus caractrísticas son que soporta estándares basados en REST y en SOAP, puede alamacenar múltiples tipos de datos y no hay límite en cuanto al tamaño de datos almacenados en el sistema de clústers alojados en centros de datos de Microsoft.

En la página principal de este nuevo producto hay un enlaze a un "documento blanco" que en estos momentos está roto.

Os recomiendo echar un vistazo a las preguntas frecuentes oficiales (con su correspondiente respuesta) y las que acertadamente plantea Jamie Homson , que esperemos añadan a las primeras

lunes, 3 de marzo de 2008

DBCC Checktable

Según los libros en pantalla de SQL, este comando comprueba la integridad de todas las páginas y estructuras que constituyen la tabla o vista indicada
Pero además, en conjunción con Dbcc traceon (2704) muestra un lista de todas las celdas que contienen datos del tipo date-time corruptos

Dbcc traceon (2704)
Dbcc checktable (tablename)
Dbcc traceoff (2704)



Copiar permisos de un usuario

Os pongo un sencillo script que puede ser de utilidad si queremos copiar los permisos que un usuario tiene sobre los distintos objetos de una bbdd del tipo:

Grant References ON XTable TO user GO
Grant Select ON XTable TO user GO

El script genera a su vez otros scripts para poder reproducir estos permisos en otra bbdd



use db
go

create table #dba_user_rights(
Owner sysname,
Object sysname,
Grantee sysname,
Grantor sysname,
ProtectType char(10),
Action varchar(20),
Columna sysname
)

insert into #dba_user_rights EXEC ('sp_helprotect NULL, ''usuario''')


select protecttype + ' ' + action + ' ON ' + object + ' TO ' + grantee + ' GO 'from #dba_user_rights


drop table #dba_user_rights