Cross DB Ownership Chaining

Uma solução muito comum para situações onde temos um usuário que precisa executar uma procedure ou VIEW que relaciona dados de outro banco de dados, mas este usuário não deve ter acesso direto a este outro banco de dados, é utilizar a opção de Cross DB Ownership Chaining (SQL Server 2005+).

Como exemplo desta funcionalidade, vamos criar no primeiro banco de dados, uma tabela e no segundo banco de dados, uma VIEW que retorna os valores desta tabela do primeiro banco dados:

USE DB01
GO
CREATE TABLE SuperTabela (Id INT)
GO

USE DB02
GO
CREATE VIEW SuperVisao AS
SELECT * FROM DB01.dbo.SuperTabela
WHERE ID > 10
GO

Vamos criar um LOGIN para a Maria e um USER em cada um dos bancos de dados do nosso cenário:

USE [master]
GO
CREATE LOGIN Maria WITH PASSWORD = '9455w0rd'
GO

USE DB01
GO
CREATE USER Maria FOR LOGIN Maria
GO

USE DB02
GO
CREATE USER Maria FOR LOGIN Maria
GO

Em seguida, damos permissão de SELECT na VIEW que criamos ao usuário da Maria:

USE DB02
GO
GRANT SELECT ON dbo.SuperVisao TO Maria
GO

Sem Cross DB Ownership Chaining

Com o Cross DB Ownership Chaining desabilitado nos bancos de dados, primeiramente testamos se ela não tem acesso diretamente à tabela (acesso negado):

-- Desabilitando o Cross DB Ownership Chaining
USE [master]
GO
ALTER DATABASE DB01 SET DB_CHAINING OFF
GO
ALTER DATABASE DB02 SET DB_CHAINING OFF
GO

USE DB02
GO
EXECUTE AS LOGIN = 'Maria';
GO
SELECT * FROM SuperTabela
GO
REVERT
GO

Msg 229, Level 14, State 5, Line 1
The SELECT permission was denied on the object ‘SuperTabela’, database ‘DB01’, schema ‘dbo’.

E testamos o acesso dela na View e teremos como retorno que ela não tem acesso a tabela:

USE DB02
GO
EXECUTE AS LOGIN = 'Maria';
GO
SELECT * FROM SuperVisao
GO
REVERT
GO

Msg 229, Level 14, State 5, Line 1
The SELECT permission was denied on the object ‘SuperTabela’, database ‘DB01’, schema ‘dbo’.

Com Cross DB Ownership Chaining

Habilitamos o Cross DB Ownership Chaining, e testamos o acesso dela à tabela (acesso negado):

-- Habilitando o Cross DB Ownership Chaining
USE [master]
GO
ALTER DATABASE DB01 SET DB_CHAINING OFF
GO
ALTER DATABASE DB02 SET DB_CHAINING OFF
GO

USE DB02
GO
EXECUTE AS LOGIN = 'Maria';
GO
SELECT * FROM SuperTabela
GO
REVERT
GO

Msg 229, Level 14, State 5, Line 1
The SELECT permission was denied on the object ‘SuperTabela’, database ‘DB01’, schema ‘dbo’.

Agora, testamos o acesso á VIEW, e ela terá o acesso sem problemas:

USE DB02
GO
EXECUTE AS LOGIN = 'Maria';
GO
SELECT * FROM SuperVisao
GO
REVERT
GO

Id
———–
(0 row(s) affected)

Caso você dar o acesso da Maria á tabela do primeiro banco de dados, não será necessário utilizar a opção “Cross DB Ownership Chaining”.

Também é possível habilitar esta opção em todo o servidor com o seguinte comando:

sp_configure 'cross db ownership chaining', 1
GO
RECONFIGURE
GO

Referências:
http://msdn.microsoft.com/en-us/library/ms188694.aspx

Red Gate – Overview

Acredito que é praticamente impossível existir um DBA de SQL Server que nunca tenha ouvido falar dos produtos da Red Gate Software. Mas vamos a um overview de alguns produtos que considero interessantes, e nos próximos artigos, vou demonstrar o funcionamento destas ferramentas.

SQL Prompt Pro:
Oferece recursos como o intellisense de T-SQL, snippets, formatação do script, entre outras funcionalidades. Totalmente integrado com o SQL Server Management Studio e possui algumas funções também integradas com o Visual Studio.

O que é intellisense e snippets? Intellisense é aquele “autocomplete” que quando você escreve “SELECT * FROM” e já aparecem os nomes das tabelas do banco de dados para você selecionar. Snippets é aquele recurso que permite configurar atalhos para alguns comandos, exemplo, escrever “sl” e já aparecer “SELECT”.

SQL Compare Pro (também para Oracle):
Basicamente permite comparar a estrutura de dois bancos de dados e gerar um script para sincronizar a estrutura deles, além de outras operações mais complexas.

A função básica desta ferramenta é semelhante ao Schema Compare do Visual Studio, mas com muito mais possibilidades e recursos (comparação de arquivos de backup, snapshot, scripts).

SQL Data Compare Pro (também para Oracle):
Permite comparar a massa de dados de dois bancos de dados, e gerar o script para sincronizar esta massa de dados, também oferecendo recursos para outras operações mais complexas.

A função básica desta ferramenta é semelhante ao Data Compare do Visual Studio, mas com muito mais possibilidades e recursos.

Considerações finais

Também há várias outras ferramentas para SQL Server, como o SQL Source Control (controle de versão de documentos e script para SQL Server), SQL Monitor (monitor de desempenho e alertas) e SQL Doc (documentação do banco de dados), e outras para Visual Studio, Oracle e Exchange.

Mais informações:
http://www.red-gate.com/

Imagens no banco de dados 5 – Importando arquivos por T-SQL

Para finalizar este série de artigos sobre técnicas de como trabalhar com imagens/arquivos no SQL Server, vamos utilizar o próprio T-SQL para realizar a importação de arquivos para dentro do banco de dados.

Pareceu difícil? Não se preocupem, é bem tranquilo.

O primeiro comando deste artigo utiliza a função OPENROWSET, especificando o caminho do arquivo, para recuperar os bytes deste arquivo em formato VARBINARY:

SELECT
	Imagem.BulkColumn AS [Bytes]
FROM
	OPENROWSET(BULK N'C:\cake.jpg', SINGLE_BLOB) AS Imagem

Para um INSERT na tabela que temos trabalhado nos artigos anteriores, basta utilizar uma instrução de INSERT..SELECT:

INSERT INTO [DemoApp].[dbo].[Arquivos]
	([Nome]
	,[Bytes]
	,[Extensao]
	,[Tipo])
SELECT
	'cake.jpg' AS [Nome],
	Imagem.BulkColumn AS [Bytes],
	'.jpg' AS [Extensao],
	'image/jpeg' AS [Tipo]
FROM
	OPENROWSET(BULK N'C:\cake.jpg', SINGLE_BLOB) AS Imagem

No caso de operações que exigiam a importação de vários arquivos de uma determinada pasta, será necessário utilizar da Stored Procedure xp_cmdshell, que necessita executar as operações a seguir para ser habilitada:

EXEC sp_configure 'show advanced options', 1
GO
RECONFIGURE
GO
EXEC sp_configure 'xp_cmdshell', 1
GO
RECONFIGURE
GO

(Lembrando que por questões de segurança, ao termino da utilização da stored procedure xp_cmdshell, desabilitem-na)

E por meio desta Stored Procedured, poderemos relacionar todos os arquivos de uma determinada pasta do servidor de banco de dados:

DECLARE @T TABLE ( CMD NVARCHAR(255))

INSERT INTO @T
EXEC xp_cmdshell 'dir E:\Backup\Pictures\2010\Sukiaki\*.jpg /p';

