quarta-feira, 10 de agosto de 2011

sp_rename e sp_helptext. Será um erro?

Ao renomear uma procedure utilizando a procedure sp_rename talvez tenha encontrado um erro no SQL Server. Vejamos:

1) Vamo criar a procedure abaixo:

                   USE AdventureWorks2008R2
                   GO
                   CREATE PROCEDURE sp_Employee
                   AS
                   SELECT * FROM HumanResources.Employee
                   WHERE JobTitle LIKE '%i%'
                   ORDER BY 1
                   GO

2) Vamos renomear a procedure:

                   sp_rename 'sp_Employee', 'sp_OtherEmployee'

3)  Vamos verificar o texto da nova procedure:

                   USE AdventureWorks2008R2
                   GO
                   sp_helptext sp_OtherEmployee 

4) Observe o resultado e constate que o nome da procedure retornado ainda é o antigo.

          CREATE PROCEDURE sp_Employee 
          AS 
          SELECT * FROM HumanResources.Employee
          WHERE JobTitle LIKE '%i%'
          ORDER BY 1

5) Observe que ao tentar visualizar o conteúdo da procedure usando o nome antigo ganhamos o erro abaixo:

The object 'sp_employee' does not exist in database 'AdventureWorks2008R2' or is invalid for this operation.

6) Agora execute a procedure com o novo nome!!!

Conclusão:

O problema está na procedure sp_helptext. Além disso, a situação acima também se dá em Views, Triggers e Functions etc.

Questão:

Se o nome da procedure que está no corpo da procedure não é atualizado, como o SQL Server executa a procedure correta?

Resposta:

O nome da procedure que estava no System Metadata foi atualizado, mas não foi atualizado na definição da procedure. Quando executamos uma stored procedure, o SQL Server encontra o ObjectID da stored procedure e recupera o corpo da procedure usando o ObjectID e executa o corpo da procedure. Por isso, ao executar a procedure não ocorreu qualquer erro.


Nenhum comentário:

Postar um comentário