Criando procedimentos armazenados compilados nativamente
Os procedimentos armazenados compilados nativamente não implementam a área completa de programação e superfície de consulta do Transact-SQL. Há determinados constructos Transact-SQL que não podem ser usados dentro de procedimentos armazenados compilados nativamente. Para obter mais informações, consulte Constructos com suporte em procedimentos armazenados compilados nativamente.
No entanto, há vários recursos do Transact-SQL que só têm suporte para procedimentos armazenados compilados nativamente:
Blocos atômicos. Para obter mais informações, veja Blocos atômicos.
Restrições
NOT NULL
nos parâmetros e variáveis dos procedimentos armazenados compilados nativamente. Você não pode atribuir valoresNULL
a parâmetros ou variáveis declarados comoNOT NULL
. Para obter mais informações, consulte DECLARE @local_variable (Transact-SQL).Associação de esquema de procedimentos armazenados compilados nativamente.
Os procedimentos armazenados compilados nativamente são criados usando CREATE PROCEDURE (Transact-SQL). O exemplo a seguir mostra uma tabela com otimização de memória e um procedimento armazenado compilado nativamente usado para inserção de linhas na tabela.
create table dbo.Ord
(OrdNo integer not null primary key nonclustered,
OrdDate datetime not null,
CustCode nvarchar(5) not null)
with (memory_optimized=on)
go
create procedure dbo.OrderInsert(@OrdNo integer, @CustCode nvarchar(5))
with native_compilation, schemabinding, execute as owner
as
begin atomic with
(transaction isolation level = snapshot,
language = N'English')
declare @OrdDate datetime = getdate();
insert into dbo.Ord (OrdNo, CustCode, OrdDate) values (@OrdNo, @CustCode, @OrdDate);
end
go
No exemplo de código, NATIVE_COMPILATION
indica que esse procedimento armazenado Transact-SQL é um procedimento armazenado compilado nativamente. As seguintes opções são necessárias:
Opção | Descrição |
---|---|
SCHEMABINDING |
Os procedimentos armazenados compilados nativamente devem ser associados ao esquema dos objetos que ele referencia. Isso significa que as referências de tabela pelo procedimento não podem ser eliminadas. As tabelas referenciadas no procedimento devem incluir o nome do esquema, e não são permitidos curingas (*) em consultas. SCHEMABINDING só há suporte para procedimentos armazenados compilados nativamente nesta versão do SQL Server. |
EXECUTE AS |
Os procedimentos armazenados compilados nativamente não oferecem suporte a EXECUTE AS CALLER , que é o contexto de execução padrão. Portanto, a especificação do contexto de execução é necessária. Há suporte para as opções EXECUTE AS OWNER , EXECUTE AS usuário e EXECUTE AS SELF . |
BEGIN ATOMIC |
O corpo do procedimento armazenado compilado nativamente deve consistir em exatamente um bloco atômico. Os blocos atômicos garantem a execução atômica do procedimento armazenado. Se o procedimento for chamado fora do contexto de uma transação ativa, ele iniciará uma nova transação, que é confirmada no fim do bloco atômico. Os blocos atômicos nos procedimentos armazenados compilados nativamente têm duas opções necessárias:TRANSACTION ISOLATION LEVEL . Consulte Níveis de isolamento de transação para obter níveis de isolamento com suporte.LANGUAGE . O idioma do procedimento armazenado deve ser definido para um dos idiomas ou alias de idioma disponíveis. |
Quanto a EXECUTE AS
e aos logons do Windows, um erro poderá ocorrer devido à representação feita através de EXECUTE AS
. Se uma conta de usuário usa a Autenticação do Windows, deve haver confiança total entre a conta de serviço usada para a instância de SQL Server e o domínio do logon do Windows. Se não houver confiança total, a seguinte mensagem de erro será retornada ao criar um procedimento armazenado compilado nativamente: Msg 15404, Não foi possível obter informações sobre o grupo/usuário do Windows NT 'nome de usuário', código de erro 0x5.
Para resolver esse erro, execute um destes procedimentos:
Use uma conta do mesmo domínio que o usuário do Windows para o serviço do SQL Server.
Se SQL Server estiver usando uma conta de computador, como Serviço de Rede ou Sistema Local, o computador deverá ser confiável para o domínio que contém o usuário do Windows.
Use a Autenticação SQL Server.
Você também pode ver o erro 15517 ao criar um procedimento armazenado compilado de modo nativo. Para obter mais informações, consulte MSSQLSERVER_15517.
Atualizando um procedimento armazenado nativamente compilado
Não há suporte para a execução de operações de alteração em procedimentos armazenados compilados de modo nativo. Uma maneira de modificar um procedimento armazenado compilado nativamente é remover e recriar o procedimento armazenado:
Gere o script para as permissões no procedimento armazenado.
(Opcional) Gere o script para o procedimento armazenado e salve como um backup.
Descarte o procedimento armazenado.
Crie o procedimento armazenado alterado.
Reaplique as permissões em script ao procedimento armazenado.
A desvantagem desse procedimento é que o aplicativo estará offline desde o início da etapa 3 até a conclusão da etapa 5. Isso pode levar alguns segundos e o cliente que estiver usando o aplicativo poderá ver mensagens de erro.
Outra maneira de modificar (com eficiência) um procedimento armazenado compilado nativamente é criar primeiro uma nova versão do procedimento armazenado. Aqui, o procedimento armazenado compilado nativamente tem um número de versão associado. Chamaremos a versão antiga de SP_Vold e a nova versão de SP_Vnew.
Gere o script para as permissões em SP_Vold.
Crie SP_Vnew.
Aplique as permissões de SP_Vold a SP_Vnew.
Atualize as referências a SP_Vold para apontar para SP_Vnew. Há várias maneiras de se fazer isso. Por exemplo:
Use um procedimento armazenado de wrapper (baseado em disco) e altere-o para apontar para SP_Vnew. A desvantagem dessa abordagem é o impacto no desempenho da indireção.
ALTER PROCEDURE dbo.SP p1,...,pn AS EXEC dbo.SP_Vnew p1,...,pn GO
(Opcional) Descarte SP_Vold.
A vantagem dessa abordagem é que o aplicativo não fica offline. No entanto, é mais trabalhoso manter as referências e ter certeza de que elas apontam para a versão mais recente do procedimento armazenado.