SQL 2008 incluye una nueva vista en MSDB que permite ver el historial de ejecución de la verificación de políticas definidas por el Policy Management Framework
select * from syspolicy_policy_execution_history_details
Trae un detalle como el siguiente

Saludos,
Eduardo Castro - Comunidad Windows - http://mswindowscr.org
Technorati Tags:
SQL Server 2008
Si se tienen que insertar más de una fila dentro de una tabla, usualmente se ejecuta el insert o procedimiento almacenado tantas veces como filas tenga, con los table valued parameters se pueden enviar múltiples filas de datos dentro un mismo TSQL sin necesidad de crear tablas temporales o haciendo múltiples llamadas.
Los Table Valued-Parameters son nuevos en SQL 2008
Primero tienes que crear el tipo que se va insertar
CREATE TYPE tipo_linea (consecutivo INT, _id INT, producto INT, cantidad INT);
Después se crea un procedimiento almacenado que recibe como parámetro ese tipo
CREATE PROC InsertarIventario (@_id INT, @datos_por_insertar tipo_linea)
AS
INSERT INTO tablainventario VALUES (@_id ... ) ;
INSERT INTO detalleinventario
SELECT * FROM @datos_por_insertar;
Slds
Eduardo Castro Comunidad Windows http://mswindowscr.org
Technorati Tags:
SQL Server 2008
Greg Liwood escribió un procedimiento para detectar los índices duplicados en SQL Server, lo cual ayuda a mejorar el desempeño.
exec sp_MSForEachTable 'usp_duplicateindexes''?'''
Here's the proc script:
USE master
GO
create procedure [dbo].[usp_duplicateindexes]
@tablename varchar(255)
as
set nocount on
print @tablename
--dump sp_helpindex into temp table
if object_id('tempdb..#helpindex') > 0 drop table #helpindex
create table #helpindex (
index_name varchar (900) not null primary key
, index_description varchar (1000) null
, index_keys varchar (1000) null)
insert #helpindex exec sp_helpindex @tablename
--add [inccols] to temp table & cursor over output, adding included col defs
alter table #helpindex add inccols varchar(1000) null
declare cr cursor for
select si.name, sc.name
from sysobjects so
join sysindexes si on so.id = si.id
join sys.index_columns ic on si.id = ic.object_id and si.indid = ic.index_id
join sys.columns sc on ic.object_id = sc.object_id and ic.column_id = sc.column_id
where so.xtype = 'U'
and so.name = @tablename
and ic.is_included_column = 1
order by si.name, ic.index_column_id
declare @siname varchar(1000), @scname varchar(1000)
open cr
fetch next from cr into @siname, @scname
while @@fetch_status = 0
begin
update #helpindex set inccols = isnull(inccols , '') + @scname + ', ' where index_name = @siname
fetch next from cr into @siname, @scname
end
update #helpindex set inccols = left(inccols, datalength(inccols) - 2) where right(inccols, 2) = ', '
close cr
deallocate cr
--dump duplicates into second temp table & pump results if there are any
if object_id('tempdb..#helpindex2') > 0 drop table #helpindex2
create table #helpindex2 (
index_name varchar (900) not null primary key
, index_description varchar (1000) null
, index_keys varchar (1000) null
, inccols varchar(1000) null
)
insert into #helpindex2
select hi.index_name, hi.index_description, hi.index_keys, hi.inccols
from #helpindex hi
join #helpindex h2 on hi.index_keys=h2.index_keys
and hi.index_description=h2.index_description
and hi.index_name<>h2.index_name
if @@rowcount > 0
select @tablename as "tablename", * from #helpindex2 order by index_name, index_keys, inccols
--cleanup temp objects
if object_id('tempdb..#helpindex2') > 0 drop table #helpindex2
if object_id('tempdb..#helpindex') > 0 drop table #helpindex
Slds
Eduardo Castro - Comunidad Windows http://mswindowscr.org
Antes de que llegara el Microsoft SQL Server 2005 al mercado, si usted deseaba que alguien tuviera acceso a ver, modificar, crear y ejecutar los SQL Server Agent Jobs, necesitaba darle permisos de Systems Administrator al login deseado de SQL Server, con el inconveniente que de también le iba a permitir hacer lo que deseara en esa instancia.
A partir del SQL Server 2005, se incluyeron los siguientes 3 roles:
SQLAgentUserRole: Los usuarios pueden crear jobs y manejar solo los jobs que ellos han creado.
SQLAgentReaderRole: Van a tener los privilegios del rol SQLAgentUserRole junto con la habilidad de enumerar y ver el historial de todos los jobs.
SQLAgentOperatorRole: Van a tener los mismos privilegios del rol SQLAgentReaderRole junto con la habilidad de ejecutar jobs locales de los cuales ellos no son dueños.
El procedimiento para asignarle permisos a un login en alguno de esos roles es el siguiente:
1. Agregue el usuario deseado a la base de datos "msdb":
USE [msdb]
GO
CREATE USER [MyUser] FOR LOGIN [MyUser]
GO
2. Asigne el rol deseado al usuario:
USE [msdb]
GO
EXEC sp_addrolemember 'SQLAgentUserRole', 'MyUser'
GO
Aporte de Hector Bejarano - http://citicr.org
Una de las grandes mejoras que recibió el Microsoft SQL Server 2008 es la capacidad de poder comprimir backups de manera nativa. Lo mejor de todo es que se puede lograr de una manera muy sencilla, solo necesita especificar COMPRESSION en la cláusula WITH del comando BACKUP. Por ejemplo:
BACKUP DATABASE Adventureworks
TO DISK = 'C:\Advc.bak'
WITH INIT, COMPRESSION
Para que tenga una idea del beneficio de esta nueva funcionalidad, si usted hace un backup de la base de datos ejemplo de SQL Server 2005 y SQL Server 2008 llamada "AdventureWorks", notará que un backup normal demanda 129 MB (hecho en 7.5 segundos) de espacio contra 35 MB (hecho en 3.8 segundos) cuando utiliza la compresión.
Por otra parte, cuando usted quiere restaurar no de estos backups, no necesita especificar nada adicional al comando de restore (La restauración del backup normal tomó 10.4 segundos contra 6.3 del backup comprimido).
Aporte de Hector Bejarano - http://citicr.org
Microsoft tiene disponible de forma gratuita un curso sobre las nuevas características de SQL Server 2008, puede inscribirse en la siguiente dirección 6187 e-Clinic: What's New in Microsoft SQL Server 2008
Slds,
Eduardo Castro
Comunidad Windows Costa Rica - http://mswindowscr.org
Comunidad TI bien social - http://citicr.org
Technorati Tags:
SQL Server
Los SQL Server Data Services son servicios de almacenamiento bajo demanda y consulta, está basado en SQL Server y Windows Server technologies, proveen alta disponiblidad, seguridad y estándares basados en web, con facilidades de programación, pueden bajar el beta esta dirección.
http://www.microsoft.com/sql/dataservices/default.mspx
Saludos,
Eduardo Castro
Comunidad Windows Costa Rica - http://mswindowscr.rog
Comunidad Social de TI - http://citicr.org
Muchas veces, nos encontramos con que necesitamos el número de fila en el cual se devolvieron los registros, por ejemplo, si hiciera una consulta que me devuelve 10 filas, puede que yo necesite una columna que me indique el número de fila, es decir, que me enumere del 1 al 10 las filas devueltas.
Pues bien, SQL 2005 implementa una nueva función que me devuelve el número de fila a partir de cierto criterio que yo especifique. La sintaxis es esta:
ROW_NUMBER () OVER (ORDER BY <order by column name>)
o
ROW_NUMBER () OVER (PARTITION BY <partition by column name>)
Por ejemplo, si necesitamos devolver la lista de empleados enumerados por orden de primer apellido, nuestra sentencia podría verse así:
SELECT ROW_NUMBER() OVER (ORDER BY Primer_Apellido) AS ROW, EmpID FROM Empleados
Aporte de Hector Bejarano
El SQL Server 2008 incluye una nueva característica llamada el gobernador de recursos, el cual ofrece varias maneras de manejar sus cargas de trabajo en SQL 2008.
Básicamente, usted puede definir o limitar los recursos que pueden utilizar sus instancias de SQL Server mediante reglas, de esta manera, usted podrá hacer cosas como:
- Especificar una cantidad máxima de solicitudes para grupos específicos
- Cantidad máxima de tiempo (segundos) que puede correr una solicitud para grupos específicos
- Asignar % de memoria a grupos específicos
- Mínimo y máximo de % de CPU y % de memoria para grupos específicos
- Grado de paralelismo (cantidad de operaciones simultáneas que pueden ser ejecutadas) para grupos específicos
Por ejemplo, digamos que tengo un servidor con SQL Server 2008 recién instalado, y quiero separar claramente grupos de trabajo según su función, es decir, yo quiero establecer claramente grupos para los siguientes tipos de solicitudes:
- Las que son hechas por mi aplicación (quiero darles un mínimo de 50% de procesador y se caracterizarán por provenir de una aplicación llamada "MiAplicación" o desde el Management Studio)
- Las que son hechas desde mi servidor de reportes (quiero darles un máximo de 50% de procesador y se caracterizarán por ser enviadas desde mi servidor de Report Server)
- Las que son hechas por los administradores (quiero darles un máximo de 10% de procesador y se caracterizarán por ser enviadas utilizando el usuario "sa")
La sintaxis para crear los grupos (sin especificar prioridades en el procesador de momento) sería la siguiente:
BEGIN TRAN
CREATE WORKLOAD GROUP groupAdhoc
CREATE WORKLOAD GROUP groupReports
CREATE WORKLOAD GROUP groupAdmin
GO
CREATE FUNCTION rgclassifier_v1() RETURNS SYSNAME
WITH SCHEMABINDING
AS
BEGIN
DECLARE @grp_name AS SYSNAME
IF (SUSER_NAME() = 'sa')
SET @grp_name = 'groupAdmin'
IF (APP_NAME() LIKE '%MANAGEMENT STUDIO%')
OR (APP_NAME() LIKE '%MiAplicacion%')
SET @grp_name = 'groupAdhoc'
IF (APP_NAME() LIKE '%REPORT SERVER%')
SET @grp_name = 'groupReports'
RETURN @grp_name
END
GO
ALTER RESOURCE GOVERNOR WITH (CLASSIFIER_FUNCTION= dbo.rgclassifier_v1)
COMMIT TRAN
GO
ALTER RESOURCE GOVERNOR RECONFIGURE
GO
En este punto, solo queda especificar las reglas de procesador para cada uno de los grupos. Para simplificar el ejemplo, solo crearemos la regla para las solicitudes de aplicación y queda a discreción del lector inferir las otras dos reglas:
BEGIN TRAN
ALTER RESOURCE POOL poolAdhoc
WITH (MIN_CPU_PERCENT = 50);
ALTER WORKLOAD GROUP groupAdhoc
USING poolAdhoc;
COMMIT TRAN
GO
ALTER RESOURCE GOVERNOR RECONFIGURE
GO
Aporte realizado por Hector Bejarano
Idera ha liberado un software gratuito que permite generar un T-Script para mover los logines y permisos de un servidor a otro. Puede mover solo una cuenta, una base de datos o toda la seguridad de todas las bases de datos. Pueden bajarlo en la siguiente dirección: http://www.idera.com/products/sqlpermissions/default.aspx?s=TL_WUG
Slds,
Eduardo Castro
Comunidad Windows Costa Rica - http://mswindowscr.org
Technorati Tags:
SQL Server
Cuando se recibe este error
New transaction cannot enlist in the specified transaction coordinator
Se debe a que el MSDTC no está configurado correctamente para corregirlo tienen que seguir los siguientes pasos:
- En el MSDTC hay que poner la configuración de autentication en No Requerida
- El Servicio de SQL Server tienen que iniciarse despues que se ha iniciado el MSDTC
- Hay que ir al Firewall de Windows habilitarlo, despues deshahbilitarlo y crear dos excepcones: una para el programa c:\windows\system32\msdtc.exe y otra para el puerto 135
- Esto se tiene que hacer tanto en la maquina donde está corriendo el cliente, por ejemplo el IIS tanto como en el SQL Server
El MSDTC tiene que estar configurado asi tanto en el server como en el cliente




