Arquivo da categoria: SharePoint 2010

Single Sign On utilizando Apache e Azure AD

Olá SharePointers,

Recentemente eu compartilhei no Github (https://github.com/RARomano/SSO-Apache-Azure) um repositório que mostra como fazer single sign on utilizando Azure AD, Apache e Open ID.

Utilizarei esse artigo para explicar um pouco mais sobre o conceito utilizado.

Open ID Connect

É um protocolo criado com base no OAuth para permitir que usuários se conectem, com segurança, à aplicações web.

Veja mais detalhes do fluxo de autenticação, na imagem abaixo:

Single Sign On

SSO é um conceito bastante comum em aplicações, consiste em utilizar somente um login para se autenticar em diversas aplicações diferentes. No nosso cenário, utilizaremos o login do Azure AD para se autenticar em aplicações customizadas.

Entretanto, como é um conceito comum e cada vez mais desejado, é normal encontrarmos em cada aplicação os códigos/parâmetros que permitem esse tipo de integração.

Alguns links falando sobre SSO, com Azure AD:

Em um cenário corporativo, onde hospedamos várias aplicações distintas, é muito mais interessante termos essas configurações em um só lugar, centralizado e tirar essa responsabilidade das aplicações.

Apache

Apache é um servidor web, livre e disponível para vários sistemas operacionais, inclusive o windows. Segundo estatísticas, ele possui um domínio de cerca 60% do mercado. (https://news.netcraft.com/archives/2016/02/22/february-2016-web-server-survey.html)

Pensando nisso, resolvi utilizar o Apache nesse artigo.

Para realizar a autenticação, utilizei esse módulo do apache mod_auth_openidc (https://github.com/pingidentity/mod_auth_openidc).

Docker

Outra coisa que utilizei no meu exemplo foi o Docker, visando portabilidade e escalabilidade dos meus testes, por exemplo: instanciar 2 servidores apache distintos e testar se ao autenticar em uma aplicação de um servidor a outra também estaria autenticada.

Resultados Obtidos

  • Autenticação em aplicações distintas no mesmo servidor
  • Autenticação em aplicações em servidores diferentes
  • Ao autenticar em uma aplicação customizada, você não precisará se autenticar novamente para utilizar outros serviços da Microsoft, como o e-mail por exemplo
  • Ao se autenticar em outro serviço da Microsoft primeiro e depois acessar uma aplicação, você não precisará se autenticar novamente.

Eu, particularmente, tenho gostado bastante de testar esses cenários de interoperabilidade. Tenho buscado, cada vez mais, utilizar essas ferramentas para desenvolver os projetos em que atuo e tenho me surpreendido bastante com o resultado.

Request Digest no SharePoint

Olá SharePointers,

Hoje vou falar um pouco sobre o RequestDigest. Para quem está acostumado a trabalhar com códigos client-side, com certeza já teve que usá-lo para criar itens ou outros objetos no SharePoint.

Toda vez que desejamos alterar algo no SharePoint, precisamos passá-lo no cabeçalho do request para que a operação seja concluída com sucesso. Para evitar ataques, o SharePoint gera um token específico para o usuário atual, site atual e por um tempo específico. Esse token é conhecido como Request Digest ou Form Digest.

Sendo assim, quando for executar uma chamada basta pegar o valor do RequestDigest e colocar no cabeçalho X-RequestDigest, como demonstrado abaixo:

image

Porém, se o usuário abrir a página e deixar aberta, sair do computador por um tempo e depois tentar clicar em algum botão, pode ser que o tempo de duração do token já tenha expirado. 

Para resolver esse problema, existe uma função Javascript que gera um token novo para você: UpdateFormDigest.

Para facilitar o entendimento, criei uma função que chamei de getRequestDigest que sempre me retorna o valor do token e, caso esteja vencido, ele renova o token e me retorna o valor atualizado.

image

e utilizo, onde precisar, essa função.

image

 

Abraços!

Venha comemorar o Lançamento do Visual Studio 2015

Olá SharePointers,

Em 20 de julho, iremos celebrar a última release do Visual Studio 2015!

Convidamos a todos a aprender sobre as novas features e tecnologias que acompanharão a nova versão. Você poderá interagir na sessão ao vivo, participar da sessão de perguntas e respostas com o time de engenharia, além de se aprofundar em detalhes técnicos, em mais de 60 sessões on-demand. Para acessar, clique aqui.

Teremos também a oportunidade de ver o time de Visual Studio criando uma solução fim-a-fim em um projeto open-source, alavancando as mais novas ferramentas e tecnologias. Veja como eles lidam com os mais diferentes cenários e tire suas dúvidas.

Participe do lançamento no dia 20 de julho, clicando aqui. Não é necessário fazer o registro, apenas acesse a URL no dia 20 de Julho, a partir das 12h30 (horário de Brasília). Siga @visualstudio e acompanhe as novidades.

 

Compartilhe conosco a sua experiência usando a hashtag #visualstudiortm

Office 365 Development Program

Olá SharePointers,

A Microsoft está investindo pesado em adoção de suas plataformas e quem ganha com isso somos nós. 

Durante o Build, a Microsoft anunciou o Office 365 Development Program para desenvolvedores que trabalham com Office 365, SharePoint, Office Client ou qualquer coisa relacionado ao Office.

Entrando nesse programa GRATUITO a Microsoft dará 1 ANO de uma tenant Office 365 Developer na faixa!

É ou não é uma vantagem interessante? Não percam tempo! Cadastrem-se!!!!

 

Big Tip: Como copiar uma página e manter todas as webparts?

 

Olá SharePointers,

Hoje vou postar uma dica um pouco mais avançada e quase não documentada. Quem nunca precisou copiar uma página e levar todas as webparts junto e ficou frustrado ao descobrir que não tem um jeito de fazer isso via API?

Tanto faz o meio que você utilize, o resultado sempre é o mesmo: Pode ser Copiar o item via API, exportar o ASPX e importar novamente. Nada funciona.

A única alternativa é fazer isso via SharePoint designer. Pelo menos temos uma alternativa para fazer, mas não é nada agradável quando temos que replicar essa ação em produção. E aí? Qual alternativa que temos?

Como o SharePoint Designer consegue fazer, ele deve usar alguma API. Então nossa tarefa é só descobrir qual é. Abri o Fiddler e identifiquei o request que o SharePoint designer fez e o resto foi só converter em Script.

O script abaixo faz um post na URL “/_vti_bin/_vti_aut/author.dll” do site e passa as informações das páginas que você quer copiar.

A documentação da Microsoft fala o seguinte sobre o Author.dll:

The ISAPI extension that implements authoring operations, such as uploading files, applying themes, renaming and deleting documents, and so forth.
Path: http://www.server.com/subweb/_vti_bin/_vti_aut/author.dll

Ou seja, essa extensão ISAPI é utilizada para operações de “autoria”: Upload de arquivos, aplicar temas, renomear e deletar documentos, copiar documentos copiando todo o histórico (outra função que não tem como fazer “pelas vias comuns”).

 

Abaixo está o script para realização da cópia. Só passar a URL do site onde está a página, a página de onde você quer copiar e o nome da nova página. Exemplo:

clonePageWithParts.ps1 -Url http://site/subsite -ServiceName /subsite -SourcePage “Pages/default.aspx” -DestPage “Pages/newpage.aspx”

[Atualização 16/03/2015 11:05] Coloquei o script no site do MSDN Code mpara facilitar oa cesso: https://code.msdn.microsoft.com/Clone-a-page-with-all-c6512b5b

 

Mais informações e leituras recomendadas:

FrontPage Server Extensions RPC – move document Method: https://msdn.microsoft.com/en-us/library/office/ms440627(v=office.14).aspx

Overview of the SharePoint Team Services Architecture (antigo, mas interessante)

https://msdn.microsoft.com/en-us/library/office/ms463030(v=office.14).aspx

http://www.edinkapic.com/2009/05/what-sharepoint-and-vermeer-have-in.html

TimerJob – Como controlar a barra de progresso?

Olá SharePointers,

Já postei algumas vezes sobre TimerJobs nesse blog (posts Regular TimerJob e Work Item TimerJobs e Criando Custom Timer Jobs no SharePoint) entretanto, existe um mecanismo muito pouco utilizado que serve de barra de progresso para a execução do seu TimerJob.

Para fazer esse controle, utilizarei o mesmo template criado no post Criando Custom Timer Jobs no SharePoint e só adicionarei os controles necessários.

Na documentação do MSDN, vemos que a classe SPJobDefinition expõe um método para essa operação SPJobDefinition.UpdateProgress. Dessa forma, só precisamos chamá-lo passando um número até 100 que indica o percentual de progresso.

O que nos resta é gerar um cálculo para identificar o progresso atual. Isso é mais fácil né?

Abaixo um exemplo:

public override void Execute(Guid contentDbId) { int[] collection = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; int count = 0; foreach (var item in collection) { Thread.Sleep(5000); count++; this.UpdateProgress((count * 100) / collection.Length); } }

 

Após fazer o deploy, e executar o TimerJob, é possível acompanhar sua execução na URL http://URL_DA_CENTRAL_ADMIN/_admin/ServiceRunningJobs.aspx.

Você deverá ver algo como os prints abaixo:

 

image

 

image

 

URL para fazer o download da solução utilizada nesse exemplo: http://1drv.ms/1vVYIJ9

 

Abraços!

Troubleshooting SharePoint/Office365: Sideloading of apps is not enabled on this site

Olá SharePointers,
Estava desenvolvendo uma SharePoint Hosted app para o Office 365 e, para minha surpresa, apareceu o erro abaixo.
Esse erro acontecia quando quando tentava fazer o deploy via Visual Studio.

 

Para resolver esse erro, basta rodar o script que está disponível nesse link: http://1drv.ms/1qDs0oy

 

Referência:

http://blogs.msdn.com/b/officeapps/archive/2013/12/10/enable-app-sideloading-in-your-non-developer-site-collection.aspx

Abraços! 😀

SharePoint e Javascript – Amor ou ódio?

Olá SharePointers,

Javascript e suas bibliotecas assumem um papel cada vez mais relevante na vida de um desenvolvedor moderno. É comum encontrar pessoas que digam que atualmente é uma das “linguagens” mais importantes para um desenvolvedor de SharePoint. Sei que esse ponto é controverso, mas esse é um tema que está cada vez mais presente no nosso dia-a-dia.

Notamos que a Microsoft fez um grande esforço para “mudar” um pouco a nossa cabeça e colocou no SharePoint 2013 o conceito de Apps, que, de uma forma bem simplista, é HTML e JavaScript.

Para quem ainda não está familiarizado, David Mann (SharePoint MVP – EUA) fez um curso muito interessante no Pluralsight: http://pluralsight.com/training/Courses/TableOfContents/developing-sharepoint-2013-javascript.

O SharePoint contém uma quantidade enorme de funções prontas que podem ser reutilizadas para nos ajudar durante o desenvolvimento de alguma solução. Algumas delas não estão documentadas no MSDN.

Para ajudar no desenvolvimento, existem alguns plugins para o Visual Studio. Dentre eles, recomendo esse aqui: http://visualstudiogallery.msdn.microsoft.com/288a2b0f-1357-47b4-8215-1134c36bdf30

Voltando ao código, vou citar algumas funções que podem ajudar bastante no desenvolvimento e não estão documentadas em lugar nenhum:

  • url = SP.Utilities.UrlBuilder.replaceOrAddQueryString(url, key, value): Esse método recebe uma URL e modifica ou inclui um parâmetro na QueryStrig. O Retoro é a URL modificada.
  • url = SP.Utilities.UrlBuilder.removeQueryString(url, key): Esse método remove um parâmetro da query string (e seu valor) de uma URL.
  • url = SP.Utilities.UrlBuilder.urlCombine(url1, url2): Combina duas URLs e garante que não tenha nenhuma “/” redundante.

 

O ideal, antes de sair desenvolvendo, é pensar se o que precisamos fazer não existe no SharePoint. E, se existir, tentar entender como ele realiza tal operação e fazermos do mesmo jeito.

Referências Adicionais

http://msdn.microsoft.com/en-us/library/office/ee549589(v=office.14).aspx

http://chuvash.eu/2012/01/24/parameterize-an-javascript-object-and-create-url/

http://www.wictorwilen.se/Post/Working-with-URLs-in-SharePoint-2010-JavaScripts.aspx

 

Abraços!

Troubleshooting: Could not find stored procedure ‘sp_dboption’

Olá SharePointers,

Hoje estava montando um ambiente para testes de migração e encontrei um problema ao instalar o SharePoint Server 2007 SP2 com SQL Server 2012.

O erro foi: Could not find stored procedure ‘sp_dboption’. Essa stored procedure foi descontinuada no SQL Server 2012 e, para que a instalação funcione, é necessário criá-la novamente, utilizando o código abaixo:

USE [master]
GO
/****** Object: StoredProcedure [sys].[sp_dboption] Script Date: 12/08/2013 21:22:10 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE procedure [sp_dboption] — 1999/08/09 18:25
@dbname sysname = NULL, — database name to change
@optname varchar(35) = NULL, — option name to turn on/off
@optvalue varchar(10) = NULL — true or false
as
set nocount on
declare @dbid int — dbid of the database
declare @catvalue int — number of category option
declare @optcount int — number of options like @optname
declare @allstatopts int — bit map off all options stored in sysdatqabases.status
— that can be set by sp_dboption.
declare @alloptopts int — bit map off all options stored in sysdatqabases.status
— that can be set by sp_dboption.
declare @allcatopts int — bit map off all options stored in sysdatqabases.category
— that can be set by sp_dboption.
declare @exec_stmt nvarchar(max)
declare @fulloptname varchar(35)
declare @alt_optname varchar(50)
declare @alt_optvalue varchar(30)
declare @optnameIn varchar(35)
select @optnameIn = @optname
,@optname = LOWER (@optname collate Latin1_General_CI_AS)
— If no @dbname given, just list the possible dboptions.
— Only certain status bits may be set or cleared by sp_dboption.
— Get bitmap of all options that can be set by sp_dboption.
select @allstatopts=number from master.dbo.spt_values where type = ‘D’
and name = ‘ALL SETTABLE OPTIONS’
select @allcatopts=number from master.dbo.spt_values where type = ‘DC’
and name = ‘ALL SETTABLE OPTIONS’
select @alloptopts=number from master.dbo.spt_values where type = ‘D2’
and name = ‘ALL SETTABLE OPTIONS’
if @dbname is null
begin
select ‘Settable database options:’ = name
from master.dbo.spt_values
where (type = ‘D’
and number & @allstatopts <> 0
and number not in (0,@allstatopts)) — Eliminate non-option entries
or (type = ‘DC’
and number & @allcatopts <> 0
and number not in (0,@allcatopts))
or (type = ‘D2’
and number & @alloptopts <> 0
and number not in (0,@alloptopts))
order by name
return (0)
end
— Verify the database name and get info
select @dbid = dbid
from master.dbo.sysdatabases
where name = @dbname
— If @dbname not found, say so and list the databases.
if @dbid is null
begin
raiserror(15010,-1,-1,@dbname)
print ‘ ‘
select ‘Available databases:’ = name
from master.dbo.sysdatabases
return (1)
end
— If no option was supplied, display current settings.
if @optname is null
begin
select ‘The following options are set:’ = v.name
from master.dbo.spt_values v, master.dbo.sysdatabases d
where d.name=@dbname
and ((number & @allstatopts <> 0
and number not in (-1,@allstatopts)
and v.type = ‘D’
and (v.number & d.status)=v.number)
or (number & @allcatopts <> 0
and number not in (-1,@allcatopts)
and v.type = ‘DC’
and d.category & v.number <> 0)
or (number & @alloptopts <> 0
and number not in (-1,@alloptopts)
and v.type = ‘D2’
and d.status2 & v.number <> 0))
return(0)
end
if @optvalue is not null and lower(@optvalue) not in (‘true’, ‘false’, ‘on’, ‘off’)
begin
raiserror(15241,-1,-1)
return (1)
end
— Use @optname and try to find the right option.
— If there isn’t just one, print appropriate diagnostics and return.
select @optcount = count(*) ,@fulloptname = min(name)
from master.dbo.spt_values
where lower(name collate Latin1_General_CI_AS) like ‘%’ + @optname + ‘%’
and ((type = ‘D’
and number & @allstatopts <> 0
and number not in (-1,@allstatopts))
or (type = ‘DC’
and number & @allcatopts <> 0
and number not in (-1,@allcatopts))
or (type = ‘D2’
and number & @alloptopts <> 0
and number not in (-1,@alloptopts)))
— If no option, show the user what the options are.
if @optcount = 0
begin
raiserror(15011,-1,-1,@optnameIn)
print ‘ ‘
select ‘Settable database options:’ = name
from master.dbo.spt_values
where (type = ‘D’
and number & @allstatopts <> 0
and number not in (-1,@allstatopts)) — Eliminate non-option entries
or (type = ‘DC’
and number & @allcatopts <> 0
and number not in (-1,@allcatopts))
or (type = ‘D2’
and number & @alloptopts <> 0
and number not in (-1,@alloptopts))
order by name
return (1)
end
— If more than one option like @optname, show the duplicates and return.
if @optcount > 1
begin
raiserror(15242,-1,-1,@optnameIn)
print ‘ ‘
select duplicate_options = name
from master.dbo.spt_values
where lower(name collate Latin1_General_CI_AS) like ‘%’ + @optname + ‘%’
and ((type = ‘D’
and number & @allstatopts <> 0
and number not in (-1,@allstatopts))
or (type = ‘DC’
and number & @allcatopts <> 0
and number not in (-1,@allcatopts))
or (type = ‘D2’
and number & @alloptopts <> 0
and number not in (-1,@alloptopts))
)
return (1)
end
— Just want to see current setting of specified option.
if @optvalue is null
begin
select OptionName = v.name,
CurrentSetting = (case
when ( ((v.number & d.status) = v.number
and v.type = ‘D’)
or (d.category & v.number <> 0
and v.type = ‘DC’)
or (d.status2 & v.number <> 0
and v.type = ‘D2’)
)
then ‘ON’
when not
( ((v.number & d.status) = v.number
and v.type = ‘D’)
or (d.category & v.number <> 0
and v.type = ‘DC’)
or (d.status2 & v.number <> 0
and v.type = ‘D2’)
)
then ‘OFF’
end)
from master.dbo.spt_values v, master.dbo.sysdatabases d
where d.name=@dbname
and ((v.number & @allstatopts <> 0
and v.number not in (-1,@allstatopts) — Eliminate non-option entries
and v.type = ‘D’)
or (v.number & @allcatopts <> 0
and v.number not in (-1,@allcatopts) — Eliminate non-option entries
and v.type = ‘DC’)
or (v.number & @alloptopts <> 0
and v.number not in (-1,@alloptopts) — Eliminate non-option entries
and v.type = ‘D2’)
)
and lower(v.name) = lower(@fulloptname)
return (0)
end
select @catvalue = 0
select @catvalue = number
from master.dbo.spt_values
where lower(name) = lower(@fulloptname)
and type = ‘DC’
— if setting replication option, call sp_replicationdboption directly
if (@catvalue <> 0)
begin
select @alt_optvalue = (case lower(@optvalue)
when ‘true’ then ‘true’
when ‘on’ then ‘true’
else ‘false’
end)
select @alt_optname = (case @catvalue
when 1 then ‘publish’
when 2 then ‘subscribe’
when 4 then ‘merge publish’
else quotename(@fulloptname, ””)
end)
select @exec_stmt = quotename(@dbname, ‘[‘) + ‘.dbo.sp_replicationdboption’
EXEC @exec_stmt @dbname, @alt_optname, @alt_optvalue
return (0)
end
— call Alter Database to set options
— set option value in alter database
select @alt_optvalue = (case lower(@optvalue)
when ‘true’ then ‘ON’
when ‘on’ then ‘ON’
else ‘OFF’
end)
— set option name in alter database
select @fulloptname = lower(@fulloptname)
select @alt_optname = (case @fulloptname
when ‘auto create statistics’ then ‘AUTO_CREATE_STATISTICS’
when ‘auto update statistics’ then ‘AUTO_UPDATE_STATISTICS’
when ‘autoclose’ then ‘AUTO_CLOSE’
when ‘autoshrink’ then ‘AUTO_SHRINK’
when ‘ansi padding’ then ‘ANSI_PADDING’
when ‘arithabort’ then ‘ARITHABORT’
when ‘numeric roundabort’ then ‘NUMERIC_ROUNDABORT’
when ‘ansi null default’ then ‘ANSI_NULL_DEFAULT’
when ‘ansi nulls’ then ‘ANSI_NULLS’
when ‘ansi warnings’ then ‘ANSI_WARNINGS’
when ‘concat null yields null’ then ‘CONCAT_NULL_YIELDS_NULL’
when ‘cursor close on commit’ then ‘CURSOR_CLOSE_ON_COMMIT’
when ‘torn page detection’ then ‘TORN_PAGE_DETECTION’
when ‘quoted identifier’ then ‘QUOTED_IDENTIFIER’
when ‘recursive triggers’ then ‘RECURSIVE_TRIGGERS’
when ‘default to local cursor’ then ‘CURSOR_DEFAULT’
when ‘offline’ then (case @alt_optvalue when ‘ON’ then ‘OFFLINE’ else ‘ONLINE’ end)
when ‘read only’ then (case @alt_optvalue when ‘ON’ then ‘READ_ONLY’ else ‘READ_WRITE’ end)
when ‘dbo use only’ then (case @alt_optvalue when ‘ON’ then ‘RESTRICTED_USER’ else ‘MULTI_USER’ end)
when ‘single user’ then (case @alt_optvalue when ‘ON’ then ‘SINGLE_USER’ else ‘MULTI_USER’ end)
when ‘select into/bulkcopy’ then ‘RECOVERY’
when ‘trunc. log on chkpt.’ then ‘RECOVERY’
when ‘db chaining’ then ‘DB_CHAINING’
else @alt_optname
end)
if @fulloptname = ‘dbo use only’
begin
if @alt_optvalue = ‘ON’
begin
if databaseproperty(@dbname, ‘IsSingleUser’) = 1
begin
raiserror(5066,-1,-1);
return (1)
end
end
else
begin
if databaseproperty(@dbname, ‘IsDBOOnly’) = 0
return (0)
end
end
if @fulloptname = ‘single user’
begin
if @alt_optvalue = ‘ON’
begin
if databaseproperty(@dbname, ‘ISDBOOnly’) = 1
begin
raiserror(5066,-1,-1);
return (1)
end
end
else
begin
if databaseproperty(@dbname, ‘IsSingleUser’) = 0
return (0)
end
end
select @alt_optvalue = (case @fulloptname
when ‘default to local cursor’ then (case @alt_optvalue when ‘ON’ then ‘LOCAL’ else ‘GLOBAL’ end)
when ‘offline’ then ”
when ‘read only’ then ”
when ‘dbo use only’ then ”
when ‘single user’ then ”
else @alt_optvalue
end)
if lower(@fulloptname) = ‘select into/bulkcopy’
begin
if @alt_optvalue = ‘ON’
begin
if databaseproperty(@dbname, ‘IsTrunclog’) = 1
select @alt_optvalue = ‘RECMODEL_70BACKCOMP’
else
select @alt_optvalue = ‘BULK_LOGGED’
end
else
begin
if databaseproperty(@dbname, ‘IsTrunclog’) = 1
select @alt_optvalue = ‘SIMPLE’
else
select @alt_optvalue = ‘FULL’
end
end
if lower(@fulloptname) = ‘trunc. log on chkpt.’
begin
if @alt_optvalue = ‘ON’
begin
if databaseproperty(@dbname, ‘IsBulkCopy’) = 1
select @alt_optvalue = ‘RECMODEL_70BACKCOMP’
else
select @alt_optvalue = ‘SIMPLE’
end
else
begin
if databaseproperty(@dbname, ‘IsBulkCopy’) = 1
select @alt_optvalue = ‘BULK_LOGGED’
else
select @alt_optvalue = ‘FULL’
end
end
— construct the ALTER DATABASE command string
select @exec_stmt = ‘ALTER DATABASE ‘ + quotename(@dbname) + ‘ SET ‘ + @alt_optname + ‘ ‘ + @alt_optvalue + ‘ WITH NO_WAIT’
EXEC (@exec_stmt)
if @@error <> 0
begin
raiserror(15627,-1,-1)
return (1)
end
return (0) — sp_dboption

 

Abraços! 😀

SharePoint: SQL Server MAXDOP = 1 – é realmente necessário?

Olá SharePointers,

Hoje vou falar um pouco do MAXDOP (já ouviram falar?). MAXDOP é a propriedade no SQL Server que define o grau máximo de paralelismo (aka: Max Degree Of Parallelism) para as queries do SQL.

A microsoft recomenda que, para instâncias do SQL dedicadas ao SharePoint, esse valor seja fixado com 1 para uma performance otimizada (Storage and SQL Server capacity planning and configuration (SharePoint Server 2010)). Muito embora, até a versão 2010 do SharePoint encontramos várias instalações com configurações diferentes desse valor, isso não era um “blocker”. Na versão 2013 do SharePoint, isso passou a ser um blocker de instalação. Veja abaixo:

New-SPConfigurationDatabase : This SQL Server instance does not have the required "max degree of parallelism" setting of 1. Database provisioning operations will continue to fail if "max degree of parallelism" is not set 1 or the current account does not have permissions to change the setting. See documentation for details on manually changing the setting

3225_MAXDOP_0_png-550x0

Ainda de acordo com a Microsoft, o MAXDOP serve para mostrar para o SQL como aplicar o paralelismo, ou seja, se o MAXDOP estiver setado em 0 (valor default) o SQL detecta o melhor grau de paralelismo de acordo com a quantidade de CPUs disponíveis.

Se estiver setado em 1, os “parallels plans” são desabilitados por default.

Qualquer valor diferente disso serve para definir um grau específico.

 

Mas então o SharePoint não utiliza paralelismo? Certo?

ERRADO! Por questões de performance a melhor opção de performance é desabilitar esse recurso, mas, quando o SharePoint precisa, ele define Hints de paralelismo direto nas stored procedures (mais de 150 SP’s !!).

 

Para mais informações sobre o assunto, acessem os links abaixo: