<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-6085569802552178014</id><updated>2011-11-27T18:03:51.350-06:00</updated><category term='Grupos anidados'/><category term='linked server'/><category term='Windows 2003'/><category term='Practicas Comunes'/><category term='ALTER AUTHORIZATION'/><category term='HP'/><category term='SQL Server Configuration Manager'/><category term='rebuild'/><category term='tryParseExact'/><category term='Logins'/><category term='Smart Array'/><category term='perc'/><category term='cluster'/><category term='instancia'/><category term='schema'/><category term='reorganize'/><category term='default_schema'/><category term='SQL 2005'/><category term='SP3'/><category term='CU1'/><category term='migrate'/><category term='migración'/><category term='role'/><category term='memoria'/><category term='OpenManage'/><category term='Windows Installer.'/><category term='clonado'/><category term='dell'/><category term='permisos'/><category term='restore'/><category term='Tomcat'/><category term='7-zip'/><category term='esquemas'/><category term='PowerShell'/><category term='WMI'/><category term='Event Viewer'/><category term='SQL 2000'/><category term='auditoría'/><category term='Windows Installer'/><category term='wbinfo'/><category term='parseexact'/><category term='firmware'/><category term='backup Device'/><category term='SMO'/><category term='Disaster Recovery'/><category term='model'/><category term='login huérfano'/><category term='backup'/><title type='text'>Practicas Comunes</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://practicascomunes.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6085569802552178014/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://practicascomunes.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>practicascomunes@gmail.com</name><uri>http://www.blogger.com/profile/12750935224135642825</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>30</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-6085569802552178014.post-9027090164216349717</id><published>2010-02-26T20:01:00.001-06:00</published><updated>2010-02-26T20:01:05.280-06:00</updated><title type='text'>Book Review: Pro SQL Server 2008 Failover Clustering</title><content type='html'>&lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.amazon.com/gp/product/1430219661?ie=UTF8&amp;amp;tag=practcomun-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=1430219661" target="_blank"&gt;Pro SQL Server 2008 Failover Clustering&lt;/a&gt;, by Alan Hirt is over 370 pages about installing, configuring and tuning your SQL Server 2008 failover cluster. This book is a must read for everyone interested in migrating SQL 2005 in a failover cluster to SQL 2008 on Windows 2008 or anyone who just want to know some basic aspects about clustering in Windows 2008, some concepts also work for SQL 2005.&lt;/p&gt;  &lt;p&gt;The book cover the following topics:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Failover Clustering Basics &lt;/li&gt;    &lt;li&gt;Preparing to Cluster Windows &lt;/li&gt;    &lt;li&gt;Clustering Windows Server 2008 Part 1: Preparing Windows &lt;/li&gt;    &lt;li&gt;Clustering Windows Server 2008 Part 2: Clustering Windows &lt;/li&gt;    &lt;li&gt;Preparing to Cluster SQL Server 2008 &lt;/li&gt;    &lt;li&gt;Installing a New SQL Server 2008 Failover Clustering Instance &lt;/li&gt;    &lt;li&gt;Upgrading to SQL Server 2008 Failover Clustering &lt;/li&gt;    &lt;li&gt;Administering a SQL Server 2008 Failover Cluster &lt;/li&gt;    &lt;li&gt;Virtualization and Failover Clustering. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;I’m right now following chapter by chapter the entire book to configure my SQL Server 2008 on my Windows 2008 cluster. What I liked the most about this book is that it teachs you how to configure anything using GUI, commands and PowerShell.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Failover Clustering Basics:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;This chapter talks about some very basic aspects of clustering, before you actually even touch the server, the things you must know. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Preparing to Cluster Windows      &lt;br /&gt;&lt;/strong&gt;This chapter starts explaining the concepts about clustering in Windows 2008, how to create them, quorum configuration, about the changes about the account that runs the cluster.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Clustering Windows Server 2008 Part 1: Preparing Windows&lt;/strong&gt; &lt;/p&gt;  &lt;p&gt;This chapter talks about networking (I think I should have talked about disabling TCP Offload, RSS, TCPA, etc), windows 2008 features to enable and expand more about the special account that runs the cluster.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Clustering Windows Server 2008 Part 2: Clustering Windows &lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;It explains about the validations you should run in your cluster, before installing anything, quorum configurations.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Preparing to Cluster SQL Server 2008&lt;/strong&gt; &lt;/p&gt;  &lt;p&gt;This chapter starts talking about SQL 2008,&amp;#160; what is clusterable and what not and some considerations you should be aware and what they entail.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Installing a New SQL Server 2008 Failover Clustering Instance&lt;/strong&gt; &lt;/p&gt;  &lt;p&gt;This chapter talks about the installation steps in SQL 2008, it guides step by step toward the end and it is very useful, you can follow easily these steps and configure your cluster in minutes.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Upgrading to SQL Server 2008 Failover Clustering&lt;/strong&gt; &lt;/p&gt;  &lt;p&gt;This talks about some considerations you should be aware if you are migrating from SQL 2000 or SQL 2005, very helpful, there other books that covers this more deeply though.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Administering a SQL Server 2008 Failover Cluster &lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;This chapter talks about some related things you may be into, after you have your cluster up and running, like adding disks, nodes, changing ips, etc&lt;/p&gt;  &lt;p&gt;To sum up, I deeply recommend this book to anyone involved in installing and migrating SQL servers to SQL 2008&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6085569802552178014-9027090164216349717?l=practicascomunes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://practicascomunes.blogspot.com/feeds/9027090164216349717/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6085569802552178014&amp;postID=9027090164216349717' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6085569802552178014/posts/default/9027090164216349717'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6085569802552178014/posts/default/9027090164216349717'/><link rel='alternate' type='text/html' href='http://practicascomunes.blogspot.com/2010/02/book-review-pro-sql-server-2008.html' title='Book Review: Pro SQL Server 2008 Failover Clustering'/><author><name>practicascomunes@gmail.com</name><uri>http://www.blogger.com/profile/12750935224135642825</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6085569802552178014.post-3128332359049927914</id><published>2009-08-20T16:19:00.001-05:00</published><updated>2009-08-20T16:20:30.857-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL 2005'/><title type='text'>Obteniendo las tablas con mas registros.</title><content type='html'>Que tal,&lt;br /&gt;&lt;br /&gt;Recientemente estaba tratando de ver las tablas que mas consumían espacio en todas las bases de datos, encontré un script en un blog que mostraba el total de registros en la base de datos, pero yo quería que fuera para todas las bases de datos.&lt;br /&gt;&lt;br /&gt;Así que le hice unos pequeños cambios para que funcionara con todas las bases de datos.&lt;br /&gt;&lt;br /&gt;Les comparto el script, esta probado en SQL 2005 aunque debería funcionar en SQL 2008.&lt;br /&gt;&lt;br /&gt;El script no hace un count(*) a todas las tablas, sino que va directamente a las tablas de sistema:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;SET ANSI_NULLS ON&lt;br /&gt;GO&lt;br /&gt;SET QUOTED_IDENTIFIER ON&lt;br /&gt;GO&lt;br /&gt;CREATE PROCEDURE [dbo].[BPSQL_Select_big_tables] &lt;br /&gt;AS&lt;br /&gt;BEGIN&lt;br /&gt; SET NOCOUNT ON;&lt;br /&gt;&lt;br /&gt;DECLARE @dbname2 varchar(40);&lt;br /&gt;declare @id varchar(30);&lt;br /&gt;&lt;br /&gt;DECLARE dbname CURSOR FOR select name,database_id from master.sys.databases where database_id&gt;4&lt;br /&gt;&lt;br /&gt;create table #tablas(&lt;br /&gt;base_de_datos varchar(128),&lt;br /&gt;tabla varchar(128),&lt;br /&gt;total int&lt;br /&gt;)&lt;br /&gt;&lt;br /&gt;OPEN dbname&lt;br /&gt;FETCH NEXT FROM dbname&lt;br /&gt;INTO @dbname2,@id&lt;br /&gt;&lt;br /&gt;WHILE @@FETCH_STATUS = 0&lt;br /&gt;   BEGIN  &lt;br /&gt;&lt;br /&gt;exec('SET NOCOUNT ON&lt;br /&gt; use [' + @dbname2 + ']&lt;br /&gt; insert #tablas&lt;br /&gt;    &lt;br /&gt; SELECT b.name,OBJECT_NAME(object_id) AS [Table Name], SUM(Rows) AS [Row Count] &lt;br /&gt;    FROM sys.partitions,sys.databases b&lt;br /&gt;    WHERE index_id &lt; 2 &lt;br /&gt;    and OBJECT_NAME(object_id) not like ''%sys%'' and OBJECT_NAME(object_id) not like ''%queue%'' &lt;br /&gt; and OBJECT_NAME(object_id) &lt;&gt; ''dtproperties'' and b.database_id='+@id+'&lt;br /&gt;    GROUP BY object_id,b.name&lt;br /&gt;    ORDER BY SUM(Rows) DESC')&lt;br /&gt;&lt;br /&gt;FETCH NEXT FROM dbname INTO @dbname2,@id&lt;br /&gt;END&lt;br /&gt;&lt;br /&gt;CLOSE dbname &lt;br /&gt;DEALLOCATE dbname&lt;br /&gt;&lt;br /&gt;select top 100 *&lt;br /&gt;from #tablas&lt;br /&gt;order by 3 desc&lt;br /&gt;drop table #tablas&lt;br /&gt;&lt;br /&gt;END&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6085569802552178014-3128332359049927914?l=practicascomunes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://practicascomunes.blogspot.com/feeds/3128332359049927914/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6085569802552178014&amp;postID=3128332359049927914' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6085569802552178014/posts/default/3128332359049927914'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6085569802552178014/posts/default/3128332359049927914'/><link rel='alternate' type='text/html' href='http://practicascomunes.blogspot.com/2009/08/obteniendo-las-tablas-con-mas-registros.html' title='Obteniendo las tablas con mas registros.'/><author><name>practicascomunes@gmail.com</name><uri>http://www.blogger.com/profile/12750935224135642825</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6085569802552178014.post-6714271611494238996</id><published>2009-07-28T15:19:00.002-05:00</published><updated>2009-07-28T15:26:28.668-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL 2005'/><category scheme='http://www.blogger.com/atom/ns#' term='permisos'/><title type='text'>Revisando si existen permisos directos a los usuarios.</title><content type='html'>Una de las best practices en la administración de bases de datos, es asignar los permisos solo a los roles y no a los users o grupos, esto hace que las migraciones, planes de DRP, etc sean más sencillas.&lt;br /&gt;&lt;br /&gt;Una de las formas de asegurar que se cumple con esta política en SQL 2005 es correr un script que indique si existen permisos directos a los users o grupos, en lugar de los roles.&lt;br /&gt;&lt;br /&gt;Les comparto un script que hice, en el que se revisan en todas las bases de datos del servidor si se asignaron permisos directos, en caso de ser así, regresará la base de datos, el user, el tipo de permiso y la tabla, SP, etc.&lt;br /&gt;&lt;br /&gt;Espero les sirva, yo lo corro diariamente en todos los servidores.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;em&gt;/* Revisa si existen usarios que tengan permisos directos en cada base de datos */&lt;br /&gt;DECLARE @dbname2 varchar(40);&lt;br /&gt;declare @id varchar(30);&lt;br /&gt;&lt;br /&gt;DECLARE dbname CURSOR FOR select name,database_id from master.sys.databases;&lt;br /&gt;&lt;br /&gt;CREATE TABLE #Permisos_Users(&lt;br /&gt; [base_de_datos] [varchar](128) NULL,&lt;br /&gt; [usuario] [varchar](128) NULL,&lt;br /&gt; [tipo_permiso] [varchar](128) NULL,&lt;br /&gt; [objeto] [varchar](128) NULL&lt;br /&gt;) &lt;br /&gt;&lt;br /&gt;OPEN dbname&lt;br /&gt;FETCH NEXT FROM dbname&lt;br /&gt;INTO @dbname2,@id&lt;br /&gt;&lt;br /&gt;WHILE @@FETCH_STATUS = 0&lt;br /&gt;   BEGIN  &lt;br /&gt;   exec('SET NOCOUNT ON;&lt;br /&gt;    use [' + @dbname2 + ']&lt;br /&gt;    INSERT #Permisos_Users&lt;br /&gt;    select d.name,b.name,a.permission_name,c.name from sys.database_permissions a inner join sys.database_principals b on a.grantee_principal_id=b.principal_id &lt;br /&gt;    inner join sys.objects c on a.major_id=c.object_id,sys.databases d where b.type_desc in (''SQL_USER'',''WINDOWS_USER'',''WINDOWS_GROUP'') and b.default_schema_name is not null &lt;br /&gt;    and b.name &lt;&gt; ''dbo'' and b.name &lt;&gt; ''guest'' and a.permission_name &lt;&gt; ''CONNECT'' and convert(varchar,d.database_id)='+@id+'')&lt;br /&gt;&lt;br /&gt; FETCH NEXT FROM dbname INTO @dbname2,@id&lt;br /&gt;END&lt;br /&gt;&lt;br /&gt;  CLOSE dbname &lt;br /&gt;  DEALLOCATE dbname&lt;br /&gt;&lt;br /&gt;select * from #Permisos_Users&lt;br /&gt;&lt;br /&gt;drop table #Permisos_Users&lt;/em&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6085569802552178014-6714271611494238996?l=practicascomunes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://practicascomunes.blogspot.com/feeds/6714271611494238996/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6085569802552178014&amp;postID=6714271611494238996' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6085569802552178014/posts/default/6714271611494238996'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6085569802552178014/posts/default/6714271611494238996'/><link rel='alternate' type='text/html' href='http://practicascomunes.blogspot.com/2009/07/revisando-si-existen-permisos-directos.html' title='Revisando si existen permisos directos a los usuarios.'/><author><name>practicascomunes@gmail.com</name><uri>http://www.blogger.com/profile/12750935224135642825</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6085569802552178014.post-4116750931340789767</id><published>2009-07-17T19:56:00.003-05:00</published><updated>2009-07-17T20:31:29.179-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='reorganize'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL 2005'/><category scheme='http://www.blogger.com/atom/ns#' term='rebuild'/><title type='text'>Planes de mantenimiento en SQL</title><content type='html'>Muchas veces me he topado, que en diferentes empresas tienen planes de mantenimiento de SQL en el que, por ejemplo, una vez a la semana hacen un reorganize, rebuild y despues un "Update Statistics" a todas las bases de datos operativas.&lt;br /&gt;&lt;br /&gt;Lo he visto configurado así y me sorprendo que así lo tengan, es común verlo en las que el DBA está por accidente.&lt;br /&gt;&lt;br /&gt;Este tipo de mantenimientos no deberían de estar al mismo tiempo, ya que es redundante, es un desperdicio de recursos y en ocasiones hasta puede salir contraproducente.&lt;br /&gt;&lt;br /&gt;Lo que idealmente debería pasar es estar monitoreando el nivel de fragmentacion de los indices, si los indices tienen menos de un 30% de fragmentacion, entonces aplicaría un reorganize y si es mas alto entonces un rebuild, un rebuild es mucho mas costoso en performance pero es más efectivo, si se tiene la versión Enterprise de SQL 2005, se puede hacer Online y de esta manera no se afecta a los usuarios, excepto aquellas tablas que tengan columnas LOB, idealmente se debería hacer sobre demanda en las tablas que lo necesiten.&lt;br /&gt;&lt;br /&gt;Esto es idealmente, si tienes una base de datos en las que se hacen muchos cambios (INSERT, DELETE, UPDATE) entonces lo recomendable es que se haga solamente un rebuild, en el momento mas oportuno, cuando no afecte la operación, si tienes la versión Enterprise de SQL 2005/2008 entonces se puede hacer Online.&lt;br /&gt;&lt;br /&gt;Tambien se podría hacer un reorganize O un update statistics diario y aunque no son tan efectivos como el rebuild tambien ayudan a mejorar el performance y no tienen afectación a los usuarios.&lt;br /&gt;&lt;br /&gt;Voy a estar compartiendo mas informacion sobre este tema más adelante.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6085569802552178014-4116750931340789767?l=practicascomunes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://practicascomunes.blogspot.com/feeds/4116750931340789767/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6085569802552178014&amp;postID=4116750931340789767' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6085569802552178014/posts/default/4116750931340789767'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6085569802552178014/posts/default/4116750931340789767'/><link rel='alternate' type='text/html' href='http://practicascomunes.blogspot.com/2009/07/planes-de-mantenimiento-en-sql.html' title='Planes de mantenimiento en SQL'/><author><name>practicascomunes@gmail.com</name><uri>http://www.blogger.com/profile/12750935224135642825</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6085569802552178014.post-7125154152328942422</id><published>2009-07-17T19:53:00.002-05:00</published><updated>2009-07-17T19:56:08.848-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tomcat'/><title type='text'>Apuntes sobre Tomcat en Windows.</title><content type='html'>Recientemente estuve trabajando con Tomcat corriendo sobre Windows y después de estar trabajando con el por unos días tengo algunos tips que les pueden ser útiles.&lt;br /&gt;&lt;br /&gt;Las versiones que utilizé fueron Tomcat 6.0.16 con Java 6 Update 7, pero podrían aplicar sobre otras versiones.&lt;br /&gt;&lt;br /&gt;Aqui van algunos tips:&lt;br /&gt;&lt;br /&gt;En el server.xml modificar la parte de logueo, ya que por default está deshabilitado y configurarlo para que no haga un resolve:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log." suffix=".txt" pattern="combined" resolveHosts="false"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Si se van a tener contextos en los que constantemente se van a estar actualizando las aplicaciones, en produccion, por ejemplo, entonces hay que cambiar el archivo context.xml con las opciones antiResourceLocking="true" antiJARLocking="true" reloadable="true", modificarlo de:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Context&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;a&lt;br /&gt;&lt;span style="font-style:italic;"&gt;&lt;br /&gt;Context path="" antiResourceLocking="true" antiJARLocking="true" reloadable="true" cachingAllowed="false"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Al hacer esto todas las aplicaciones se copiarán al folder temp y desde ahí se van a servir y automaticamente se hara un deploy en caso de ser necesario. Esto es necesario porque en Windows los archivos se queden "lockeados" y las aplicaciones no se "recargan" completamente.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Si se configura de esta manera y tambien se tienen archivos estáticos, hay que configurar el contexto en el server.xml para excluirlo, de otra manera el contenido nuevo nunca se va a mostrar (a menos que se esté reiniciando el servicio de Tomcat).&lt;br /&gt;&lt;br /&gt;Así quedaría:&lt;br /&gt;&lt;span style="font-style:italic;"&gt;&lt;br /&gt;Context path="/mifolder" antiResourceLocking="false" antiJARLocking="false" reloadable="false" override="true"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Tambien es recomendable configurar la memoria RAM que puede utilizar el tomcat, desde el archivo tomcatw.exe (en el folder bin), aquí se puede configurar la RAM mínima y máxima que puede utilizar el Tomcat.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Espero les sirvan estos tips.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6085569802552178014-7125154152328942422?l=practicascomunes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://practicascomunes.blogspot.com/feeds/7125154152328942422/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6085569802552178014&amp;postID=7125154152328942422' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6085569802552178014/posts/default/7125154152328942422'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6085569802552178014/posts/default/7125154152328942422'/><link rel='alternate' type='text/html' href='http://practicascomunes.blogspot.com/2009/07/apuntes-sobre-tomcat-en-windows.html' title='Apuntes sobre Tomcat en Windows.'/><author><name>practicascomunes@gmail.com</name><uri>http://www.blogger.com/profile/12750935224135642825</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6085569802552178014.post-643257456322362502</id><published>2009-06-26T19:32:00.003-05:00</published><updated>2009-06-29T19:37:59.790-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenManage'/><category scheme='http://www.blogger.com/atom/ns#' term='dell'/><category scheme='http://www.blogger.com/atom/ns#' term='clonado'/><category scheme='http://www.blogger.com/atom/ns#' term='perc'/><title type='text'>Clonando servidores a través de los discos.</title><content type='html'>Que tal,&lt;br /&gt;&lt;br /&gt;Tal vez alguna vez han estado en una situación en la que se necesita "clonar servidores", pero no se tiene una herramienta como Altiris, Ghost, etc, si los servidores son del mismo modelo, mismos discos (velocidad, capacidad, etc) y misma tarjeta controladora PERC es posible hacer un clonado de los discos sin instalar nada y se tienen servidores identicos.&lt;br /&gt;&lt;br /&gt;Esto lo acabo de hacer con servidores Dell con RAID 1, controladora PERC, 2 discos en espejo.&lt;br /&gt;&lt;br /&gt;Aqui van los pasos:&lt;br /&gt;&lt;br /&gt;1. Sacar del dominio (en caso de estar en alguno) al servidor, de preferencia tener instalado el OpenManage Server Administrator.&lt;br /&gt;2. Apagar el servidor y sacarle uno de los discos.&lt;br /&gt;3. Al nuevo servidor apagarlo tambien y sacarle uno de los discos, de preferencia del mismo lado.&lt;br /&gt;4. Encender el equipo y entrar a la controladora de la PERC (Ctrl+M), navegar en la configuracion hasta la parte donde vienen los discos duros y marcar el disco original (no el que le acabamos de poner) como offline, lo que hará esto, es marcar el disco como degradado y ya no lo tomará en cuenta para bootear ni nada.&lt;br /&gt;5. Reiniciar el equipo, al iniciar entrar al Server Administrator, navegar hasta el disco marcado como degradado y forzar un rebuild, con esto se empezará a reconstruir el disco que ya tenia el servidor con la nueva información.&lt;br /&gt;6. Ahora, con el disco que habiamos sacado del servidor, meterselo de nuevo al servidor y hacer el mismo procedimiento, encender el servidor, entrar a la controladora, marcar el disco que acabamos de poner como degragado y encender el equipo.&lt;br /&gt;7. Entrar al OpenManage Server Administrator y forzar un rebuild.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Con esto se tienen 2 servidores iguales, sin hacer nada de configuracion, puede sonar un poco complicado y riesgoso, pero es muy efectivo.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6085569802552178014-643257456322362502?l=practicascomunes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://practicascomunes.blogspot.com/feeds/643257456322362502/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6085569802552178014&amp;postID=643257456322362502' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6085569802552178014/posts/default/643257456322362502'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6085569802552178014/posts/default/643257456322362502'/><link rel='alternate' type='text/html' href='http://practicascomunes.blogspot.com/2009/06/clonando-servidores-traves-de-los.html' title='Clonando servidores a través de los discos.'/><author><name>practicascomunes@gmail.com</name><uri>http://www.blogger.com/profile/12750935224135642825</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6085569802552178014.post-6615822737128001632</id><published>2009-06-19T15:42:00.003-05:00</published><updated>2009-06-19T15:53:31.168-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WMI'/><category scheme='http://www.blogger.com/atom/ns#' term='cluster'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows 2003'/><category scheme='http://www.blogger.com/atom/ns#' term='PowerShell'/><title type='text'>Getting the file share resources properties from a Windows 2003 cluster.</title><content type='html'>Recently I was asked to do a script that generate a script to recreate all the file share resources from a Windows 2003.&lt;br /&gt;&lt;br /&gt;I'm sharing the script I did, I'm using PowerShell, to run it needs the cluster name to connect to, then via WMI will get all the shares and using the tool cluster.exe (Available if you have the Administrative Tools) will get all the resource properties.&lt;br /&gt;&lt;br /&gt;I run it every day in all my clusters, it creates a folder with the day it run, so you can run it everyday and have all the historical changes.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;# Process to generate the script to re-create the file share resources from a Windows 2003 cluster.&lt;br /&gt;# It needs the cluster name as a parameter and it generates the script with the configuration from each resource.&lt;br /&gt;# The new cluster name will be NEWCLUSTER so you need to change it before run it.&lt;br /&gt;&lt;br /&gt;param([string]$ServerOp) # Cluster Server Name.&lt;br /&gt;$mydate = get-date -uformat "%Y%m%d"&lt;br /&gt;$FolderScripts = "d:\DRCluster\scripts\$mydate\"  # It will create this folder, so we have a folder by date.&lt;br /&gt;$FileLog="d:\DRCluster\logs\DrCluster_$mydate.log" # Log File Name&lt;br /&gt;&lt;br /&gt;clear-host&lt;br /&gt;if (!$ServerOp){ throw "You must specify the cluster name" }&lt;br /&gt;&lt;br /&gt;$f = [System.IO.Path]::Combine($FolderScripts, $ServerOp + "_shares.txt")&lt;br /&gt;[string]$hora=get-date -uformat "[%r]"&lt;br /&gt;out-file -filepath $FileLog -inputobject "#############################################################################################################################################" -append&lt;br /&gt;out-file -filepath $FileLog -inputobject "  " -append&lt;br /&gt;out-file -filepath $FileLog -inputobject "                                  PROCESS TO GENERATE THE SCRIPT TO RECREATE THE CLUSTER: $hora  " -append&lt;br /&gt;out-file -filepath $FileLog -inputobject "  " -append&lt;br /&gt;out-file -filepath $FileLog -inputobject "#############################################################################################################################################" -append&lt;br /&gt;out-file -filepath $FileLog -inputobject "  " -append&lt;br /&gt;&lt;br /&gt;[string]$hora=get-date -uformat "[%r]"&lt;br /&gt; if (!(Test-Path $FolderScripts)) {&lt;br /&gt;  out-file -filepath $FileLog -inputobject "$hora The folder $FolderScripts is created" -append&lt;br /&gt;  md $FolderScripts | Out-Null&lt;br /&gt;  if($? -ne $True) {&lt;br /&gt;   out-file -filepath $FileLog -inputobject "$hora ERROR: Couldn't create the folder: $FolderScripts" -append&lt;br /&gt;   throw "The folder $FolderScripts could not be created"&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;$f = [System.IO.Path]::Combine($FolderScripts, $ServerOp + "_shares.txt")&lt;br /&gt;out-file -filePath $f -inputobject "REM ######################################################################################################## " -Encoding ASCII&lt;br /&gt;out-file -filePath $f -inputobject "REM             SCRIPT TO RECREATE THE SHARES IN ANOTHER CLUSTER" -Append -Encoding ASCII&lt;br /&gt;out-file -filePath $f -inputobject "REM              VERIFY DRIVES AND CLUSTER NAME BEFORE RUN IT! " -Append -Encoding ASCII&lt;br /&gt;out-file -filePath $f -inputobject "REM ######################################################################################################## " -Append -Encoding ASCII&lt;br /&gt;out-file -filePath $f -inputobject "    " -Append -Encoding ASCII&lt;br /&gt;out-file -filePath $f -inputobject "    " -Append -Encoding ASCII&lt;br /&gt;&lt;br /&gt;[string]$hora=get-date -uformat "[%r]"&lt;br /&gt;out-file -filepath $FileLog -inputobject "$hora Getting the shares..." -append&lt;br /&gt;$shares = Get-WMIObject Win32_Share -Computer $ServerOp&lt;br /&gt;if($? -ne $True) {&lt;br /&gt;   out-file -filepath $FileLog -inputobject "$hora ERROR: There was an error getting the shares" -append&lt;br /&gt;   break&lt;br /&gt;}else{ &lt;br /&gt; [string]$hora=get-date -uformat "[%r]"&lt;br /&gt; out-file -filepath $FileLog -inputobject "$hora Done.." -append &lt;br /&gt;}&lt;br /&gt;out-file -filepath $FileLog -inputobject "   " -append&lt;br /&gt;[string]$hora=get-date -uformat "[%r]"&lt;br /&gt;out-file -filepath $FileLog -inputobject "$hora Begin processing every share to get the configuration" -append&lt;br /&gt;foreach ($sharefolder in $shares){&lt;br /&gt; if (0 -eq $sharefolder.Type){&lt;br /&gt; &lt;br /&gt;  $Groups = Get-WmiObject -class MSCluster_ResourceGroupToResource -namespace "root\mscluster" -computername $ServerOp&lt;br /&gt;  $name=$sharefolder.Name&lt;br /&gt; &lt;br /&gt;  $Group = $Groups | Where-Object { $_.PartComponent -eq "MSCluster_Resource.Name="""+$name+""""  } &lt;br /&gt;  if ($Group -ne $null){&lt;br /&gt;   [string]$mygrp = $Group.GroupComponent&lt;br /&gt;   $Groupshare = $mygrp.Substring($mygrp.IndexOf(""""),$mygrp.Length-$mygrp.IndexOf(""""))&lt;br /&gt;   [string]$mystring="cluster /cluster:NEWCLUSTER resource "+"""$name"""+ " /create /group:"+$Groupshare+ " /type:""File Share"""&lt;br /&gt;   out-file -filepath $f -inputobject $mystring -append -Encoding ASCII&lt;br /&gt;   [string]$mystring="cluster /cluster:NEWCLUSTER resource "+"""$name"""+ " /priv path="""+$sharefolder.Path+""""&lt;br /&gt;   out-file -filepath $f -inputobject $mystring -append -Encoding ASCII&lt;br /&gt;   [string]$mystring="cluster /cluster:NEWCLUSTER resource "+"""$name"""+ " /priv Sharename="+$sharefolder.name&lt;br /&gt;   out-file -filepath $f -inputobject $mystring -append -Encoding ASCII&lt;br /&gt;   [string]$mystring="cluster /cluster:NEWCLUSTER resource "+"""$name"""+ " /priv Remark="""+$sharefolder.Description+""""&lt;br /&gt;   out-file -filepath $f -inputobject $mystring -append -Encoding ASCII&lt;br /&gt;   [string]$mystring="cluster /cluster:NEWCLUSTER resource "+"""$name"""+ " /prop Description="""+$sharefolder.Description+""""&lt;br /&gt;   out-file -filepath $f -inputobject $mystring -append -Encoding ASCII&lt;br /&gt;   &lt;br /&gt;   $Access = @();&lt;br /&gt;   $SD = (Get-WMIObject -Class Win32_LogicalShareSecuritySetting -Computer $ServerOp -Filter "Name='$($name)'").GetSecurityDescriptor().Descriptor&lt;br /&gt;   $SD.DACL | %{  $Trustee = $_.Trustee.Name&lt;br /&gt;    If ($_.Trustee.Domain -ne $Null) {  # The account has a domain.  &lt;br /&gt;       $Trustee = "$($_.Trustee.Domain)\$Trustee"  &lt;br /&gt;       $Access+= New-Object System.Security.AccessControl.FileSystemAccessRule($Trustee, $_.AccessMask, $_.AceType)&lt;br /&gt;      } elseif (  $_.Trustee.Name -ne $Null ) { # The account doesn't have a domain, but still valid, e.g. Everyone&lt;br /&gt;       $Access+= New-Object System.Security.AccessControl.FileSystemAccessRule($Trustee, $_.AccessMask, $_.AceType)&lt;br /&gt;      }else{  # The account doesn't have a domain nor valid.&lt;br /&gt;       Write-Host "Warning: Found an account in the share that could not be resolved, its possible that doesnt exists in AD"&lt;br /&gt;       $sharetemp1 = $sharefolder.Name&lt;br /&gt;       out-file -filepath $FileLog -inputobject "Found an account in the share that could not be resolved, its possible that doesnt exists in AD" -append&lt;br /&gt;      }&lt;br /&gt;   }&lt;br /&gt;   foreach($permission in $Access){&lt;br /&gt;    if ( $permission.FileSystemRights -eq "ReadAndExecute,Synchronize"){ $perm = "R" } &lt;br /&gt;    elseif ( $permission.FileSystemRights -eq "Modify,Synchronize"){ $perm ="RC" }&lt;br /&gt;    elseif ( $permission.FileSystemRights -eq "FullControl") { $perm = "F" }&lt;br /&gt;    if ($permission.AccessControlType -eq "Allow") {&lt;br /&gt;     [string]$mystring="cluster /cluster:NEWCLUSTER resource "+"""$name"""+ " /priv Security="""+$permission.IdentityReference+""""+",grant,"+$perm+":security"&lt;br /&gt;     out-file -filepath $f -inputobject $mystring -append -Encoding ASCII&lt;br /&gt;    }&lt;br /&gt;   }&lt;br /&gt;    $cmd = cluster.exe $ServerOp res $name /listdep | select-string "Online"&lt;br /&gt;    if($? -ne $True) {&lt;br /&gt;     out-file -filepath $FileLog -inputobject "$hora ERROR: THERE WAS AN ERROR GETTING THE DEPENDENCIES" -append&lt;br /&gt;    }&lt;br /&gt;    $gtp = " " + $Groupshare.substring(1,$Groupshare.length-2) + " "&lt;br /&gt;   foreach ($myline in $cmd){ &lt;br /&gt;    [string]$valor=$myline; &lt;br /&gt;    $dep=($valor.substring(0,$valor.indexOf($gtp,$gtp.length-1))).trimend()&lt;br /&gt;    [string]$mystring="cluster /cluster:NEWCLUSTER resource "+"""$name"""+ " /AddDep:"""+$dep+""""&lt;br /&gt;    out-file -filepath $f -inputobject $mystring -append -Encoding ASCII  &lt;br /&gt;   }&lt;br /&gt;   &lt;br /&gt;   [string]$mystring="cluster /cluster:NEWCLUSTER resource "+"""$name"""+ " /On"&lt;br /&gt;   out-file -filepath $f -inputobject $mystring -append -Encoding ASCII&lt;br /&gt;   out-file -filepath $f -inputobject "      " -append -Encoding ASCII&lt;br /&gt;  } &lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;[string]$hora=get-date -uformat "[%r]"&lt;br /&gt;out-file -filepath $FileLog -inputobject "$hora Done getting the shares properties" -append&lt;br /&gt;out-file -filePath $FileLog -inputobject "    " -Append&lt;br /&gt;&lt;br /&gt;out-file -filepath $FileLog -inputobject "#############################################################################################################################################" -append&lt;br /&gt;out-file -filepath $FileLog -inputobject "  " -append&lt;br /&gt;out-file -filepath $FileLog -inputobject "                                 END OF THE PROCESS: $hora  " -append&lt;br /&gt;out-file -filepath $FileLog -inputobject "  " -append&lt;br /&gt;out-file -filepath $FileLog -inputobject "#############################################################################################################################################" -append&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;This will generate a file that will look like this:&lt;br /&gt;cluster /cluster:NEWCLUSTER resource "Backup" /create /group:"mygroup" /type:"File Share"&lt;br /&gt;cluster /cluster:NEWCLUSTER resource "Backup" /priv path="t:\mypath"&lt;br /&gt;cluster /cluster:NEWCLUSTER resource "Backup" /priv Sharename=MYSHARE&lt;br /&gt;cluster /cluster:NEWCLUSTER resource "Backup" /priv Remark="comments of my share"&lt;br /&gt;cluster /cluster:NEWCLUSTER resource "Backup" /prop Description="comments of my share"&lt;br /&gt;cluster /cluster:NEWCLUSTER resource "Backup" /priv Security="BUILTIN\Administrators",grant,F:security&lt;br /&gt;cluster /cluster:NEWCLUSTER resource "Backup" /priv Security="MYDOMAIN\MYGROUP",grant,F:security&lt;br /&gt;cluster /cluster:NEWCLUSTER resource "Backup" /priv Security="MYDOMAIN\MYACCOUNT",grant,F:security&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6085569802552178014-6615822737128001632?l=practicascomunes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://practicascomunes.blogspot.com/feeds/6615822737128001632/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6085569802552178014&amp;postID=6615822737128001632' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6085569802552178014/posts/default/6615822737128001632'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6085569802552178014/posts/default/6615822737128001632'/><link rel='alternate' type='text/html' href='http://practicascomunes.blogspot.com/2009/06/getting-file-share-resources-properties.html' title='Getting the file share resources properties from a Windows 2003 cluster.'/><author><name>practicascomunes@gmail.com</name><uri>http://www.blogger.com/profile/12750935224135642825</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6085569802552178014.post-7829332653246830205</id><published>2009-06-19T14:43:00.002-05:00</published><updated>2009-06-19T15:03:10.917-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL 2005'/><category scheme='http://www.blogger.com/atom/ns#' term='role'/><category scheme='http://www.blogger.com/atom/ns#' term='permisos'/><title type='text'>Revisar permisos directos en SQL.</title><content type='html'>Es muy frecuente que se establezca como política (o como un Best Practice) que los permisos a los objetos de una base de datos se den solamente a roles y no a usuarios.&lt;br /&gt;&lt;br /&gt;Esto es muy importante, es mucho mas recomendable asignar permisos a través de roles que a usuarios, de tal manera, que en caso de migrar una base de datos a un servidor diferente, solamente se tengan que recrear los usuarios, y no recrear los usuarios y tener que volver a asignar permisos.&lt;br /&gt;&lt;br /&gt;Les paso un script que utilizo para detectar si se tienen permisos directos a los usuarios de una base de datos, en caso de  ser así, se listan los objetos y los permisos, yo lo utiliza dentro de un script de PowerShell que me indica en caso de obtener algun registro que se asignaron mal los permisos.&lt;br /&gt;&lt;br /&gt;El script recorre todas las bases de datos y revisa si asignaron permisos directos.&lt;br /&gt;&lt;br /&gt;Espero les sirva:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;SET ANSI_NULLS ON&lt;br /&gt;GO&lt;br /&gt;SET QUOTED_IDENTIFIER ON&lt;br /&gt;GO&lt;br /&gt;CREATE   PROCEDURE [dbo].[BPSQL_Revisa_Permisos_Users]&lt;br /&gt;AS&lt;br /&gt;&lt;br /&gt;DECLARE @dbname2 varchar(40);&lt;br /&gt;declare @id varchar(30);&lt;br /&gt;&lt;br /&gt;DECLARE dbname CURSOR FOR select name,database_id from master.sys.databases;&lt;br /&gt;&lt;br /&gt;CREATE TABLE #Permisos_Users(&lt;br /&gt; [base_de_datos] [varchar](128) NULL,&lt;br /&gt; [usuario] [varchar](128) NULL,&lt;br /&gt; [tipo_permiso] [varchar](128) NULL,&lt;br /&gt; [objeto] [varchar](128) NULL&lt;br /&gt;) &lt;br /&gt;&lt;br /&gt;OPEN dbname&lt;br /&gt;FETCH NEXT FROM dbname&lt;br /&gt;INTO @dbname2,@id&lt;br /&gt;&lt;br /&gt;WHILE @@FETCH_STATUS = 0&lt;br /&gt;   BEGIN  &lt;br /&gt;   exec('SET NOCOUNT ON;&lt;br /&gt;    use [' + @dbname2 + ']&lt;br /&gt;    INSERT #Permisos_Users&lt;br /&gt;    select d.name,b.name,a.permission_name,c.name from sys.database_permissions a inner join sys.database_principals b on a.grantee_principal_id=b.principal_id &lt;br /&gt;    inner join sys.objects c on a.major_id=c.object_id,sys.databases d where b.type_desc in (''SQL_USER'',''WINDOWS_USER'',''WINDOWS_GROUP'') and b.default_schema_name is not null &lt;br /&gt;    and b.name &lt;&gt; ''dbo'' and b.name &lt;&gt; ''guest'' and a.permission_name &lt;&gt; ''CONNECT'' and convert(varchar,d.database_id)='+@id+'')&lt;br /&gt;&lt;br /&gt; FETCH NEXT FROM dbname INTO @dbname2,@id&lt;br /&gt;END&lt;br /&gt;&lt;br /&gt;  CLOSE dbname &lt;br /&gt;  DEALLOCATE dbname&lt;br /&gt;&lt;br /&gt;select * from #Permisos_Users&lt;br /&gt;&lt;br /&gt;drop table #Permisos_Users&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6085569802552178014-7829332653246830205?l=practicascomunes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://practicascomunes.blogspot.com/feeds/7829332653246830205/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6085569802552178014&amp;postID=7829332653246830205' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6085569802552178014/posts/default/7829332653246830205'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6085569802552178014/posts/default/7829332653246830205'/><link rel='alternate' type='text/html' href='http://practicascomunes.blogspot.com/2009/06/revisar-permisos-directos-en-sql.html' title='Revisar permisos directos en SQL.'/><author><name>practicascomunes@gmail.com</name><uri>http://www.blogger.com/profile/12750935224135642825</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6085569802552178014.post-5305558088260031681</id><published>2009-05-27T15:04:00.004-05:00</published><updated>2009-05-27T15:12:09.464-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='backup Device'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL 2000'/><category scheme='http://www.blogger.com/atom/ns#' term='PowerShell'/><title type='text'>Verificando Integridad de Backup Devices.</title><content type='html'>Recientemente modifique el script que había publicado &lt;a href="http://practicascomunes.blogspot.com/2009/02/verifying-logins-integrity-between-sql.html"&gt;anteriormente&lt;/a&gt; para detectar si en el servidor de respaldo existen todos los backup devices del servidor operativo, usando PowerShell.&lt;br /&gt;&lt;br /&gt;El script es muy simple, solamente basta conectarnos a cada servidor SQL usando SMO y guardar en un arreglo la lista de backup devices, despues recorrer los arreglos del servidor operativo y verificar si están en el de respaldo.&lt;br /&gt;&lt;br /&gt;Aqui va el script:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;[void][reflection.assembly]::LoadWithPartialName("Microsoft.SqlServer.Smo")&lt;br /&gt;$srv=New-Object "Microsoft.SqlServer.Management.Smo.Server" SERVIDOROPERATIVO&lt;br /&gt;&lt;br /&gt;$disp=@()&lt;br /&gt;foreach($backup in $srv.backupdevices) {&lt;br /&gt;    $disp = $disp + $backup.Name&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; &lt;br /&gt; &lt;br /&gt;$srv2=New-Object "Microsoft.SqlServer.Management.Smo.Server" SERVIDORBACKUP&lt;br /&gt;$disp2=@()&lt;br /&gt;foreach($backup2 in $srv2.backupdevices) {&lt;br /&gt;    $disp2 = $disp2 + $backup2.Name&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; foreach ($dev in $disp) {&lt;br /&gt;  if ($disp2 -notcontains $dev){&lt;br /&gt;   Write-Host "No existe el backup " $dev "en el servidor de respaldo"&lt;br /&gt;  } &lt;br /&gt; }&lt;br /&gt;&lt;/span&gt; &lt;br /&gt;&lt;br /&gt;Solamente imprimirá si faltan backup devices en el servidor backup, pero se le puede agregar que lo escriba en un log, que mande un mail, etc.&lt;br /&gt;&lt;br /&gt;Este script es parte de un plan de recuperacion de desastres, puesto que el servidor backup tiene que tener siempre los mismos backup devices del servidor operativo.&lt;br /&gt;&lt;br /&gt;Espero les sirve.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6085569802552178014-5305558088260031681?l=practicascomunes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://practicascomunes.blogspot.com/feeds/5305558088260031681/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6085569802552178014&amp;postID=5305558088260031681' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6085569802552178014/posts/default/5305558088260031681'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6085569802552178014/posts/default/5305558088260031681'/><link rel='alternate' type='text/html' href='http://practicascomunes.blogspot.com/2009/05/verificando-integridad-de-backup.html' title='Verificando Integridad de Backup Devices.'/><author><name>practicascomunes@gmail.com</name><uri>http://www.blogger.com/profile/12750935224135642825</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6085569802552178014.post-6665621879219728055</id><published>2009-04-09T15:19:00.003-05:00</published><updated>2009-04-09T15:34:17.682-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='restore'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL 2005'/><category scheme='http://www.blogger.com/atom/ns#' term='model'/><title type='text'>Restaurando la BD model en SQL.</title><content type='html'>Hace unos días, se hizo un restore de la base de datos model en el servidor backup por error, el problema fue que se hizo con la opción "With norecovery", esto ocasionó que se detuviera el servicio de SQL y ya no se pudiera levantar.&lt;br /&gt;&lt;br /&gt;Buscando en internet, solamente encontré un &lt;a href="http://support.microsoft.com/kb/822852"&gt;artículo&lt;/a&gt; de Microsoft, explicando el problema y como solucionarlo el problema es que ese artículo no aplica para SQL 2005. Tambien encontré en un newsgroup de Microsoft una persona que le sucedió lo mismo y le explicaron un procedimiento y si no funcionaba se tenia que hacer un rebuild de la instalación.&lt;br /&gt;&lt;br /&gt;Despues de estar intentando de diferentes maneras hacer levantar el servicio, al final pude hacerlo siguiente este procedimiento:&lt;br /&gt;&lt;br /&gt;1. Levantar el servicio en single-user, con las opciones -c -m -T3608&lt;br /&gt;2. Conectarse al servidor usando el comando osql&lt;br /&gt;3. Hacer un detach de la base de datos:&lt;br /&gt;use master&lt;br /&gt;go&lt;br /&gt;sp_detach_db 'model'&lt;br /&gt;go&lt;br /&gt;4. Copiar los archivos model.mdf y modellog.ldf a las mismas rutas del servidor (tienen que ser de otro servidor que tenga el mismo Service Pack de SQL)&lt;br /&gt;5. Hacer el attach:&lt;br /&gt;use master&lt;br /&gt;go&lt;br /&gt;sp_attach_db 'model','c:\Ruta\del\archivo_mdf','c:\ruta\del\archivo_ldf'&lt;br /&gt;6. Detener el servicio de SQL y levantarlo normalmente.&lt;br /&gt;&lt;br /&gt;Espero les sirva.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6085569802552178014-6665621879219728055?l=practicascomunes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://practicascomunes.blogspot.com/feeds/6665621879219728055/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6085569802552178014&amp;postID=6665621879219728055' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6085569802552178014/posts/default/6665621879219728055'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6085569802552178014/posts/default/6665621879219728055'/><link rel='alternate' type='text/html' href='http://practicascomunes.blogspot.com/2009/04/restaurando-la-bd-model-en-sql.html' title='Restaurando la BD model en SQL.'/><author><name>practicascomunes@gmail.com</name><uri>http://www.blogger.com/profile/12750935224135642825</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6085569802552178014.post-7948811485379151763</id><published>2009-03-31T15:09:00.003-06:00</published><updated>2009-03-31T15:15:45.524-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Event Viewer'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows 2003'/><category scheme='http://www.blogger.com/atom/ns#' term='wbinfo'/><title type='text'>Monitoreo de Event Viewers de servidores remotos en Windows 2003.</title><content type='html'>Que tal,&lt;br /&gt;&lt;br /&gt;Les comparto como poder monitorear event viewers de servidores Windows 2003 sin necesidad de permisos administrativos.&lt;br /&gt;&lt;br /&gt;1. Obtener el SID del grupo o usuario al que se le quieren asignar los permisos, para esto correr el comando wbinfo -n "dominio\cuenta" en un servidor linux que tenga samba y que esté integrado al dominio, se puede obtener tambien desde Windows, registrando el archivo acctinfo.dll (regsvr32 acctinfo.dll) que viene incluido en el Resource Kit de Windows 2003, abriendo la consola de Active Directory Users and Computers y entrando a las propiedades de la cuenta o grupo.&lt;br /&gt;&lt;br /&gt;2. Formar la cadena de permisos de la siguiente manera:&lt;br /&gt;&lt;br /&gt;(&lt;permiso&gt;;;&lt;nivel_de_permisos&gt;;;;&lt;SID&gt;)&lt;br /&gt;&lt;br /&gt;Por ejemplo:&lt;br /&gt;&lt;br /&gt;(A;;0x1;;;S-1-2-21-1283441307-3045887142-1639236238-20210)&lt;br /&gt;&lt;br /&gt;Con esta cadena se asignan permisos (A) de lectura (0x1) al grupo: midominio\grupo (1283441307-3045887142-1639236238-20210).&lt;br /&gt;&lt;br /&gt;3. Asignar los permisos en los event viewers correspondientes, para esto hay que agregar la cadena obtenida en el paso anterior en la llave CustomSD que correspondan a los event viewers, la ruta en donde se encuentra este parámetro (en el registry) es:&lt;br /&gt;&lt;br /&gt;HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Eventlog\&lt;NOMBRE_DEL_EVENT_VIEWER&gt;\CustomSD&lt;br /&gt;&lt;br /&gt;Es importante que se agreguen los permisos, no se sustituya la llave existente, porque ocasionaría serios problemas.&lt;br /&gt;Espero que les sirva.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6085569802552178014-7948811485379151763?l=practicascomunes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://practicascomunes.blogspot.com/feeds/7948811485379151763/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6085569802552178014&amp;postID=7948811485379151763' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6085569802552178014/posts/default/7948811485379151763'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6085569802552178014/posts/default/7948811485379151763'/><link rel='alternate' type='text/html' href='http://practicascomunes.blogspot.com/2009/03/monitoreo-de-event-viewers-de.html' title='Monitoreo de Event Viewers de servidores remotos en Windows 2003.'/><author><name>practicascomunes@gmail.com</name><uri>http://www.blogger.com/profile/12750935224135642825</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6085569802552178014.post-3864268105353770306</id><published>2009-03-12T15:21:00.006-06:00</published><updated>2009-03-12T15:40:27.422-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tryParseExact'/><category scheme='http://www.blogger.com/atom/ns#' term='PowerShell'/><category scheme='http://www.blogger.com/atom/ns#' term='parseexact'/><title type='text'>Finding folders with specific dates old using the name.</title><content type='html'>Hi,&lt;br /&gt;Recently, I had to do a script that finds all folders in a directory who have a certain number of days, each folder has a date, with format YYYYMMDD, and I had to find all folders that were X numbers of days old to move it to another folder.&lt;br /&gt;&lt;br /&gt;After spending some time figuring out how can I could that, I will share with you the main function that I used and that is working right now.&lt;br /&gt;&lt;br /&gt;The most tricky part was to validate that the folder was a valid date.&lt;br /&gt;Well this is how I did it:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;$dtout=New-Object datetime&lt;br /&gt;$GciFiles = get-childitem $Path | where-object { $_.PsIsContainer -and $_.Name -match '^20[0-9][0-9][0-1][0-9][0-3][0-9]$' -and ([datetime]::tryParseExact($_.Name,"yyyyMMdd",[System.Globalization.CultureInfo]::EnglishName,[System.Globalization.DateTimeStyles]::None,[ref]$dtOut)) } | Where-Object { ((get-date) - [datetime]::parseexact($_.Name,"yyyyMMdd",$null)).days -ge $days } | Select-Object name&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;First, I declared a variable named dtout, so I could use it later, then I use the variable GciFiles to store the return of the gci(I know I could do that in a single line, but I wanted that way):&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;$GciFiles = get-childitem $Path &lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Then, the result of the gci, I filter only the folders and the folders whose name had the correct format, and using the function tryParseExact, I can validate that the date.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:italic;"&gt;$GciFiles = get-childitem $Path | where-object { $_.PsIsContainer -and $_.Name -match '^20[0-9][0-9][0-1][0-9][0-3][0-9]$' -and ([datetime]::tryParseExact($_.Name,"yyyyMMdd",[System.Globalization.CultureInfo]::EnglishName,[System.Globalization.DateTimeStyles]::None,[ref]$dtOut)) }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Then, after I validated the date and the date was valid, I obtain the number of days from the folder's day to today and if that number is greater or equal the $days parameter the name is selected:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;$GciFiles = get-childitem $Path | where-object { $_.PsIsContainer -and $_.Name -match '^20[0-9][0-9][0-1][0-9][0-3][0-9]$' -and ([datetime]::tryParseExact($_.Name,"yyyyMMdd",[System.Globalization.CultureInfo]::EnglishName,[System.Globalization.DateTimeStyles]::None,[ref]$dtOut)) } | Where-Object { ((get-date) - [datetime]::parseexact($_.Name,"yyyyMMdd",$null)).days -ge $days } | Select-Object name&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6085569802552178014-3864268105353770306?l=practicascomunes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://practicascomunes.blogspot.com/feeds/3864268105353770306/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6085569802552178014&amp;postID=3864268105353770306' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6085569802552178014/posts/default/3864268105353770306'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6085569802552178014/posts/default/3864268105353770306'/><link rel='alternate' type='text/html' href='http://practicascomunes.blogspot.com/2009/03/finding-folders-with-specific-dates-old.html' title='Finding folders with specific dates old using the name.'/><author><name>practicascomunes@gmail.com</name><uri>http://www.blogger.com/profile/12750935224135642825</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6085569802552178014.post-5598515323700244945</id><published>2009-02-04T14:48:00.004-06:00</published><updated>2009-02-04T15:17:11.510-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CU1'/><category scheme='http://www.blogger.com/atom/ns#' term='cluster'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL 2005'/><category scheme='http://www.blogger.com/atom/ns#' term='SP3'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows Installer'/><category scheme='http://www.blogger.com/atom/ns#' term='Disaster Recovery'/><category scheme='http://www.blogger.com/atom/ns#' term='7-zip'/><title type='text'>Tips para actualizar el SP3 de SQL 2005.</title><content type='html'>Que tal,&lt;br /&gt;Hace poco terminé de actualizar mi servidores SQL 2005 al SP3 CU1, así que les compartiré algunos tips, para aquellos que aún no lo han hecho.&lt;br /&gt;&lt;br /&gt;En general, este Service Pack no da problemas, bueno eso, si el folder C:\windows\installer se mantiene intacto, de lo contrario puede dar algunos problemas y ser mas problematico. Los errores que me han tocado y que he visto son de que al momento de la instalación falle en la instalación del SP en algun componente, pero nunca he visto, que deje el servidor "tocado", o que ya nunca levante. En posts anteriores en este blog hablo de algunos de ellos.&lt;br /&gt;&lt;br /&gt;Yo recomendaría que actualizaran al SP3 y de una vez al Cumulative Update 1, ya que los fixes que tiene, valen la pena, son solo 15 minutos mas en el procedimiento.&lt;br /&gt;&lt;br /&gt;Aqui comparto algunos tips:&lt;br /&gt;1. Si ya tienes instalado el SP2 en el servidor, descomprime el ejecutable del SP2 (con el 7-zip) y verifica el tamaño que tiene el archivo que viene en el folder hotfixtools, despues verifica que exista un archivo con el mismo tamaño en el folder C:\windows\installer, si existe es que no habrá problema, si no, ya sabes que en ese punto te puede fallar, si tienes un cluster, el archivo solamente estará en el servidor en donde se realizó la instalación. &lt;br /&gt;2. Existe un bug en el cual, la cuenta con la que corre el servicio de SQL no debe ser domain admin, así que ya sabes, si así es, primero sacala del grupo domain admins.&lt;br /&gt;3. Al momento de la instalación, si es un cluster, verifica que no haya alguien logueado por Remote Desktop en el otro nodo.&lt;br /&gt;4. La instalación del SP en un cluster, es un poco tardada, dependiendo del número de nodos y de otras cosas, pero en mi caso, en servidores de 2 nodos, se tarda en total aprox. 40 minutos, así que hay que abrir una ventana de mantenimiento lo suficientemente holgada, a esto hay que añadir lo que se tardan los restarts de los nodos y los failovers. El CU1 se tarda aprox. entre 15 y 20 minutos.&lt;br /&gt;5. Haz un backup completo de todas las bases de datos, nunca sabes que puede pasar y es mejor estar preparado, esto le aumenta tiempo en la instalación, pero es mejor prevenir, que lamentar.&lt;br /&gt;6. De preferencia, antes de que lo vayas a instalar, instala el Windows Installer 4.5.&lt;br /&gt;7. Se tiene que correr el instalador en el nodo en donde está el servicio de SQL funcionando.&lt;br /&gt;8. Al momento de la instalación en cluster, de repente se queda en el mensaje: "Awaiting first complete passive cluster node SQLSERVER", a mi se me tardó en este punto, aprox. 10 minutos, pero despues avanzó, para que no se preocupen y no cancelen la instalación.&lt;br /&gt;9. Revisa bien la estrategia de Disaster Recovery de tus servidores y preparate para el peor escenario, es mejor, estar siempre bien preparados y contar una buena estrategia de recuperacion de datos, si no existe, este es el momento de empezar.&lt;br /&gt;&lt;br /&gt;Estos son los pasos que yo realize en cluster active-passive de 2 nodos:&lt;br /&gt;1. Hacer failover de SQL hacia la instancia en donde hize la instalacion.&lt;br /&gt;2. Correr script para deshabilitar jobs. Este script se puede generar utilizando mi script que tengo en otro de mis posts.&lt;br /&gt;3. Correr script para matar conexiones y poner bds en read-only. &lt;br /&gt;4. Correr script para backup de bases de datos.&lt;br /&gt;5. Correr instalador del SP3.&lt;br /&gt;6. Reiniciar el segundo nodo.&lt;br /&gt;7. Hacer failover de SQL al segundo nodo.&lt;br /&gt;8. Reinciar el primer nodo.&lt;br /&gt;9. Instalar el CU1.&lt;br /&gt;10. Reiniciar el segundo nodo.&lt;br /&gt;11. Hacer failover de SQL hacia el segundo nodo.&lt;br /&gt;12. Reiniciar el primer nodo.&lt;br /&gt;13. Correr script para poner bases de datos en read-write.&lt;br /&gt;14. Correr script para habilitar jobs.&lt;br /&gt;15. Verificar aplicaciones que se conectan al servidor, conectividad, delegación, etc.&lt;br /&gt;&lt;br /&gt;En teoría no es necesario reiniciar los nodos y hacer failovers despues de aplicar el CU1, pero yo lo hize para estar bien seguro de que no habrá problemas.&lt;br /&gt;&lt;br /&gt;Si alguien quiere hacer algun comentario o hacerme preguntas acerca de algo, con todo gusto le ayudaré.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6085569802552178014-5598515323700244945?l=practicascomunes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://practicascomunes.blogspot.com/feeds/5598515323700244945/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6085569802552178014&amp;postID=5598515323700244945' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6085569802552178014/posts/default/5598515323700244945'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6085569802552178014/posts/default/5598515323700244945'/><link rel='alternate' type='text/html' href='http://practicascomunes.blogspot.com/2009/02/tips-para-actualizar-el-sp3-de-sql-2005.html' title='Tips para actualizar el SP3 de SQL 2005.'/><author><name>practicascomunes@gmail.com</name><uri>http://www.blogger.com/profile/12750935224135642825</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6085569802552178014.post-3833030580314145014</id><published>2009-02-04T14:33:00.003-06:00</published><updated>2009-02-04T14:44:35.433-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Logins'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL 2005'/><category scheme='http://www.blogger.com/atom/ns#' term='Disaster Recovery'/><category scheme='http://www.blogger.com/atom/ns#' term='PowerShell'/><title type='text'>Verifying logins integrity between SQL 2005 servers with PowerShell.</title><content type='html'>Hi,&lt;br /&gt;Recently I had to verify that every login in my production servers were in my backup servers, so I did a script using PowerShell to do that. This script is useful if you want to make sure that all your backup servers have the production logins.&lt;br /&gt;&lt;br /&gt;The script takes 2 parameters, the production server and the backup server, all the logins in the production server must be in the backup server, in case it finds someone is missing, it writes it in a log and displays the login in the console.&lt;br /&gt;&lt;br /&gt;This is the script:&lt;br /&gt;&lt;span style="font-style:italic;"&gt;param ( &lt;br /&gt;[string]$ServerOp ,&lt;br /&gt;[string]$ServerBackup)&lt;br /&gt;&lt;br /&gt;$LogFile = "C:\Intlogins\logs\Int_LOGINS_$nombre.log"&lt;br /&gt;&lt;br /&gt;out-file -filepath $LogFile -inputobject ("#############################################################################################################################################")&lt;br /&gt;out-file -filepath $LogFile -inputobject ("  ") -append&lt;br /&gt;out-file -filepath $LogFile -inputobject "                                 START PROCESS TO VERIFY LOGINS INTEGRITY " -append&lt;br /&gt;out-file -filepath $LogFile -inputobject ("  ") -append&lt;br /&gt;out-file -filepath $LogFile -inputobject ("#############################################################################################################################################") -append&lt;br /&gt;out-file -filepath $LogFile -inputobject ("  ") -append&lt;br /&gt;&lt;br /&gt;$SqlConnection = New-Object System.Data.SqlClient.SqlConnection&lt;br /&gt;$SqlConnection.ConnectionString = "Server=$serverOp;Database=master;Integrated Security=True"&lt;br /&gt;$SqlCmd = New-Object System.Data.SqlClient.SqlCommand&lt;br /&gt;$SqlCmd.CommandText = "select name from master.sys.server_principals where is_disabled=0 and principal_id&gt;258 and name &lt;&gt;'##MS_AgentSigningCertificate##'" &lt;br /&gt;$SqlCmd.Connection = $SqlConnection&lt;br /&gt;$SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter&lt;br /&gt;$SqlAdapter.SelectCommand = $SqlCmd&lt;br /&gt;$DataSet = New-Object "System.Data.DataSet" "Table1"&lt;br /&gt;$result =  $SqlAdapter.fill($DataSet)&lt;br /&gt;&lt;br /&gt;$SqlConnection2 = New-Object System.Data.SqlClient.SqlConnection&lt;br /&gt;$SqlConnection2.ConnectionString = "Server=$serverBackup;Database=master;Integrated Security=True"&lt;br /&gt;$SqlCmd2 = New-Object System.Data.SqlClient.SqlCommand&lt;br /&gt;$SqlCmd2.CommandText = "select name from master.sys.server_principals where is_disabled=0 and principal_id&gt;258 and name &lt;&gt;'##MS_AgentSigningCertificate##'" &lt;br /&gt;$SqlCmd2.Connection = $SqlConnection2&lt;br /&gt;$SqlAdapter2 = New-Object System.Data.SqlClient.SqlDataAdapter&lt;br /&gt;$SqlAdapter2.SelectCommand = $SqlCmd2&lt;br /&gt;$DataSet2 = New-Object "System.Data.DataSet" "Table1"&lt;br /&gt;$result2 =  $SqlAdapter2.fill($DataSet2)&lt;br /&gt;&lt;br /&gt;foreach ($row in $dataset.Tables[0].rows){ &lt;br /&gt;  $exist=0&lt;br /&gt;   foreach ($row2 in $Dataset2.Tables[0].rows){&lt;br /&gt;     if([string]::Compare($row2.name,$row.name,$True) -eq 0){ &lt;br /&gt;      # Write-Host "The login" $row.name "exists in backup server"&lt;br /&gt;       $exist=1&lt;br /&gt;       break    &lt;br /&gt;       }&lt;br /&gt;   }    &lt;br /&gt;   if ($exist -eq 0){&lt;br /&gt;    Write-Host "The login" $row.name "does NOT exist in backup server"&lt;br /&gt;    $var = "$hora ERROR: The login ["+ $row.name+ "] does NOT exist in backup server: $ServerBackup"&lt;br /&gt;    out-file -filepath $LogFile -inputobject $var -append&lt;br /&gt; &lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;out-file -filepath $LogFile -inputobject ("  ") -append&lt;br /&gt;out-file -filepath $LogFile -inputobject ("  ") -append&lt;br /&gt;out-file -filepath $LogFile -inputobject ("#############################################################################################################################################") -append&lt;br /&gt;out-file -filepath $LogFile -inputobject ("  ") -append&lt;br /&gt;out-file -filepath $LogFile -inputobject ("                                END PROCESS TO VERIFY LOGINS INTEGRITY") -append&lt;br /&gt;out-file -filepath $LogFile -inputobject ("  ") -append&lt;br /&gt;out-file -filepath $LogFile -inputobject ("#############################################################################################################################################") -append&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6085569802552178014-3833030580314145014?l=practicascomunes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://practicascomunes.blogspot.com/feeds/3833030580314145014/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6085569802552178014&amp;postID=3833030580314145014' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6085569802552178014/posts/default/3833030580314145014'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6085569802552178014/posts/default/3833030580314145014'/><link rel='alternate' type='text/html' href='http://practicascomunes.blogspot.com/2009/02/verifying-logins-integrity-between-sql.html' title='Verifying logins integrity between SQL 2005 servers with PowerShell.'/><author><name>practicascomunes@gmail.com</name><uri>http://www.blogger.com/profile/12750935224135642825</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6085569802552178014.post-1828865564322947423</id><published>2009-01-21T15:31:00.001-06:00</published><updated>2009-01-21T15:33:34.913-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL 2005'/><category scheme='http://www.blogger.com/atom/ns#' term='SP3'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows Installer.'/><title type='text'>Mas del SP3 de SQL 2005.</title><content type='html'>Había comentado en el blog anterior que uno de mis servidores nunca pude actualizar el Client Components, pues bien, en uno de los foros de Microsoft, encontré que la solución estaba en tomar el archivo faltante del SP2, no del SP3, como le había hecho antes.&lt;br /&gt;&lt;br /&gt;Pues bien, despues de sustituir el archivo faltante del folder Windows Installer, pude terminar la instalación del SP3 y del CU1.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6085569802552178014-1828865564322947423?l=practicascomunes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://practicascomunes.blogspot.com/feeds/1828865564322947423/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6085569802552178014&amp;postID=1828865564322947423' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6085569802552178014/posts/default/1828865564322947423'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6085569802552178014/posts/default/1828865564322947423'/><link rel='alternate' type='text/html' href='http://practicascomunes.blogspot.com/2009/01/mas-del-sp3-de-sql-2005.html' title='Mas del SP3 de SQL 2005.'/><author><name>practicascomunes@gmail.com</name><uri>http://www.blogger.com/profile/12750935224135642825</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6085569802552178014.post-3389971564388754594</id><published>2009-01-16T13:01:00.004-06:00</published><updated>2009-01-16T18:54:08.252-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL 2005'/><category scheme='http://www.blogger.com/atom/ns#' term='SP3'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows Installer'/><category scheme='http://www.blogger.com/atom/ns#' term='7-zip'/><title type='text'>Instalando el SP3 de SQL 2005.</title><content type='html'>Que tal,&lt;br /&gt;Desde hace unos días empezé a instalar el SP3 de SQL 2005 en los servidores, hasta el momento llevo 2/3 que funcionan a la primera. &lt;br /&gt;&lt;br /&gt;El día de ayer intente instalarlo en un servidor que es backup de los operativos, tiene 2 instancias de SQL 2005, la primera vez que corrí el instalador no se instaló en el database engine default y de la instancia y el client components, todo lo demás si se actualizó.&lt;br /&gt;&lt;br /&gt;Hice varias pruebas, pero el resultado fue igual, revisando el log de instalación, encontré unas líneas con el error, indicando que faltaba un archivo: " Couldn't find local patch 'C:\WINDOWS\Installer\ce61b.msp'. Looking for it at its source.", en un blog de msdn encontré como corregir el problema, basicamente lo que hay que hacer es descomprimir el archivo de instalación, (con el 7-zip, por ejemplo) buscar el archivo que hace referencia un poco mas adelante en el log (en este caso era: sqlrun_tools.msp)  y copiarlo en el folder C:\windows\installer, renombrado con el nombre que dice ahí ce62b.msp, después de hacer eso volví a correr el instalar y ahora me falló pero con el archivo C:\WINDOWS\Installer\ce62b.msp y volví a copiar el archivo.&lt;br /&gt;&lt;br /&gt;Después de hacer eso, volvió a fallar, pero ahora avanzaba un poco más y ya no marcaba ese error, ahora el error en los logs era :  "Error 2902. The installer has encountered an unexpected error. The error code is 2902. Operation ixfAssemblyCopy called out of sequence.", para este error encontré un artículo indicando que era un bug en el Windows Installer 3.1 y que ya había sido corregido en el Windows Installer 4.5, así que instalé el Windows Installer 4.5 en el servidor y ya pudo terminar la instalación en las instancias, en los Client Components nunca pudo terminar, siempre estuvo marcando error.&lt;br /&gt;&lt;br /&gt;Despues de eso, instalé el Acumulativo 1 en el servidor y se instaló sin problemas. &lt;br /&gt;&lt;br /&gt;Así que lo haré a partir de ahora será actualizar primero el Windows Installer a la 4.5 antes de instalar el SP3. &lt;br /&gt;&lt;br /&gt;Esta es la liga del blog que les decía:&lt;br /&gt;http://blogs.msdn.com/heaths/archive/2006/11/30/rebuilding-the-installer-cache.aspx&lt;br /&gt;&lt;br /&gt;Espero que esto les sirva.&lt;br /&gt;&lt;br /&gt;Esta es la liga del blog que les decía:&lt;br /&gt;http://blogs.msdn.com/heaths/archive/2006/11/30/rebuilding-the-installer-cache.aspx&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6085569802552178014-3389971564388754594?l=practicascomunes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://practicascomunes.blogspot.com/feeds/3389971564388754594/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6085569802552178014&amp;postID=3389971564388754594' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6085569802552178014/posts/default/3389971564388754594'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6085569802552178014/posts/default/3389971564388754594'/><link rel='alternate' type='text/html' href='http://practicascomunes.blogspot.com/2009/01/instalando-el-sp3-de-sql-2005.html' title='Instalando el SP3 de SQL 2005.'/><author><name>practicascomunes@gmail.com</name><uri>http://www.blogger.com/profile/12750935224135642825</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6085569802552178014.post-219859174708748537</id><published>2008-12-31T09:39:00.002-06:00</published><updated>2008-12-31T10:22:40.292-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SMO'/><category scheme='http://www.blogger.com/atom/ns#' term='schema'/><category scheme='http://www.blogger.com/atom/ns#' term='restore'/><category scheme='http://www.blogger.com/atom/ns#' term='migrate'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL 2005'/><category scheme='http://www.blogger.com/atom/ns#' term='backup'/><category scheme='http://www.blogger.com/atom/ns#' term='PowerShell'/><title type='text'>Script to migrate databases with PowerShell.</title><content type='html'>Hi,&lt;br /&gt;In the last months, I've been writing some scripts in PowerShell to administer SQL Servers, this time, I will share my personal script to migrate database from one server to another.&lt;br /&gt;&lt;br /&gt;You can test this script in your environment and see if it works, this is the scripts that I have used to migrate databases easily and quickly.&lt;br /&gt;&lt;br /&gt;First, you have to kill all the processes in the databases and change them to read only, in order to guarantee that the data will not change during the migration.&lt;br /&gt;&lt;br /&gt;The script read a txt file with the list of all databases to migrate, then it connects to source server, then, for every database it checks whether if it should migrate them, and takes a full backup, also it generates the scripts to re-create the database users, the script to add every user to its respective role and checks if there is any schema that its owner is different than dbo.&lt;br /&gt;&lt;br /&gt;Then, it copies the backups to the backup server, restore it, change it to read_write, run the scripts to recreate users and add them to the roles.&lt;br /&gt;&lt;br /&gt;One important thing is that it considers that if the data and log files are going to be different between the servers, it lets you specfy a new route, with some parameters.&lt;br /&gt;&lt;br /&gt;The scripts take these parameters:&lt;br /&gt;1. A txt file with the databases name to migrate. (for example: d:\databases.txt)&lt;br /&gt;2. Path in the soruce server where the source server will write the backup (for example: d:\backups)&lt;br /&gt;3. Path in the backup server where the backup server will take the backup (for example: d:\backups)&lt;br /&gt;4. Path where will be written the scripts.&lt;br /&gt;5. Source database server name.&lt;br /&gt;6. Backup database server name.&lt;br /&gt;&lt;br /&gt;For example:&lt;br /&gt;# ./migradbs.ps1 d:\databases.txt d:\backups\ h:\backups\ d:\scripts "MYCURRENTSERVER" "MYNEWSERVER"&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;param (&lt;br /&gt;[string]$filename=$(throw 'The parameter: $filename is required.'),&lt;br /&gt;[string]$BackupPath=$(throw 'The parameter: $BackupPath is required.'),&lt;br /&gt;[string]$RestorePath=$(throw 'The parameter: $RestorePath is required.'),&lt;br /&gt;[string]$ScriptsPath=$(throw 'The parameter: $ScriptsPath is required.'),&lt;br /&gt;[string]$OriginServer=$(throw 'The parameter: $OriginServer is required.'),&lt;br /&gt;[string]$DestinyServer=$(throw 'The parameter: $DestinyServer is required.')&lt;br /&gt;)&lt;br /&gt;# MODIFY THIS PARAMETERS TO CHANGE THE PATHS FROM THE DATA AND LOGS.&lt;br /&gt;# IF YOU LET IT WRONG, THE RESTORE WILL FAIL Y THE SCRIPT WILL EXIT WITH SOMETHING LIKE:&lt;br /&gt;# Exception calling "SqlRestore" with "1" argument(s): "Restore failed for Server ?????'. "&lt;br /&gt;# At :line:197 char:22   $restore.SqlRestore( &lt;&lt;&lt;&lt; $srv2)&lt;br /&gt;[string]$path_data_source="d:\sql\"&lt;br /&gt;[string]$path_log_source="d:\sql\"&lt;br /&gt;[string]$path_data_backup="d:\sql\"&lt;br /&gt;[string]$path_log_backup="d:\sql\"&lt;br /&gt;&lt;br /&gt;if (! (test-path $filename)) {&lt;br /&gt;        throw "$($filename) is not a valid file!"&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;if (! (test-path $ScriptsPath)) {&lt;br /&gt;        throw "$($ScriptsPath) is not a valid path!"&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;$bds=Get-Content $filename | where {$_ -ne ""} &lt;br /&gt;function okMigrate([string]$a) {&lt;br /&gt; foreach ($bd in $bds){&lt;br /&gt;  if ([string]::Compare($a, $bd, $True) -eq 0){&lt;br /&gt;   return $true&lt;br /&gt;   break&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt; return $false&lt;br /&gt;}&lt;br /&gt;[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.Smo") | out-null&lt;br /&gt;$MyScripter=new-object ("Microsoft.SqlServer.Management.Smo.Scripter")&lt;br /&gt;$srv=New-Object "Microsoft.SqlServer.Management.Smo.Server" $OriginServer&lt;br /&gt;$MyScripter.Server=$srv&lt;br /&gt;&lt;br /&gt;if (!$BackupPath.EndsWith("\")){  $BackupPath += "\"  }&lt;br /&gt;if (!$RestorePath.EndsWith("\")){  $RestorePath += "\"  }&lt;br /&gt;if (!$ScriptsPath.EndsWith("\")){  $ScriptsPath += "\"  }&lt;br /&gt;Write-Host "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"&lt;br /&gt;Write-Host "              START SCRIPT TO MIGRATE DATABASES               "&lt;br /&gt;Write-Host "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"&lt;br /&gt;Write-Host "Backup path:" $BackupPath&lt;br /&gt;Write-Host "Restore path:" $RestorePath &lt;br /&gt;Write-Host "Scripts path:" $ScriptsPath&lt;br /&gt;Write-Host "Source server:" $OriginServer&lt;br /&gt;Write-Host "backup server:" $DestinyServer&lt;br /&gt;Write-Host "DBS to migrate:" $bds&lt;br /&gt;$mytime=get-date -uformat "%Y/%m/%d  %H:%M:%S"&lt;br /&gt;Write-Host "Current date and time:" $mytime&lt;br /&gt;Write-Host "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"&lt;br /&gt;&lt;br /&gt;foreach($database in $srv.databases) {&lt;br /&gt; if (okMigrate($database.Name) -and $database.Name -ne "master" -and $database.Name -ne "model" -and $database.Name -ne "msdb" -and $database.Name -ne "tempdb"){&lt;br /&gt;  $backup=new-object "Microsoft.SqlServer.Management.Smo.Backup"&lt;br /&gt;  $backup.Action='Database'&lt;br /&gt;  $backup.Initialize='true'&lt;br /&gt;  $backup.Checksum='true'&lt;br /&gt;  $fil=new-object "Microsoft.SqlServer.Management.Smo.BackupDeviceItem"&lt;br /&gt;  $fil.DeviceType='File'&lt;br /&gt;  $fil.Name=[System.IO.Path]::Combine($BackupPath, $database.Name + ".bak")&lt;br /&gt;  $backup.Devices.Add($fil)&lt;br /&gt;  $backup.Database=$database.Name&lt;br /&gt;  write-host "Start backup of"$database.Name&lt;br /&gt;  $backup.SqlBackup($srv)&lt;br /&gt;  write-host "Finished backup of"$database.Name&lt;br /&gt;  #write-host "Getting the script to recreate the users of" $database.Name&lt;br /&gt;  $f = [System.IO.Path]::Combine($ScriptsPath, "Users_" + $database.Name + ".sql")&lt;br /&gt;  $MyScripter.options.IncludeDatabaseContext = $false&lt;br /&gt;  $e = "USE " + $database.Name&lt;br /&gt;  out-file -filePath $f -inputobject $e&lt;br /&gt;  out-file -filePath $f -inputobject "GO" -Append&lt;br /&gt;  foreach ($User in $database.Users) {&lt;br /&gt;    if ($User.Name -ne "sys" -and $User.Name -ne "dbo" -and $User.Name -ne "INFORMATION_SCHEMA" -and $User.Name -ne "guest") {&lt;br /&gt;     $MyScripter.Options.IncludeIfNotExists = $true&lt;br /&gt;     $MyScripter.Options.ScriptDrops = $true&lt;br /&gt;     $MyScripter.Script($User) | Out-file $f -append&lt;br /&gt;    } &lt;br /&gt;    if ($User.Name -ne "sys" -and $User.Name -ne "dbo" -and $User.Name -ne "INFORMATION_SCHEMA" -and $User.Name -ne "guest") {&lt;br /&gt;     $MyScripter.options.IncludeDatabaseContext = $false&lt;br /&gt;     $MyScripter.Options.ScriptDrops = $false&lt;br /&gt;     $MyScripter.Script($User) | Out-file $f -append&lt;br /&gt;     out-file -filePath $f -inputobject "`n" -append&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;  #write-host "Getting the script to add every user to its roles..."&lt;br /&gt;  $f = [System.IO.Path]::Combine($ScriptsPath, "roles_" + $database.Name + ".sql")&lt;br /&gt;  $e = "USE " + $database.Name&lt;br /&gt;  out-file -filePath $f -inputobject $e&lt;br /&gt;  out-file -filePath $f -inputobject "GO" -Append  &lt;br /&gt;  foreach ($role in $database.Roles) {&lt;br /&gt;   if ($role.Name -ne "public") {&lt;br /&gt;                foreach ($member in $role.EnumMembers()) {&lt;br /&gt;     if ($member -ne "dbo") {&lt;br /&gt;       $var = "sys.sp_addrolemember @rolename = N'" + $role.Name+"', @membername = N'"+$member+"'"&lt;br /&gt;       out-file -filePath $f -inputobject $var -append&lt;br /&gt;       out-file -filePath $f -inputobject "GO" -append&lt;br /&gt;      }&lt;br /&gt;    }&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  #Write-Host "Getting the scripts to change the paths during restore"&lt;br /&gt;  ForEach ($fg in $database.FileGroups){&lt;br /&gt;   foreach ($var1 in $fg.Files){&lt;br /&gt;    $movedata = $var1.Name + "," + ($var1.FileName.ToLower()).Replace($path_data_source,$path_data_backup)&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt;  ForEach ($lf in $database.LogFiles){&lt;br /&gt;   $movedata_log = $lf.Name + "," + ($lf.FileName.ToLower()).Replace($path_log_source,$path_log_backup)&lt;br /&gt;  }&lt;br /&gt;  $f = [System.IO.Path]::Combine($ScriptsPath, "Relocate_" + $database.Name + ".relocate")&lt;br /&gt;  out-file -filePath $f -inputobject $movedata&lt;br /&gt;  $f = [System.IO.Path]::Combine($ScriptsPath, "Relocate_" + $database.Name + "_log.relocate")&lt;br /&gt;  out-file -filePath $f -inputobject $movedata_log&lt;br /&gt;  &lt;br /&gt;  $SqlConnection1 = New-Object System.Data.SqlClient.SqlConnection&lt;br /&gt;  $SqlConnection1.ConnectionString = "Server=$OriginServer;Database=master;Integrated Security=True"&lt;br /&gt;  $SqlConnection1.open()&lt;br /&gt;  $SqlCmd = New-Object System.Data.SqlClient.SqlCommand&lt;br /&gt;  $SqlCmd.CommandText = "select * from $database.sys.schemas where name not in ('dbo','sys','guest','INFORMATION_SCHEMA','db_accessadmin','db_backupoperator','db_datareader','db_datawriter','db_ddladmin','db_denydatareader','db_denydatawriter','db_owner','db_securityadmin') and principal_id&lt;&gt;1"&lt;br /&gt;  $SqlCmd.Connection = $SqlConnection1&lt;br /&gt;  $SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter&lt;br /&gt;  $SqlAdapter.SelectCommand = $SqlCmd&lt;br /&gt;  $DataSet = New-Object "System.Data.DataSet" "Table2"&lt;br /&gt;  $resultado = $SqlAdapter.fill($DataSet)&lt;br /&gt;  if ($resultado -gt 0) {&lt;br /&gt;    write-host "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"&lt;br /&gt;    write-host "WARNING: There are schemas which its owner its not dbo!"&lt;br /&gt;    write-host "To fix the problem: Change the schema owner, BEFORE migrate"&lt;br /&gt;    write-host "To change the owner run: ALTER AUTHORIZATION ON SCHEMA::&lt;ROLE_NAME&gt; TO dbo"  &lt;br /&gt;    write-host "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"&lt;br /&gt;  }&lt;br /&gt;  $DataSet.clear()&lt;br /&gt;  $SqlConnection1.close()&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;Write-Host "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"&lt;br /&gt;write-host "                 DATABASE BACKUP FINISHED                     "&lt;br /&gt;Write-Host "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"&lt;br /&gt;&lt;br /&gt;if ($OriginServer.Contains("\")){&lt;br /&gt;  $mypath1 = $OriginServer.Substring(0,$OriginServer.IndexOf("\"))&lt;br /&gt; } elseif ($OriginServer.Contains(",")){&lt;br /&gt;  $mypath1 = $OriginServer.Substring(0,$OriginServer.IndexOf(","))&lt;br /&gt; } else {&lt;br /&gt;  $mypath1 =$OriginServer&lt;br /&gt;}&lt;br /&gt;$tempSourceDir = "\\" + $mypath1+ "\" + ($BackupPath -replace(":","$"))&lt;br /&gt;&lt;br /&gt;if ($DestinyServer.Contains("\")){&lt;br /&gt;  $mypath2 = $DestinyServer.Substring(0,$DestinyServer.IndexOf("\"))&lt;br /&gt; } elseif ($DestinyServer.Contains(",")){&lt;br /&gt;  $mypath2 = $DestinyServer.Substring(0,$DestinyServer.IndexOf(","))&lt;br /&gt; } else {&lt;br /&gt;  $mypath2 =$DestinyServer&lt;br /&gt;}&lt;br /&gt;$tempTargetDir = "\\" + $mypath2 + "\" + ($RestorePath -replace (":","$"))&lt;br /&gt;&lt;br /&gt;$srv2=New-Object "Microsoft.SqlServer.Management.Smo.Server" $DestinyServer&lt;br /&gt;$SqlConnection = New-Object System.Data.SqlClient.SqlConnection&lt;br /&gt;$SqlConnection.ConnectionString = "Server=$DestinyServer;Database=master;Integrated Security=True"&lt;br /&gt;$SqlConnection.Open()&lt;br /&gt;&lt;br /&gt;foreach ($myfile in [System.IO.Directory]::GetFiles($tempSourceDir,"*.bak")) {&lt;br /&gt;$mydbname = ($myfile.Remove(0,$tempSourceDir.Length)) -replace (".bak","")&lt;br /&gt;if (okMigrate($mydbname) -and $database.Name -ne "master" -and $database.Name -ne "model" -and $database.Name -ne "msdb" -and $database.Name -ne "tempdb"){&lt;br /&gt;  Write-Host "Start copying of" $myfile "to" $tempTargetDir&lt;br /&gt;  Copy-Item $myfile -Destination $tempTargetDir&lt;br /&gt;  Write-Host "Finished copying"&lt;br /&gt;  $restore=new-object "Microsoft.SqlServer.Management.Smo.Restore"&lt;br /&gt;  $restore.Action='Database'&lt;br /&gt;  $fil2=new-object "Microsoft.SqlServer.Management.Smo.BackupDeviceItem"&lt;br /&gt;  $fil2.DeviceType='File'&lt;br /&gt;  $fil2.Name=[System.IO.Path]::Combine($RestorePath,$mydbname+".bak")&lt;br /&gt;  $restore.Database=$mydbname&lt;br /&gt;  $restore.ReplaceDatabase='True'&lt;br /&gt;  $restore.Checksum='True'&lt;br /&gt;  $restore.Devices.Add($fil2)&lt;br /&gt;  #$restore.RelocateFiles.Clear()&lt;br /&gt;  $relocate_data=Get-Content ($ScriptsPath + "Relocate_" + $mydbname + ".relocate")&lt;br /&gt;  $DataFile=$relocate_data.Split(",")&lt;br /&gt;  $relocateDataFile=new-object("Microsoft.SqlServer.Management.Smo.RelocateFile")($DataFile[0],$DataFile[1])&lt;br /&gt;  $restore.RelocateFiles.Add($relocateDataFile) | Out-Null&lt;br /&gt;  $relocate_log=Get-Content ($ScriptsPath + "Relocate_" + $mydbname + "_log.relocate")&lt;br /&gt;  $LogFile=$relocate_log.Split(",")&lt;br /&gt;  $relocateLogFile=new-object("Microsoft.SqlServer.Management.Smo.RelocateFile")($LogFile[0],$LogFile[1])&lt;br /&gt;  $restore.RelocateFiles.Add($relocateLogFile) | Out-Null&lt;br /&gt;  Write-Host "Empieza el restore de"$mydbname&lt;br /&gt;  $restore.SqlRestore($srv2)&lt;br /&gt;  Write-Host "Termina el restore de"$mydbname&lt;br /&gt;  $SqlCmd = New-Object System.Data.SqlClient.SqlCommand&lt;br /&gt;  $SqlCmd.Connection = $SqlConnection&lt;br /&gt;  Write-Host "Changing" $mydbname "to Read_Write"&lt;br /&gt;  $SqlCmd.CommandText ="ALTER DATABASE $mydbname SET READ_WRITE"&lt;br /&gt;  $SqlCmd.ExecuteNonQuery() | Out-Null&lt;br /&gt;  Write-Host "Recreating users of"$mydbname&lt;br /&gt;  [diagnostics.process]::start("sqlcmd.exe","-S$DestinyServer -E -i`"" + $ScriptsPath + "Users_" + $mydbname + ".sql`"").WaitForExit()&lt;br /&gt;  Write-Host "Adding users of"$mydbname "to its roles"&lt;br /&gt;  [diagnostics.process]::start("sqlcmd.exe","-S$DestinyServer -E -i`"" + $ScriptsPath + "roles_" + $mydbname + ".sql`"").WaitForExit()&lt;br /&gt;  $srv2.Refresh()&lt;br /&gt; }&lt;br /&gt; Write-Host "Finished restore of"$mydbname&lt;br /&gt;}&lt;br /&gt;$SqlConnection.Close()&lt;br /&gt;Write-Host "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"&lt;br /&gt;Write-host "                        END OF SCRIPT                               "&lt;br /&gt;Write-Host "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"&lt;br /&gt;$mytime=get-date -uformat "%Y/%m/%d  %H:%M:%S"&lt;br /&gt;Write-Host "Current date and time:" $mytime&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6085569802552178014-219859174708748537?l=practicascomunes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://practicascomunes.blogspot.com/feeds/219859174708748537/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6085569802552178014&amp;postID=219859174708748537' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6085569802552178014/posts/default/219859174708748537'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6085569802552178014/posts/default/219859174708748537'/><link rel='alternate' type='text/html' href='http://practicascomunes.blogspot.com/2008/12/script-to-migrate-databases-with.html' title='Script to migrate databases with PowerShell.'/><author><name>practicascomunes@gmail.com</name><uri>http://www.blogger.com/profile/12750935224135642825</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6085569802552178014.post-3011472472620502078</id><published>2008-12-15T15:06:00.003-06:00</published><updated>2008-12-15T15:13:58.640-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cluster'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL 2005'/><title type='text'>Error al levantar servicio de cluster de sql.</title><content type='html'>Que tal,&lt;br /&gt;Esta semana con los parches de Microsoft, tuve un incidente un poco raro. Al instalar los parches en uno de los nodos, el servicio de cluster nunca levantó.&lt;br /&gt;&lt;br /&gt;En el event viewer se registraba lo siguiente:&lt;br /&gt;&lt;br /&gt;Cluster node MYCLUSTER failed to make a connection to the node over network 'Hearbeat'. The error code was 5.&lt;br /&gt;&lt;br /&gt;The node cannot join the server cluster because it cannot communicate with node MYOTHERNODE over any network configured for internal server cluster communication. Check the network configuration of the node and the server cluster.&lt;br /&gt;&lt;br /&gt;Después de estar por unos minutos reintando que levantara el servicio y justo cuando estabamos pensando en restaurar el system state del servidor, dimos con este artículo de la KB de microsoft: http://support.microsoft.com/kb/317232&lt;br /&gt;&lt;br /&gt;El artículo aplica solo para servidores Windows NT y 2000 y mis servidores son Windows 2003, de igual manera seguimos la recomendación, que simplemente era reiniciar el servicio de cluster en el nodo que estaba funcionando, despues de hacer esto, el servidor pudo arrancar el servicio de cluster.&lt;br /&gt;&lt;br /&gt;Cabe mencionar que hace un par de semanas, la cuenta con la que corre el servicio de cluster se le cambió su password, que fue cambiado, por cierto, usando el comando cluster, aquella vez no hubo problemas, estas son algunas de las cosas raras que pasan.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6085569802552178014-3011472472620502078?l=practicascomunes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://practicascomunes.blogspot.com/feeds/3011472472620502078/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6085569802552178014&amp;postID=3011472472620502078' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6085569802552178014/posts/default/3011472472620502078'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6085569802552178014/posts/default/3011472472620502078'/><link rel='alternate' type='text/html' href='http://practicascomunes.blogspot.com/2008/12/error-al-levantar-servicio-de-cluster.html' title='Error al levantar servicio de cluster de sql.'/><author><name>practicascomunes@gmail.com</name><uri>http://www.blogger.com/profile/12750935224135642825</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6085569802552178014.post-4453123313771658981</id><published>2008-11-24T15:22:00.002-06:00</published><updated>2008-11-24T15:32:35.092-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL 2005'/><category scheme='http://www.blogger.com/atom/ns#' term='instancia'/><category scheme='http://www.blogger.com/atom/ns#' term='memoria'/><title type='text'>Configuracion de memoria en instancias de SQL.</title><content type='html'>Hace poco leí un artículo muy interesante en el blog &lt;a href="http://www.sqlskills.com/BLOGS/PAUL/post/TechNet-Magazine-December-2008-SQL-QA-column.aspx"&gt;Paul Randal&lt;/a&gt; acerca de configurar la memoria de varias instancias en servidores SQL 2005.&lt;br /&gt;&lt;br /&gt;Basicamente lo que hay que hacer si se tiene un servidor SQL 2005-2008 con varias instancias de SQL que corren en diferentes máquinas, es asignar como memoria mínima el 40% del total de la memoria, este tip, me pareció muy interesante, porque hasta ahora todos los artículos que había visto en internet, decían que habia que poner como máximo el 40% de la memoria, para que en caso de estar las 2 instancias en el mismo nodo, no hubiera problemas.&lt;br /&gt;&lt;br /&gt;Hay que recordar que esta memoria solo es la del buffer pool memory, no es la memoria que está consumiendo la instancia de SQL.&lt;br /&gt;&lt;br /&gt;Para más información se puede ver este &lt;a href="http://msdn.microsoft.com/en-us/library/ms180797(SQL.90).aspx"&gt;link&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6085569802552178014-4453123313771658981?l=practicascomunes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://practicascomunes.blogspot.com/feeds/4453123313771658981/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6085569802552178014&amp;postID=4453123313771658981' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6085569802552178014/posts/default/4453123313771658981'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6085569802552178014/posts/default/4453123313771658981'/><link rel='alternate' type='text/html' href='http://practicascomunes.blogspot.com/2008/11/configuracion-de-memoria-en-instancias.html' title='Configuracion de memoria en instancias de SQL.'/><author><name>practicascomunes@gmail.com</name><uri>http://www.blogger.com/profile/12750935224135642825</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6085569802552178014.post-246777787220793130</id><published>2008-11-10T15:28:00.003-06:00</published><updated>2008-11-10T15:35:44.653-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL 2005'/><category scheme='http://www.blogger.com/atom/ns#' term='auditoría'/><category scheme='http://www.blogger.com/atom/ns#' term='permisos'/><title type='text'>Viendo los permisos de los roles.</title><content type='html'>Muchas veces, nos topamos con que necesitamos obtener los permisos que tiene una base de datos en partícular, pero no podemos obtener todos los permisos rápidamente o los necesitamos exportar a excel, o queremos hacer una auditoría de permisos...&lt;br /&gt;&lt;br /&gt;Para estas ocasiones aquí está un script que obtiene los permisos de una base de datos a todos los roles...&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;SELECT a.name as OBJETO,c.name as Rol, 'INSERT' as Permiso&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;FROM SYS.SYSOBJECTS A INNER JOIN sys.database_permissions B ON A.ID=B.MAJOR_ID INNER JOIN sys.database_principals c on b.grantee_principal_id=c.principal_id&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;where b.permission_name='INSERT' and a.name&lt;&gt;'dtproperties'&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;union&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;SELECT a.name as OBJETO,c.name as Rol, 'UPDATE' as Permiso&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;FROM SYS.SYSOBJECTS A INNER JOIN sys.database_permissions B ON A.ID=B.MAJOR_ID INNER JOIN sys.database_principals c on b.grantee_principal_id=c.principal_id&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;where b.permission_name='UPDATE' and a.name&lt;&gt;'dtproperties'&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;union&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;SELECT a.name as OBJETO,c.name as Rol, 'DELETE' as Permiso&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;FROM SYS.SYSOBJECTS A INNER JOIN sys.database_permissions B ON A.ID=B.MAJOR_ID INNER JOIN sys.database_principals c on b.grantee_principal_id=c.principal_id&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;where b.permission_name='DELETE' and a.name&lt;&gt;'dtproperties'&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;union&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;SELECT a.name as OBJETO,c.name as Rol, 'EXECUTE' as Permiso&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;FROM SYS.SYSOBJECTS A INNER JOIN sys.database_permissions B ON A.ID=B.MAJOR_ID INNER JOIN sys.database_principals c on b.grantee_principal_id=c.principal_id&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;where b.permission_name='EXECUTE' and a.name&lt;&gt;'dtproperties'&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;union&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;SELECT a.name as OBJETO,c.name as Rol, 'SELECT' as Permiso&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;FROM SYS.SYSOBJECTS A INNER JOIN sys.database_permissions B ON A.ID=B.MAJOR_ID INNER JOIN sys.database_principals c on b.grantee_principal_id=c.principal_id&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;where b.permission_name='SELECT' and a.name&lt;&gt;'dtproperties'&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;union&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;SELECT a.name as OBJETO,c.name as Rol, 'VIEW DEFINITION' as Permiso&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;FROM SYS.SYSOBJECTS A INNER JOIN sys.database_permissions B ON A.ID=B.MAJOR_ID INNER JOIN sys.database_principals c on b.grantee_principal_id=c.principal_id&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;where b.permission_name='VIEW DEFINITION' and a.name&lt;&gt;'dtproperties'&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Lo pueden correr tranquilamente en sus servidores sin problemas de performance, este script lo utilizo regularmente para hacer auditorías de los permisos...&lt;br /&gt;&lt;br /&gt;Obtiene un resultado parecido a este:&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Objeto                                 Rol                      Permiso&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Tabla1                             rol_users_rh         select&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Solamente se incluyen los permisos de select, insert, update, delete, execute y view definition, pero se le pueden agregar todos los permisos....&lt;br /&gt;&lt;br /&gt;Espero les sirva.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6085569802552178014-246777787220793130?l=practicascomunes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://practicascomunes.blogspot.com/feeds/246777787220793130/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6085569802552178014&amp;postID=246777787220793130' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6085569802552178014/posts/default/246777787220793130'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6085569802552178014/posts/default/246777787220793130'/><link rel='alternate' type='text/html' href='http://practicascomunes.blogspot.com/2008/11/viendo-los-permisos-de-los-roles.html' title='Viendo los permisos de los roles.'/><author><name>practicascomunes@gmail.com</name><uri>http://www.blogger.com/profile/12750935224135642825</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6085569802552178014.post-5930908129437984127</id><published>2008-10-28T15:38:00.002-06:00</published><updated>2008-10-28T15:45:49.583-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Grupos anidados'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL 2005'/><title type='text'>Grupos anidados en SQL 2005</title><content type='html'>Recientemente, necesitaba agregar un grupo local en mi servidor SQL, para esto tenía un grupo local en mi dominio y en ese grupo local, existia otro grupo global de otro dominio, esto que pretendía hacer, era para facilitar la administración, ya que si en el grupo del otro dominio agregaban o quitaban personas, yo no tenía que hacer ningun cambio.&lt;br /&gt;&lt;br /&gt;Bueno, despues de las pruebas que estuve haciendo, llegué a la conclusión que no se pueden tener grupos anidados en SQL 2005, si se necesita agregar un grupo en el servidor, es necesario que en ese grupo estén los miembros, no se pueden estar anidadando grupos, porque simplemente no funciona y la verdad, no creo que en el futuro, vaya a funcionar.&lt;br /&gt;&lt;br /&gt;En fin, al final de cuentas, tuve que agregar a los usuarios al grupo de mi dominio.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6085569802552178014-5930908129437984127?l=practicascomunes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://practicascomunes.blogspot.com/feeds/5930908129437984127/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6085569802552178014&amp;postID=5930908129437984127' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6085569802552178014/posts/default/5930908129437984127'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6085569802552178014/posts/default/5930908129437984127'/><link rel='alternate' type='text/html' href='http://practicascomunes.blogspot.com/2008/10/grupos-anidados-en-sql-2005.html' title='Grupos anidados en SQL 2005'/><author><name>practicascomunes@gmail.com</name><uri>http://www.blogger.com/profile/12750935224135642825</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6085569802552178014.post-1355189255449245652</id><published>2008-10-08T17:43:00.003-05:00</published><updated>2008-10-08T18:02:45.946-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server Configuration Manager'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL 2005'/><category scheme='http://www.blogger.com/atom/ns#' term='instancia'/><title type='text'>Instalando instancias de SQL 2005 en diferentes ips.</title><content type='html'>Hace unos días, tenía que instalar una segunda instancia de SQL 2005 en un servidor backup, lo interesante era, que esta instancia tenía que tener otra ip diferente, debido a que este servidor backup era el respaldo de 2 servidores, uno con la instancia default y otro con instancia.&lt;br /&gt;&lt;br /&gt;Esto con SQL 2000 no fuera posible, pero ya en SQL 2005 es posible, quedando la instancia default con una ip y la otra instancia con otra ip, estos son los pasos que realizé:&lt;br /&gt;&lt;br /&gt;1. Instalar la instancia usando el setup de SQL 2005.&lt;br /&gt;2. Agregar la segunda ip del servidor.&lt;br /&gt;3. Abrir la consola del &lt;span style="font-style: italic;"&gt;SQL Server Configuration Manager&lt;/span&gt;, en la sección SQL Server 2005 Network Configuration, abrir los protocols para la instancia default.&lt;br /&gt;&lt;br /&gt;En el tab Protocol, la sección Listen All: No&lt;br /&gt;En el tab IP Addresses, seleccionar la ip al que quedará bindeada la instancia default, y  deberá quedar así:&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Active: Yes&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Enabled: Yes&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;IP Address: (la ip a bindear)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;TCP Dynamic Ports (en blanco)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;TCP Port: 1433&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Al final en IPALL:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;TCP Dynamic Ports (en blanco)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt; TCP Port: 1433&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ahora configurar la ip para la otra instancia:&lt;br /&gt;En la sección TCP/IP de Protocols, configurar lo siguiente:&lt;br /&gt;En el tab Protocol, la sección Listen All: No&lt;br /&gt;En el tab IP Addresses, seleccionar la ip al que quedará bindeada la otra instancia  y  deberá quedar así:&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Active: Yes&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt; Enabled: Yes&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt; IP Address: (la ip a bindear)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt; TCP Dynamic Ports (en blanco)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt; TCP Port: 1433&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&lt;span style="font-style: italic;"&gt; Al final en IPALL:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt; TCP Dynamic Ports (en blanco)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;  TCP Port: 1433&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Después de hacer esto hay que reiniciar los servicios de SQL de la instancia default y de la otra instancia.&lt;br /&gt;&lt;br /&gt;Como esta segunda ip no se está registrando en los DNS, puede ser necesario crear un registro host en los DNS asignandole un nombre y crear un c-name apuntando al host.&lt;br /&gt;&lt;br /&gt;Es importante que el servicio SQL Server Browser esté encendido para que se pueda direccionar correctamente al usuario a la instancia que le corresponde.&lt;br /&gt;&lt;br /&gt;Para saber que esto está configurado correctamente se puede correr el siguiente comando desde un Command Prompt:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;netstat -an | find "LISTEN" | find "143"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Que deberá dar como resultado, algo parecido a esto:&lt;br /&gt; &lt;span style="font-weight: bold;"&gt; TCP    192.168.0.1:1433         0.0.0.0:0              LISTENING&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;  TCP    192.168.0.2:1433         0.0.0.0:0              LISTENING&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;  TCP    127.0.0.1:1434         0.0.0.0:0              LISTENING&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Lo cual indica que cada ip tiene asignada una instancia.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6085569802552178014-1355189255449245652?l=practicascomunes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://practicascomunes.blogspot.com/feeds/1355189255449245652/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6085569802552178014&amp;postID=1355189255449245652' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6085569802552178014/posts/default/1355189255449245652'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6085569802552178014/posts/default/1355189255449245652'/><link rel='alternate' type='text/html' href='http://practicascomunes.blogspot.com/2008/10/instalando-instancias-de-sql-2005-en.html' title='Instalando instancias de SQL 2005 en diferentes ips.'/><author><name>practicascomunes@gmail.com</name><uri>http://www.blogger.com/profile/12750935224135642825</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6085569802552178014.post-5885167413382151098</id><published>2008-09-23T15:36:00.004-05:00</published><updated>2008-09-23T15:54:40.204-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SMO'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL 2005'/><category scheme='http://www.blogger.com/atom/ns#' term='Disaster Recovery'/><category scheme='http://www.blogger.com/atom/ns#' term='PowerShell'/><category scheme='http://www.blogger.com/atom/ns#' term='role'/><title type='text'>Scripting role members in every database using PowerShell.</title><content type='html'>Hi, &lt;br /&gt;Starting this post I will be writing in English, in order to reach the users from the &lt;a href="http://powershellcommunity.org/"&gt;PowerShell Community&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Previously, I shared some scripts written in PowerShell to generate automatically some configurations (like users, jobs, linked servers, etc) in SQL Server 2005 using SMO with PowerShell.&lt;br /&gt;&lt;br /&gt;In this &lt;a href="http://practicascomunes.blogspot.com/2008/08/mas-scripts-de-smo-sql-2005-y.html"&gt;post&lt;/a&gt;,  I wrote a script to generate the users in every database, that script had an error, the script generated needed a GO command before the instruction to add the user to their respective role.&lt;br /&gt;&lt;br /&gt;So, I created this script to generate a script with the sys.sp_addrolemember instruction for every role,it is helpful if you want to restore any database in other server (you would need first to recreate the users with the other script) or in case a Disaster Recovery scenario.&lt;br /&gt;&lt;br /&gt;So, this is the script:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;param (&lt;br /&gt;[string] $serverName&lt;br /&gt;)&lt;br /&gt;$Scripts = "c:\scripts\"&lt;br /&gt;&lt;br /&gt;[reflection.assembly]::LoadWithPartialName("Microsoft.SqlServer.Smo") | out-null&lt;br /&gt;$MyScripter=new-object ("Microsoft.SqlServer.Management.Smo.Scripter")&lt;br /&gt;$srv=New-Object "Microsoft.SqlServer.Management.Smo.Server" $serverName&lt;br /&gt;&lt;br /&gt;foreach($db in $srv.databases) {&lt;br /&gt;if ($db.Name -ne "master" -and $db.Name -ne "model" -and $db.Name -ne "msdb" -and $db.Name -ne "tempdb") {&lt;br /&gt;$f = [System.IO.Path]::Combine($Scripts, $srv.Name +"_roles_" + $db.Name + ".sql")&lt;br /&gt;out-file -filePath $f -inputobject "USE $db"&lt;br /&gt;out-file -filePath $f -inputobject "GO" -Append&lt;br /&gt; foreach ($role in $db.Roles) {&lt;br /&gt;  if ($role.Name -ne "public") {&lt;br /&gt;                foreach ($member in $role.EnumMembers()) {&lt;br /&gt;         if ($member -ne "dbo") {&lt;br /&gt;               $var = "sys.sp_addrolemember @rolename = N'" + $role.Name+"', @membername  = N'"+$member+"'"&lt;br /&gt;            out-file -filePath $f -inputobject $var -append&lt;br /&gt;            out-file -filePath $f -inputobject "GO" -append&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt; }    &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;To run this script, you just need to specify the sql server and it will generate in c:\scripts a file for every database containing the script to add the members for every user, just like this:&lt;br /&gt;&lt;br /&gt;USE [MyDB]&lt;br /&gt;GO&lt;br /&gt;sys.sp_addrolemember @rolename = N'HR', @membername = N'user1'&lt;br /&gt;GO&lt;br /&gt;sys.sp_addrolemember @rolename = N'sales', @membername = N'user2'&lt;br /&gt;GO&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6085569802552178014-5885167413382151098?l=practicascomunes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://practicascomunes.blogspot.com/feeds/5885167413382151098/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6085569802552178014&amp;postID=5885167413382151098' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6085569802552178014/posts/default/5885167413382151098'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6085569802552178014/posts/default/5885167413382151098'/><link rel='alternate' type='text/html' href='http://practicascomunes.blogspot.com/2008/09/scripting-role-members-in-every.html' title='Scripting role members in every database using PowerShell.'/><author><name>practicascomunes@gmail.com</name><uri>http://www.blogger.com/profile/12750935224135642825</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6085569802552178014.post-5931769374708785226</id><published>2008-09-10T18:43:00.003-05:00</published><updated>2008-09-10T18:58:09.041-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='default_schema'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL 2005'/><category scheme='http://www.blogger.com/atom/ns#' term='esquemas'/><title type='text'>Mas de los esquemas en SQL 2005.</title><content type='html'>En un post anterior comentaba acerca de lo recomendable que era que los owners de los esquemas no debían ser los mismo usuarios, para evitar problemas en futuras migraciones.&lt;br /&gt;&lt;br /&gt;Pues bien, según una entrada del blog de &lt;a href="http://blogs.msdn.com/mssqlisv/archive/2007/03/23/upgrading-to-sql-server-2005-and-default-schema-setting.aspx"&gt;Microsoft ISV Program Management Team&lt;/a&gt;, lo mejor que puedes hacer después de haber migrado a SQL 2005 es cambiar el default esquema de los usuarios a dbo, esto te dará un aumento de hasta un 15% en el throughput del servidor, esto, si en las llamadas que se hacen a los objetos no se incluye "dbo", que es un best practice, por cierto.&lt;br /&gt;&lt;br /&gt;Se puede cambiar el default esquema de los usuarios fácilmente con el comando ALTER USER &lt;username/&gt; WITH DEFAULT_SCHEMA=dbo&lt;br /&gt;&lt;br /&gt;Se puede utilizar este script para obtener como respuesta el script que se tiene que correr en cada base de datos:&lt;br /&gt;&lt;br /&gt;select 'alter user '+ name + ' with DEFAULT_SCHEMA=dbo;'&lt;br /&gt;from sys.database_principals&lt;br /&gt;where default_schema_name is not null and name&lt;&gt;'dbo' and name &lt;&gt;'guest' and default_schema_name&lt;&gt;'dbo'&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Esto se corre en cada base de datos, en la que se desea hacer y se obtiene de resultado el script con el que se cambian todos los usuarios rápidamente.&lt;br /&gt;&lt;br /&gt;Una vez que se cambió el default esquema de los usuarios, lo recomendable es eliminar los esquemas de los usuarios, con este script se pueden obtener el script para eliminar los esquemas por cada base de datos:&lt;br /&gt;&lt;br /&gt;select 'DROP SCHEMA '+ name + ';'&lt;br /&gt;from sys.schemas&lt;br /&gt;where schema_id between 5 and 16383&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6085569802552178014-5931769374708785226?l=practicascomunes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://practicascomunes.blogspot.com/feeds/5931769374708785226/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6085569802552178014&amp;postID=5931769374708785226' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6085569802552178014/posts/default/5931769374708785226'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6085569802552178014/posts/default/5931769374708785226'/><link rel='alternate' type='text/html' href='http://practicascomunes.blogspot.com/2008/09/mas-de-los-esquemas-en-sql-2005.html' title='Mas de los esquemas en SQL 2005.'/><author><name>practicascomunes@gmail.com</name><uri>http://www.blogger.com/profile/12750935224135642825</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6085569802552178014.post-4348241046506591553</id><published>2008-09-03T15:56:00.006-05:00</published><updated>2008-09-03T16:04:22.402-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL 2005'/><category scheme='http://www.blogger.com/atom/ns#' term='login huérfano'/><category scheme='http://www.blogger.com/atom/ns#' term='linked server'/><title type='text'>Detectando logins huérfanos.</title><content type='html'>Un script que puede ser útil para quienes tienen servidores SQL 2005 y que necesitan saber rápidamente si tienen en sus servidores logins que ya nadie los ocupa, es decir, no están como usuarios en ninguna base  de datos, no están como local user en ningún linked server, no pertenecen a ningún rol de servidor y están habilitados.&lt;br /&gt;&lt;br /&gt;Aquí está el código:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;DECLARE @&lt;/span&gt;dbname&lt;span style="font-style: italic;"&gt;2 &lt;/span&gt;varchar&lt;span style="font-style: italic;"&gt;(40);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;DECLARE &lt;/span&gt;dbname&lt;span style="font-style: italic;"&gt; CURSOR FOR select name from master.sys.databases';&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;OPEN &lt;/span&gt;dbname&lt;br /&gt;&lt;span style="font-style: italic;"&gt;FETCH NEXT FROM &lt;/span&gt;dbname&lt;br /&gt;&lt;span style="font-style: italic;"&gt;INTO @&lt;/span&gt;dbname&lt;span style="font-style: italic;"&gt;2&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;create table #&lt;/span&gt;nombres&lt;span style="font-style: italic;"&gt;(&lt;/span&gt;&lt;br /&gt;nombre&lt;span style="font-style: italic;"&gt; &lt;/span&gt;varchar&lt;span style="font-style: italic;"&gt; (128))&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;WHILE @@FETCH_STATUS = 0&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;      BEGIN  &lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;            exec('SET &lt;/span&gt;NOCOUNT&lt;span style="font-style: italic;"&gt; ON;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;                use [' + @dbname2 + ']&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;                INSERT #&lt;/span&gt;nombres&lt;br /&gt;&lt;span style="font-style: italic;"&gt;                select b.name&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;                from &lt;/span&gt;sys&lt;span style="font-style: italic;"&gt;.database_principals a inner join &lt;/span&gt;sys&lt;span style="font-style: italic;"&gt;.server_principals b on a.sid=b.sid&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;                where a.type_&lt;/span&gt;desc&lt;span style="font-style: italic;"&gt; &lt;&gt; ''DATABASE_ROLE'' and a.name &lt;&gt; ''&lt;/span&gt;dbo&lt;span style="font-style: italic;"&gt;''&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;                and a.name &lt;&gt; ''guest'' and a.name &lt;&gt; ''INFORMATION_SCHEMA'' and a.name &lt;&gt; ''&lt;/span&gt;sys&lt;span style="font-style: italic;"&gt;'' ')&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;                FETCH NEXT FROM &lt;/span&gt;dbname&lt;span style="font-style: italic;"&gt; INTO @&lt;/span&gt;dbname&lt;span style="font-style: italic;"&gt;2&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;END&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;  CLOSE &lt;/span&gt;dbname &lt;br /&gt;&lt;span style="font-style: italic;"&gt;  &lt;/span&gt;DEALLOCATE&lt;span style="font-style: italic;"&gt; &lt;/span&gt;dbname&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;DECLARE users CURSOR FOR select distinct(&lt;/span&gt;nombre&lt;span style="font-style: italic;"&gt;) from #&lt;/span&gt;nombres&lt;span style="font-style: italic;"&gt; order by &lt;/span&gt;nombre&lt;span style="font-style: italic;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;declare @&lt;/span&gt;usuario&lt;span style="font-style: italic;"&gt; &lt;/span&gt;varchar&lt;span style="font-style: italic;"&gt;(128);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;OPEN users&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;FETCH NEXT FROM users&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;INTO @&lt;/span&gt;usuario&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;create table #&lt;/span&gt;sids&lt;span style="font-style: italic;"&gt;(&lt;/span&gt;&lt;br /&gt;sid&lt;span style="font-style: italic;"&gt; &lt;/span&gt;varbinary&lt;span style="font-style: italic;"&gt;(256),&lt;/span&gt;&lt;br /&gt;nombre&lt;span style="font-style: italic;"&gt; &lt;/span&gt;varchar&lt;span style="font-style: italic;"&gt;(128) )&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;WHILE @@FETCH_STATUS = 0&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;      BEGIN  &lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;            exec('SET &lt;/span&gt;NOCOUNT&lt;span style="font-style: italic;"&gt; ON;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;                  INSERT #&lt;/span&gt;sids&lt;br /&gt;&lt;span style="font-style: italic;"&gt;                  select &lt;/span&gt;suser&lt;span style="font-style: italic;"&gt;_&lt;/span&gt;sid&lt;span style="font-style: italic;"&gt;('''+ @&lt;/span&gt;usuario&lt;span style="font-style: italic;"&gt; +'''),'''+@usuario+'''')&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;            FETCH NEXT FROM users INTO @&lt;/span&gt;usuario&lt;br /&gt;&lt;span style="font-style: italic;"&gt;END&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;  CLOSE users&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;  &lt;/span&gt;DEALLOCATE&lt;span style="font-style: italic;"&gt; users&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;select a.name as &lt;/span&gt;login&lt;br /&gt;&lt;span style="font-style: italic;"&gt;from &lt;/span&gt;sys&lt;span style="font-style: italic;"&gt;.server_principals a left join #&lt;/span&gt;sids&lt;span style="font-style: italic;"&gt; b on a.sid=b.sid&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;where b.&lt;/span&gt;sid&lt;span style="font-style: italic;"&gt; is null and a.type_&lt;/span&gt;desc&lt;span style="font-style: italic;"&gt; &lt;&gt;'CERTIFICATE_MAPPED_&lt;/span&gt;LOGIN&lt;span style="font-style: italic;"&gt;' and a.type_&lt;/span&gt;desc &lt;&gt;'SERVER_ROLE' and a.name &lt;&gt; 'sa&lt;span style="font-style: italic;"&gt;'&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;and a.name &lt;&gt;'&lt;/span&gt;BUILTIN&lt;span style="font-style: italic;"&gt;\Administrators' and a.name &lt;&gt;'NT AUTHORITY\SYSTEM' and a.principal_id&lt;&gt;259&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;and a.principal_id not in (select distinct(local_principal_id) from &lt;/span&gt;sys&lt;span style="font-style: italic;"&gt;.linked_&lt;/span&gt;logins&lt;span style="font-style: italic;"&gt;) and a.is_disabled=0&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;and a.principal_id not in (select member_principal_id from &lt;/span&gt;sys&lt;span style="font-style: italic;"&gt;.server_role_members)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;order by a.name&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;drop table #&lt;/span&gt;nombres&lt;br /&gt;&lt;span style="font-style: italic;"&gt;drop table #&lt;/span&gt;sids&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6085569802552178014-4348241046506591553?l=practicascomunes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://practicascomunes.blogspot.com/feeds/4348241046506591553/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6085569802552178014&amp;postID=4348241046506591553' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6085569802552178014/posts/default/4348241046506591553'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6085569802552178014/posts/default/4348241046506591553'/><link rel='alternate' type='text/html' href='http://practicascomunes.blogspot.com/2008/09/detectando-logins-hurfanos.html' title='Detectando logins huérfanos.'/><author><name>practicascomunes@gmail.com</name><uri>http://www.blogger.com/profile/12750935224135642825</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6085569802552178014.post-1992016254985208720</id><published>2008-08-22T15:56:00.004-05:00</published><updated>2008-09-03T16:06:18.995-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Practicas Comunes'/><category scheme='http://www.blogger.com/atom/ns#' term='migración'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL 2005'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL 2000'/><category scheme='http://www.blogger.com/atom/ns#' term='ALTER AUTHORIZATION'/><category scheme='http://www.blogger.com/atom/ns#' term='esquemas'/><title type='text'>SQL 2005 y los esquemas.</title><content type='html'>Para los que hicieron su migración de bases de datos de SQL 2000 a SQL 2005, usando el tradicional método de backup/restore, tienen que tomar en cuenta que al hacer la migración se crearon esquemas por cada rol y usuario en cada base de datos.&lt;br /&gt;&lt;br /&gt;Esto podría estar bien para aquellos entornos en que manejen así la seguridad, pero podría crear ciertos "problemas" para los que no. Uno de ellos es que cada user al migrarse es el owner de su esquema y no se puede eliminar por lo mismo.&lt;br /&gt;&lt;br /&gt;El error que marca es el siguiente: Msg 15138, Level 16, State 1, Line 1&lt;br /&gt;The database principal owns a schema in the database, and cannot be dropped.&lt;br /&gt;&lt;br /&gt;Por lo que es necesario que antes de querer eliminar el user, se cambie el owner del esquema o bien se elimine el esquema.&lt;br /&gt;&lt;br /&gt;Cambiar el owner de un esquema es muy sencillo, solamente hay que ejecutar esto:&lt;br /&gt;&lt;span style="font-style: italic;"&gt;ALTER AUTHORIZATION ON SCHEMA::[nombre_del_esquema] TO DBO;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Es recomendable hacerlo, para evitar en una futura migración, en la que se borran y vuelven a crear los usuarios.&lt;br /&gt;&lt;br /&gt;Un script que se puede utilizar para generar scripts que hagan el cambio de owner de todos los esquemas es el siguiente:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;select 'ALTER AUTHORIZATION ON SCHEMA::['+ name + '] TO DBO;'&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;from sys.schemas where name not in ('dbo','sys','guest','INFORMATION_SCHEMA','db_accessadmin','db_backupoperator','db_datareader','db_datawriter','db_ddladmin','db_denydatareader','db_denydatawriter','db_owner','db_securityadmin')&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;and principal_id&lt;&gt;1 order by schema_id&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Solamente hay que estar en cada una de las bases de datos y correr el script. Una vez que se haya hecho el cambio de owner en los esquemas, los esquemas se pueden eliminar o bien dejarlos en la base de datos.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6085569802552178014-1992016254985208720?l=practicascomunes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://practicascomunes.blogspot.com/feeds/1992016254985208720/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6085569802552178014&amp;postID=1992016254985208720' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6085569802552178014/posts/default/1992016254985208720'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6085569802552178014/posts/default/1992016254985208720'/><link rel='alternate' type='text/html' href='http://practicascomunes.blogspot.com/2008/08/sql-2005-y-los-esquemas.html' title='SQL 2005 y los esquemas.'/><author><name>practicascomunes@gmail.com</name><uri>http://www.blogger.com/profile/12750935224135642825</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6085569802552178014.post-6177306886694564140</id><published>2008-08-18T09:36:00.003-05:00</published><updated>2008-08-18T09:52:47.556-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='firmware'/><category scheme='http://www.blogger.com/atom/ns#' term='HP'/><category scheme='http://www.blogger.com/atom/ns#' term='7-zip'/><category scheme='http://www.blogger.com/atom/ns#' term='Smart Array'/><title type='text'>Actualizando firmware de Smart Array E200i</title><content type='html'>Hace poco estaba actualizando el firmware en un servidor Proliant BL460c G1 de HP.&lt;br /&gt;&lt;br /&gt;En una de esas actualizaciones, actualizé el firmware de la tarjeta controladora de los arreglos (Smart Array E200i Controller) de la versión 1.66 a la versión 1.78, lo hice usando el exe que viene para servidores Windows 2003 a 32 bits, todo transcurrió normalmente, me conecté por la ILO y me di cuenta que al iniciar el servidor marcó unos mensaje y no encontró los discos duros y se pasó a la parte del PXE, así que le di un reboot nuevamente y ya pudo iniciar Windows.&lt;br /&gt;&lt;br /&gt;Pero, al iniciar marcaba este mensaje: "A firmware update is needed for the physical drive with product ID GD072ABAB3 connected to array controller [Embedded].   The recommended minimum firmware revision should be HPDA." Obviamente no podía dejar el servidor así, ya que se iba a reinstalar y no quería que esto ocasionara problemas en el futuro.&lt;br /&gt;&lt;br /&gt;Así que bajé el  archivo .iso de la página de HP, con todos los firmware, utilizé el 7-zip para descomprimir el iso (y así no tener que quemar un CD), puse los archivos del iso en el servidor, ejecuté el el archivo CDBrowser, dentro del folder /compaq/CDBrowser, mediante la página del HomePage del servidor, chequé el modelo de los discos duros, en este caso DG072ABAB3, y en la sección de Device ahi estaba el modelo (SAS 72 GB 10K drives DG072ABAB3), desde la misma herramienta ejecuté el instalador y reinicié el servidor.&lt;br /&gt;&lt;br /&gt;Cuando se estaba reiniciando el servidor detectó que estaba pendiente hacer un upgrade de versión de los discos y me presentaba 3 opciones, actualizar el porcentaje del update, dejar el update para el siguiente restart o cancelarlo, yo dejé que solo se actualizara y al cabo de unos 2 minutos, el update terminó y desaparecieron los mensajes de Warning.&lt;br /&gt;&lt;br /&gt;Esto para tener en cuenta en un upgrade de versión de firmware de la tarjeta controladora de HP, la versión puede quedar muy arriba que puede ser que sea necesario actualizar los disco, lo que yo recomendaría sería primero actualizar el firmware de los discos duros, para evitar este tipo de sorpresas.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6085569802552178014-6177306886694564140?l=practicascomunes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://practicascomunes.blogspot.com/feeds/6177306886694564140/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6085569802552178014&amp;postID=6177306886694564140' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6085569802552178014/posts/default/6177306886694564140'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6085569802552178014/posts/default/6177306886694564140'/><link rel='alternate' type='text/html' href='http://practicascomunes.blogspot.com/2008/08/actualizando-firmware-de-smart-array.html' title='Actualizando firmware de Smart Array E200i'/><author><name>practicascomunes@gmail.com</name><uri>http://www.blogger.com/profile/12750935224135642825</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6085569802552178014.post-6191148342718589091</id><published>2008-08-12T15:01:00.006-05:00</published><updated>2008-09-03T16:21:35.090-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SMO'/><category scheme='http://www.blogger.com/atom/ns#' term='Practicas Comunes'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL 2005'/><category scheme='http://www.blogger.com/atom/ns#' term='PowerShell'/><title type='text'>Mas scripts de SMO-SQL 2005 y PowerShell.</title><content type='html'>En el último post expuse algunos scripts de PowerShell para obtener diferentes propiedades de los servidores SQL 2005. En este post voy a continuar explicando algunos otros que también son muy útiles en una política de Disaster Recover de SQL 2005.&lt;br /&gt;&lt;br /&gt;El primer script servirá para obtener el script para recrear los usuarios de cada base de datos y agregarlos en su rol correspondiente.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;param ( [string] $serverName )&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;$RutaScripts = "c\scripts\"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;[void][reflection.assembly]::LoadWithPartialName("Microsoft.SqlServer.Smo")&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;$MyScripter=new-object ("Microsoft.SqlServer.Management.Smo.Scripter")&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;$srv=New-Object "Microsoft.SqlServer.Management.Smo.Server" $serverName&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;$MyScripter.Options.FileName = $f&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;$MyScripter.Options.AppendToFile = $true&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;$MyScripter.Server=$srv&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;write-host "Obteniendo el script para recrear los usuarios..."&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;foreach($db in $srv.databases) {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;$f = [System.IO.Path]::Combine($RutaScripts, $nombre + "_Usuarios_" + $db.name + ".sql")&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;   if ($db.Name -ne "master" -and $db.Name -ne "model" -and $db.Name -ne "msdb" -and $db.Name -ne "tempdb") {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;   $MyScripter.options.IncludeDatabaseContext = $true  &lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;       foreach ($User in $db.Users) {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;               if ($User.Name -ne "sys" -and $User.Name -ne "dbo" -and $User.Name -ne "INFORMATION_SCHEMA" -and $User.Name -ne "guest") {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;                   $MyScripter.Options.IncludeIfNotExists = $true&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;                   $MyScripter.Options.ScriptDrops = $true&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;                   $MyScripter.Script($User) | Out-file $f -append&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;               }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;               if ($User.Name -ne "sys" -and $User.Name -ne "dbo" -and $User.Name -ne "INFORMATION_SCHEMA" -and $User.Name -ne "guest") {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;                   $MyScripter.options.IncludeDatabaseContext = $false&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;                   $MyScripter.Options.IncludeDatabaseRoleMemberships = $true&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;                   $MyScripter.Options.ScriptDrops = $false&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;                   $MyScripter.Script($User) | Out-file $f -append&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;                   out-file -filePath $f -inputobject "`n" -append&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;               }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;       }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;   }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;El siguiente script sirve para obtener un script con los permisos de cada base de datos:&lt;br /&gt;&lt;span style="font-style: italic;"&gt;param ( [string] $serverName )&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;$RutaScripts = "c\scripts\"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;[void][reflection.assembly]::LoadWithPartialName("Microsoft.SqlServer.Smo")&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;$MyScripter=new-object ("Microsoft.SqlServer.Management.Smo.Scripter")&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;$srv=New-Object "Microsoft.SqlServer.Management.Smo.Server" $serverName&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;$MyScripter.Options.FileName = $f&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;$MyScripter.Options.AppendToFile = $true&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;$MyScripter.Server=$srv&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;write-host "Obteniendo el script de permisos de cada base de datos..."&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;foreach($db in $srv.databases) {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;   if ($db.Name -ne "master" -and $db.Name -ne "model" -and $db.Name -ne "msdb" -and $db.Name -ne "tempdb") {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;       $f = [System.IO.Path]::Combine($RutaScripts, $nombre +"_permisos_" + $db.Name + ".sql")&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;       out-file -filePath $f -inputobject "USE $db `nGO`n"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;           foreach ($permiso in $db.EnumObjectPermissions()| where {$_.Grantee.ToString() -ne 'public'} ) {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;           $var=[string]$permiso.PermissionState+" "+$permiso.PermissionType+" ON "+$permiso.Grantor+"."+$permiso.ObjectName+" TO "+$permiso.Grantee&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;           out-file -filePath $f -inputobject $var -append&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;           out-file -filePath $f -inputobject "GO" -append&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;           }              &lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;   }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;En los siguientes posts estaré dando más tips para establecer políticas de Disaster Recovery para servidores SQL 2000 o 2005.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6085569802552178014-6191148342718589091?l=practicascomunes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://practicascomunes.blogspot.com/feeds/6191148342718589091/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6085569802552178014&amp;postID=6191148342718589091' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6085569802552178014/posts/default/6191148342718589091'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6085569802552178014/posts/default/6191148342718589091'/><link rel='alternate' type='text/html' href='http://practicascomunes.blogspot.com/2008/08/mas-scripts-de-smo-sql-2005-y.html' title='Mas scripts de SMO-SQL 2005 y PowerShell.'/><author><name>practicascomunes@gmail.com</name><uri>http://www.blogger.com/profile/12750935224135642825</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6085569802552178014.post-2296551074171384625</id><published>2008-08-08T14:43:00.003-05:00</published><updated>2008-09-03T16:21:49.946-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SMO'/><category scheme='http://www.blogger.com/atom/ns#' term='Practicas Comunes'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL 2005'/><category scheme='http://www.blogger.com/atom/ns#' term='PowerShell'/><title type='text'>Utilizando PoweShell con SQL 2005 SMO.</title><content type='html'>Ultimamente he estado utilizando PowerShell para ir creando un procedimiento para un Disaster Recovery Plan de SQL. En las siguientes entradas iré posteando información sobre como ir haciendo pequeños scripts que nos ayudarán para la administración de servidores SQL y como una herramienta para un DR.&lt;br /&gt;&lt;br /&gt;Primeramente es necesario bajar de la página de Microsoft el PowerShell 1.0 y tener instaladas las herramientas de SQL 2005.&lt;br /&gt;&lt;br /&gt;Es recomendable bajar la documentación del PowerShell de la misma página de Microsoft, la página que tiene &lt;a href="http://www.databasejournal.com/article.php/3300441"&gt;The Mak&lt;/a&gt; en Database Journal es muy útil para ir aprendiendo de SQL 2005 con PowerShell, les estaré dando algunos ejemplos prácticos de cómo se puede utilizar como una herramienta para asegurar que se tiene un servidor backup de SQL listo para entrar en operación.&lt;br /&gt;&lt;br /&gt;Una de las cosas que se tienen que asegurar siempre en un servidor es tener un respaldo de la configuración del servidor y de las bases de datos, así que voy a empezar con algunos ejemplos para obtener scripts de los servidores SQL.&lt;br /&gt;&lt;br /&gt;Para correr los scripts solamente hay que guardar los scripts siguientes como archivo .ps1 y pasar de parámetro el nombre del servidor SQL con el quieren trabajar, por ejemplo: .\script1 "myserver".&lt;br /&gt;&lt;br /&gt;Script para Recrear todos los jobs configurados en el servidor:&lt;br /&gt;&lt;br /&gt;&lt;span&gt;param ( &lt;/span&gt;&lt;br /&gt;&lt;span&gt;[string] $serverName &lt;/span&gt;&lt;br /&gt;&lt;span&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span&gt;$RutaScripts = "c:\scripts\"&lt;/span&gt;&lt;br /&gt;&lt;span&gt;void][reflection.assembly]::LoadWithPartialName("Microsoft.SqlServer.Smo")&lt;/span&gt;&lt;br /&gt;&lt;span&gt;$MyScripter=new-object ("Microsoft.SqlServer.Management.Smo.Scripter")&lt;/span&gt;&lt;br /&gt;&lt;span&gt;$MyScripter.Options.FileName = $f&lt;/span&gt;&lt;br /&gt;&lt;span&gt;$MyScripter.Options.AppendToFile = $true&lt;/span&gt;&lt;br /&gt;&lt;span&gt;$MyScripter.Server=$srv&lt;/span&gt;&lt;br /&gt;&lt;span&gt;$jobs=$srv.jobserver.jobs&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;write-host "Obteniendo el script para recrear los jobs..."&lt;/span&gt;&lt;br /&gt;&lt;span&gt;$f = [System.IO.Path]::Combine($RutaScripts, $nombre + "_jobs.sql")&lt;/span&gt;&lt;br /&gt;&lt;span&gt;out-file -filePath $f -inputobject "USE MASTER `nGO`n"&lt;/span&gt;&lt;br /&gt;&lt;span&gt;foreach ($job in $srv.jobserver.jobs) {&lt;/span&gt;&lt;br /&gt;&lt;span&gt;        $MyScripter.Script($job) &gt;&gt; $f&lt;/span&gt;&lt;br /&gt;&lt;span&gt;        out-file -filePath $f -inputobject "`n" -append&lt;/span&gt;&lt;br /&gt;&lt;span&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Con este script se obtiene en un archivo de texto todos los jobs configurados en el servidor, con este script se puede configurar un servidor de respaldo en segundos (solamente hay que cambiar la variable Enabled a 0)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Script para recrear todos los logins:&lt;br /&gt;&lt;span style="font-style: italic;"&gt;param (&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;[string] $serverName&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;$RutaScripts = "c:\scripts\"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;void][reflection.assembly]::LoadWithPartialName("Microsoft.SqlServer.Smo")&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;$MyScripter=new-object ("Microsoft.SqlServer.Management.Smo.Scripter")&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;$MyScripter.Options.FileName = $f&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;$MyScripter.Options.AppendToFile = $true&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;$MyScripter.Server=$srv&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;write-host "Obteniendo el script para recrear los logins..."&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;$f = [System.IO.Path]::Combine($RutaScripts, $nombre + "_logins.sql")&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;out-file -filePath $f -inputobject "USE MASTER `nGO`n"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;foreach($login in $srv.logins) {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;           $MyScripter.options.IncludeDatabaseContext = $true&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;           $MyScripter.Options.IncludeIfNotExists = $true&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;           $MyScripter.Options.ScriptDrops = $true&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;           $MyScripter.Script($login) | out-file $f -append&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;           $MyScripter.Options.IncludeIfNotExists = $true&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;           $MyScripter.Options.ScriptDrops = $false&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;           $MyScripter.Script($login) | out-file $f -append&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;           out-file -filePath $f -inputobject "`n" -append&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Este script es muy útil también cuando se está configurando un servidor de respaldo, obtiene todos los logins configurados, solamente hay que sustituir el password por el correcto y quitar la línea del disable, ya que por default SQL 2005 crea los logins deshabilitados.&lt;br /&gt;&lt;br /&gt;Script para recrear todos los backup devices:&lt;br /&gt;&lt;span&gt;param ( &lt;/span&gt;&lt;br /&gt;&lt;span&gt;[string] $serverName &lt;/span&gt;&lt;br /&gt;&lt;span&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span&gt;$RutaScripts = "c:\scripts\"&lt;/span&gt;&lt;br /&gt;&lt;span&gt;void][reflection.assembly]::LoadWithPartialName("Microsoft.SqlServer.Smo")&lt;/span&gt;&lt;br /&gt;&lt;span&gt;$MyScripter=new-object ("Microsoft.SqlServer.Management.Smo.Scripter")&lt;/span&gt;&lt;br /&gt;&lt;span&gt;$MyScripter.Options.FileName = $f&lt;/span&gt;&lt;br /&gt;&lt;span&gt;$MyScripter.Options.AppendToFile = $true&lt;/span&gt;&lt;br /&gt;&lt;span&gt;$MyScripter.Server=$srv&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;out-file -filepath $ArchivoLog -inputobject "$hora Obteniendo el script para recrear los Backup Devices..." -append&lt;/span&gt;&lt;br /&gt;&lt;span&gt;write-host "Obteniendo el script para recrear los Backup Devices..."&lt;/span&gt;&lt;br /&gt;&lt;span&gt;$f = [System.IO.Path]::Combine($RutaScripts, $nombre + "_Backup_devices.sql")&lt;/span&gt;&lt;br /&gt;&lt;span&gt;out-file -filePath $f -inputobject "USE MASTER `nGO`n"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;foreach($backup in $srv.backupdevices) {&lt;/span&gt;&lt;br /&gt;&lt;span&gt;                $MyScripter.Script($backup) | out-file $f -append&lt;/span&gt;&lt;br /&gt;&lt;span&gt;                out-file -filePath $f -inputobject "`n" -append&lt;/span&gt;&lt;br /&gt;&lt;span&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Con este script como se indica en la descripción se obtiene el script de todos los backup devices, con este script puedes instalar el servidor en segundos.&lt;br /&gt;&lt;br /&gt;Script para recrear los linked servers:&lt;br /&gt;&lt;span&gt;param ( &lt;/span&gt;&lt;br /&gt;&lt;span&gt;[string] $serverName &lt;/span&gt;&lt;br /&gt;&lt;span&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span&gt;$RutaScripts = "c:\scripts\"&lt;/span&gt;&lt;br /&gt;&lt;span&gt;void][reflection.assembly]::LoadWithPartialName("Microsoft.SqlServer.Smo")&lt;/span&gt;&lt;br /&gt;&lt;span&gt;$MyScripter=new-object ("Microsoft.SqlServer.Management.Smo.Scripter")&lt;/span&gt;&lt;br /&gt;&lt;span&gt;$MyScripter.Options.FileName = $f&lt;/span&gt;&lt;br /&gt;&lt;span&gt;$MyScripter.Options.AppendToFile = $true&lt;/span&gt;&lt;br /&gt;&lt;span&gt;$MyScripter.Server=$srv&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;write-host "Obteniendo el script para recrear los linked servers..."&lt;/span&gt;&lt;br /&gt;&lt;span&gt;$f = [System.IO.Path]::Combine($RutaScripts, $nombre + "_linked.sql")&lt;/span&gt;&lt;br /&gt;&lt;span&gt;out-file -filePath $f -inputobject "USE MASTER `nGO`n"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;foreach($linked in $srv.linkedservers) {&lt;/span&gt;&lt;br /&gt;&lt;span&gt;                    $MyScripter.options.IncludeDatabaseContext = $true    &lt;/span&gt;&lt;br /&gt;&lt;span&gt;                    $MyScripter.Options.IncludeIfNotExists = $true&lt;/span&gt;&lt;br /&gt;&lt;span&gt;                    $MyScripter.Options.ScriptDrops = $true&lt;/span&gt;&lt;br /&gt;&lt;span&gt;                    $MyScripter.Script($linked) | out-file $f -append&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;                    $MyScripter.Options.IncludeIfNotExists = $true&lt;/span&gt;&lt;br /&gt;&lt;span&gt;                    $MyScripter.Options.ScriptDrops = $false&lt;/span&gt;&lt;br /&gt;&lt;span&gt;                    $MyScripter.Script($linked) | out-file $f -append&lt;/span&gt;&lt;br /&gt;&lt;span&gt;                    out-file -filePath $f -inputobject "`n" -append&lt;/span&gt;&lt;br /&gt;&lt;span&gt;}&lt;/span&gt;&lt;br /&gt;Con este script se genera un script con el que se pueden crear todos los linked server, ojo, hay que recteclear el password y una vez creados cambiar la seguridad, ya que por default SQL los crea con: "Be made using the login's current security context".&lt;br /&gt;&lt;br /&gt;En las siguientes posts iré publicando otros scripts que son útiles tambien para recrear usuarios, permisos y otras cosas.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6085569802552178014-2296551074171384625?l=practicascomunes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://practicascomunes.blogspot.com/feeds/2296551074171384625/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6085569802552178014&amp;postID=2296551074171384625' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6085569802552178014/posts/default/2296551074171384625'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6085569802552178014/posts/default/2296551074171384625'/><link rel='alternate' type='text/html' href='http://practicascomunes.blogspot.com/2008/08/utilizando-poweshell-con-sql-2005-smo.html' title='Utilizando PoweShell con SQL 2005 SMO.'/><author><name>practicascomunes@gmail.com</name><uri>http://www.blogger.com/profile/12750935224135642825</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6085569802552178014.post-8869432454305263601</id><published>2008-08-08T12:13:00.000-05:00</published><updated>2008-08-08T16:45:48.880-05:00</updated><title type='text'>Primer Post.</title><content type='html'>Que tal,&lt;br /&gt;En este blog estaré hablando de algunas cosas que suceden en el área de Informática, como puede ser algo de consejos para hacer tal o cual cosa con determinada herramienta o tal vez algo que haya aprendido recientemente y que quiera compartir con el mundo.&lt;br /&gt;&lt;br /&gt;Principalmente estaré hablando de tecnología utilizada en las empresas en general, pero enfocada en servidores Windows y Linux.&lt;br /&gt;&lt;br /&gt;Espero poco a poco ir aportando ideas y conocimiento en esta área, en la que nunca dejas de aprender cosas nuevas.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6085569802552178014-8869432454305263601?l=practicascomunes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://practicascomunes.blogspot.com/feeds/8869432454305263601/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6085569802552178014&amp;postID=8869432454305263601' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6085569802552178014/posts/default/8869432454305263601'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6085569802552178014/posts/default/8869432454305263601'/><link rel='alternate' type='text/html' href='http://practicascomunes.blogspot.com/2008/08/primer-post.html' title='Primer Post.'/><author><name>practicascomunes@gmail.com</name><uri>http://www.blogger.com/profile/12750935224135642825</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
