April 18, 2011

SQL – Uniqueidentifier vs. IDENTITY

Primeiro, para aqueles que não estão familiarizados com o tipo de dados uniqueidentifier, aqui vai os detalhes:

Uniqueidentifiers também são referidos como GUIDs. (Globally Unique Identifier)
Ou seja, a chamada de API que retorna um GUID é garantida para sempre retornar um valor único no espaço e no tempo.
Para obter um GUID no SQL Server, você chamar a função NEWID().
O tipo de dados uniqueidentifier no SQL Server são armazenados nativamente como um valor de 16 bytes binários.
Este é um exemplo de um GUID formatado: B85E62C3-DC56-40C0-852A-49F759AC68FB.

DECLARE @GUID uniqueidentifier
SET @GUID = NEWID()
INSERT Item VALUES (@GUID,'Valor')

A principal vantagem de usar GUIDs é que são exclusivos em todos os espaço e tempo. Isto é útil se você estiver consolidando os registros de vários servidores SQL em uma tabela, como em um data warehouse situação. GUIDs são também muito usado por replicação do SQL Server para acompanhar as linhas quando eles estão espalhados entre vários servidores SQL.

A principal desvantagem de usar GUIDs, como valores fundamentais é que eles são grandes. Aos 16 bytes.

Para uso em aplicativos web que usam a ID em Session, Cookie e QueryStrings o recomendado é o UniqueIdentifier, por ser único.

October 18, 2010

Criptografe dados com um certificado no Sql Server

Os Certificados e as chaves assimétricas são baseadas no padrão X.509 e são basicamente equivalentes em sua aplicação. as chaves assimétricas são geradas por um servidor de chaves dentro de uma empresa e não se pode fazer seu backup nem elas podem ser movidas de um sistema para outro. Os certificados aceitam backup e podem ser restaurados a partir de um arquivo, permitindo que você mova bancos de dado criptografados, ao passo que é capaz de recriar o certificado para acessar seus dados.

1. Execute o código a seguir para criar uma tabela de teste, dois usuários e permissões:
CREATE TABLE dbo.CertificateEncryption
(ID INT IDENTITY(1,1),
SalesRep VARCHAR(30) NOT NULL,
SalesLead VARBINARY(500) NOT NULL)
GO
CREATE USER SalesRep1 WITHOUT LOGIN
GO
CREATE USER SalesRep2 WITHOUT LOGIN
GO
GRANT SELECT, INSERT ON dbo.CertificateEncryption TO SalesRep1
GRANT SELECT, INSERT ON dbo.CertificateEncryption TO SalesRep2
GO

2. Crie um certificado para cada usuário, como segue:
CREATE CERTIFICATE SalesRep1Cert AUTHORIZATION SalesRep1
WITH SUBJECT = ‘SalesRep 1 certificate’
GO
CREATE CERTIFICATE SalesRep2Cert AUTHORIZATION SalesRep2
WITH SUBJECT = ‘SalesRep 2 certificate’
GO
SELECT * FROM sys.certificates
GO

3. Insira dados para cada usuário, como segue:
EXECUTE AS USER=’SalesRep1′
GO
INSERT INTO dbo.CertificateEncryption
(SalesRep, SalesLead)
VALUES(‘SalesRep1′,EncryptByCert(Cert_ID(‘SalesRep1Cert’), ‘Fabrikam’))
REVERT
GO
EXECUTE AS USER=’SalesRep2′
GO
INSERT INTO dbo.CertificateEncryption
(SalesRep, SalesLead)
VALUES(‘SalesRep2′,EncryptByCert(Cert_ID(‘SalesRep2Cert’), ‘Contoso’))
REVERT
GO

4. Examine o conteúdo da tabela, assim como de cada usuário:
SELECT ID, SalesRep, SalesLead
FROM dbo.CertificateEncryption
GO
EXECUTE AS USER=’SalesRep1′
GO
SELECT ID, SalesRep, SalesLead,
CAST(DecryptByCert(Cert_Id(‘SalesRep1Cert’), SalesLead)
AS VARCHAR(MAX))
FROM dbo.CertificateEncryption
REVERT
GO
EXECUTE AS USER=’SalesRep2′
GO
SELECT ID, SalesRep, SalesLead,
CAST(DecryptByCert(Cert_Id(‘SalesRep2Cert’), SalesLead)
AS VARCHAR(MAX))
FROM dbo.CertificateEncryption
REVERT
GO