SELECT SUBSTRING(CMD, 40, 215)
FROM @T
WHERE CMD LIKE '%.jpg'
GO

Por fim, unimos a ideia do INSERT..SELECT do OPENROWSET e a execução da Stored Procedure xp_cmdshell:

DECLARE @T TABLE ( CMD NVARCHAR(255))

DECLARE @PATH NVARCHAR(255)
SET @PATH = 'E:\Backup\Pictures\2010\Sukiaki\'

DECLARE @CMD NVARCHAR(255)
SET @CMD = 'dir ' + @PATH + '*.jpg /p'

INSERT INTO @T
EXEC xp_cmdshell @CMD;

DECLARE Arquivos CURSOR FOR
SELECT
	SUBSTRING(CMD, 40, 215) AS Arquivo
FROM @T
WHERE CMD LIKE '%.jpg';

OPEN Arquivos;

DECLARE @Arquivo NVARCHAR(255)
DECLARE @ArquivoPath NVARCHAR(255)

FETCH NEXT FROM Arquivos INTO @Arquivo;

WHILE @@FETCH_STATUS = 0
BEGIN
	SET @ArquivoPath = @PATH + @Arquivo;

	EXEC (
		'INSERT INTO [DemoApp].[dbo].[Arquivos]
			([Nome]
			,[Bytes]
			,[Extensao]
			,[Tipo])
		SELECT
			''' + @Arquivo + ''' AS [Nome],
			Imagem.BulkColumn AS [Bytes],
			''.jpg'' AS [Extensao],
			''image/jpeg'' AS [Tipo]
		FROM
			OPENROWSET(BULK ''' + @ArquivoPath + ''', SINGLE_BLOB)
				AS Imagem'
	)

	FETCH NEXT FROM Arquivos INTO @Arquivo;
END

CLOSE Arquivos;

DEALLOCATE Arquivos;

E teremos importado todos os arquivos:

Configurando o Database Mail com o Gmail

E ai pessoas!

Como normalmente o pessoal não utiliza seu e-mail comercial para “trabalhar em casa” com o Database Mail do SQL Server 2005/2008, então segue um tutorial de como configurar o Gmail no Database Mail!

Primeiramente, um pouco de história… Bem, aqueles que se aventuraram com o SQL Server 2000 rezaram pelo nascimento do Database Mail por anos, pois para criar rotinas que enviavam e-mails, só tinha a alternativa de usar o SQL Mail (gambiarra clássica com o Outlook para configurar o envio de e-mails…) ou utilizar COM+ no SQL (este último, só fiquei feliz por ter sido ‘absorvido’ pelo suporte a CLR nos SQL Server Pós 2000).

Agora, vamos configurar o dito cujo:

Com o botão direito do mouse no “Database Mail”, selecione a opção “Configure Database Mail”:

Continuar lendo

Instalando o PHP no IIS 7.5 com FastCGI + SQL Server

Olá pessoas,