Saludos,
Eduardo Castro - Comunidad Windows Costa Rica - http://mswindowscr.org
Chirag Patel escribió un artículo sobre cómo ejecutar un paquete de Integration Services desde un procedimiento almacenado, este es un buen utilitario que puede utilizarse en proyectos de inteligencia de negocios y datawarehouse, pueden leer el artículo en la siguiente dirección http://www.codeproject.com/KB/database/Call_SSIS_from_SP.aspx
Slds
Eduardo Castro
Comunidad Windows Costa Rica - http://mswindowscr.org
Encontré esta información sobre cómo limpiar el caché en SQL Server Reporting Services.
You can find information about scripting here:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/rsuiref/htm/cpu_rs_v1_5fxe.asp
You should also look at this:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/rsprog/htm/rsp_prog_soapapi_script_3249.asp
The flush cache method is here:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/rsprog/htm/rsp_ref_soapapi_service_ak_22i9.asp
You script will look something like this (not sure this is 100% correct)
Public Sub Main()
Dim items() As CatalogItem
items = rs.ListChildren("/", True)
Dim type as ItemTypeEnum
Dim item As CatalogItem
For Each item In items
type = rs.GetItemType(item)
if (type == ItemTypeEnum.Report || type == ItemTypeEnum.LinkedReport)
rs.FlushCache(item)
Next item
End Sub
I think I mixed in C# and VB.Net, but hopefully you can get the idea.
Saludos,
Eduardo Castro
Comunidad Windows Costa Rica http://mswindowscr.org
More Posts
Next page »