Este final de semana, fiquei com um pouco de saudades do PHP e resolvi ‘brincar’ com ele. Faz quase 2 anos que parei de desenvolver com PHP, foi bem “nostálgico” escrever algumas linhas (até coloquei aquela música “Purple Rain” do Prince neste momento #OLD), pois acompanhei desde a evolução da versão 3 até a 5.

A principal novidade que identifiquei foi a compatibilidade com FastCGI funcionando 100% no IIS (antes era Apache ou funcionando ‘meia-boca’ no modo CGI do IIS), código-fonte do PHP feito no Visual Studio 2008 (antes Visual C++ 6) e instalador que funciona 100% no Windows x64, conforme comprovo com o artigo, instalando no Windows 7 x64.

Como eu já tinha o ‘IIS 7.5’ instalado por causa do SSRS 2005 (ver artigo), a única opção adicional que marquei foi em Recursos de Desenvolvimento de Aplicativos a opção CGI, pois caso ela não esteja marcada, só será possível instalar no modo CGI tradicional.

Depois de baixar uma versão do PHP no site http://windows.php.net/download/ vamos à instalação, no caso estou utilizando a versão “VC9 x86 Thread Safe – Installer”:

Selecione a pasta de destino, não tem problema instalar no local sugerido:

Já que foi habilitada a opção CGI no IIS, é possível instalar no modo “IIS FastCGI”:

Determine o que as extensões e extras que deseja instalar. Como padrão as extensões já trazem marcadas as DLL do PostGreSQL e do MySQL:

Concluída a instalação vamos realizar o primeiro teste, para isso crie na pasta das aplicações web do IIS (por padrão, C:\inetpub\wwwroot ) um arquivo ‘index.php’ com o seguinte código:

<?php
phpinfo();
?>

 
E como resultado:

Agora, vamos à instalação das extensões do SQL Server. No site de downloads da Microsoft (http://www.microsoft.com/downloads) procure “SQL Server PHP”, se você encontrar o “SQL Server Driver for PHP 1.1 CTP – October 2009”, pode ficar tranqüilo que ele funciona. Mas se preferir uma versão mais segura tente o “SQL Server Driver for PHP 1.0 Cumulative Update – April 2009”.

Na instalação do SQL Server Driver for PHP (se possível, execute como administrador o instalador), recomendo informar uma pasta temporária, pois você somente precisará de uma das DLLs que serão instaladas.

Feita a instalação (normalmente ela dá erro, mas não se preocupe as DLLs vão para a pasta corretamente, mesmo com erro), copie a DLL de acordo com a versão do PHP, exemplo “PHP 5.3 VC9 x86 Thread Safe” é “php_sqlsrv_53_ts_vc9.dll” e coloque na pasta de extensões do PHP (normalmente ‘C:\Program Files (x86)\PHP\ext’) e adicione no arquivo php.ini (normalmente na pasta ‘C:\Program Files (x86)\PHP’) as linhas seguintes, conforme o nome de sua DLL:

[PHP_SQLSRV]
extension=php_sqlsrv_53_ts_vc9.dll

Procure colocar estas linhas junto às outras definições de extensões, deixando o arquivo manutenível em futuras necessidades.

Antes de testar, se caso o computador não tiver o SQL Server instalado na mesma máquina, instale o SQL Server Native Client:
http://www.microsoft.com/downloads/details.aspx?FamilyId=C6C3E9EF-BA29-4A43-8D69-A2BED18FE73C&displaylang=en

Outro detalhe antes de testar, reinicie o serviço do IIS (por desencargo de consciência), depois veja novamente aquele arquivo PHP que criado anteriormente. Se tudo der certo, procurando “sqlsrv”, você encontrará o detalhamento da extensão do SQL Server:

Para um teste (no caso utilizei um usuário “sa” com senha “123456”, o SQL Server na máquina “localhost”, com SQL Authentication habilitado – ver artigo), crei o seguinte código:

<pre>
<?php
//Definição do servidor (no caso "." pode substituir "localhost")
$serverName = ".";
//Definição de banco de dados, usuário e senha
$connectionInfo = array(
 "Database"=>"master",
 "UID"=>"sa",
 "PWD"=>"123456"
);
$conn = sqlsrv_connect($serverName, $connectionInfo);
if($conn === false)
{
 echo "Bug: Alguma coisa errada na conexão.\n";
 print_r(sqlsrv_errors());
}
else
{
 //Query modelo
 $tsql = "SELECT name FROM sys.all_views WHERE name LIKE 'dm%' ORDER BY name";
 $stmt = sqlsrv_query($conn, $tsql);
 if ($stmt)
 {
  echo "Resultado:\n";
  //Loop para os resultados
  while($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_NUMERIC))
  {
   echo $row[0] . "\n";
  }
  //Importante: Fechar a query
  sqlsrv_free_stmt($stmt); 
 }
 else
 {
  echo "Bug: Alguma coisa errada na query.\n";
  print_r(sqlsrv_errors());
 } 
 // Importante: Fechar a conexão
 sqlsrv_close($conn);
}
?>
</pre>

E como resultado:

A partir daqui, o material no site do MSDN será de grande utilidade para entender como funciona as funções do SQL Server Driver for PHP:
http://msdn.microsoft.com/en-us/library/ee229548(SQL.10).aspx

As mudanças dos métodos para trabalhar com SQL Server no PHP ficaram ótimas, creio que para quem já esta acostumado a trabalhar com o MySQL não terá muitas dificuldades. Bem que o SQL Server poderia já ser nativo no PHP já que é feito no VS2008…

Bem pessoal, acho que com este artigo pago minhas dívidas com o PHP, linguagem que me ajudou a pagar a faculdade e alguns periféricos para meu PC. Tenho algumas dívidas para com o MySQL, Oracle e PostGreSQL, mas como o blog ainda é novo, ainda vou ter muitas oportunidades de falar sobre eles.

Qualquer dúvida sobre o artigo, comentários, reclamações ou elogios, fiquem a vontade de comentar ou até mesmo me procurarem por email (se for muito urgente). Então até o próximo artigo!

Terceiro dia no Microsoft Tech-Ed Brasil 2009

Neste terceiro dia do Tech-Ed Brasil 2009, eu fiquei impressionado com a palestra de Gestão de TI do Rodrigo Dias e Adalberto Araujo, na qual eles sugeriram a forma de descomplicar a governança de TI com uma ferramenta de grande potencial chamada Excel, somada a uma boa comunicação com a equipe e muita organização pessoal, enquanto pensamos na implantação de softwares complexos, que sem uma visão clara do que o gestor deseja mensurar e controlar, se tornam somente um custo sem justificativa prática nas organizações.

As minhas duas palestras seguintes foram com o Amit Goyal. Posso dizer que fiquei boquiaberto com as novidades do SQL Server 2008 R2, principalmente pela flexibilidade que há para trabalhar com acesso aos dados de um SSAS (SQL Server Analysis Service) com o Excel 2010, gerando gráficos e tabelas dinâmicas de planilhas com mais de 100.000.000 de linhas, manipuladas pelo Excel de forma tão rápida e prática que não parecia existir uma massa de dados tão monstruosa.

Depois desta incrível demonstração, Amit Goyal publicou o dashboard desenvolvido em Excel no SharePoint Server 2010, contando com todos os recursos de user interface rica desta nova ferramenta. Conseguindo mostrar que com este grupo de ferramentas, se bem utilizadas, podem de criar um bom relacionamento entre os usuários que trabalham com Excel para tomar decisão e os profissionais de Banco de Dados, que agora podem gerir melhor os acessos e recursos utilizados pelos relatórios/dashboards, sem a insatisfação e o stress característico.


Eu, Amit Goyal e Thiago Zavaschi

Ferramentas como o uso de mapas no SQL Server 2008 R2 também foram demonstradas, novas características das ferramentas do SQL Server que permitem trabalhar com centenas de Terabytes em banco de dados SQL Server e gerenciar várias instancias do SQL Server de forma totalmente integrada e com ótimos dashboards.

Depois voltando à área de desenvolvimento, tive palestras com o Luciano Conde sobre as tecnologias de acesso a dados (basicamente ADO.Net, LINQ to SQL, Entity Framework e ADO.NET Data Service), para me preparar para a palestra sensacional de ASP.Net 4.0 com o Rogério.


MIC de BH e MIC Curitiba na Rodoviária de São Paulo-SP

Ganhei muitos brindes, mas o que realmente faz valer a pena o Tech-Ed é conhecer o pessoal de vários lugares e da própria Microsoft, trocar experiências, se divertir e saber dar novidades que estão chegando ao mercado.