[PT-BR] SQL Server Procedures
Published: 2023-11-28 18:04:14


# Pré-requisitos
Antes de mergulhar neste artigo, é necessário conhecer os seguintes conceitos:

1. Você precisa saber o que é um sistema de banco de dados.
2. Você precisa saber o que é uma procedure de banco de dados.
3. Você precisa estar ciente de que as procedures armazenadas podem variar entre os sistemas de banco de dados que você escolher.


## O que é um sistema de banco de dados?

Um sistema de banco de dados é uma solução de software que gerencia, organiza e fornece acesso a dados. Ele é projetado para armazenar, recuperar e manipular eficientemente grandes volumes de dados, garantindo integridade, segurança e controle de concorrência dos dados. Um sistema de banco de dados normalmente inclui um sistema de gerenciamento de banco de dados (SGBD) e os próprios dados.

## O que é uma procedure?

Procedures (às vezes chamados de Procedimentos Armazenados ou Procs) são sub-rotinas que podem conter uma ou mais instruções SQL que realizam uma tarefa específica. Elas podem ser usadas para validação de dados, controle de acesso ou para reduzir o tráfego de rede entre clientes e servidores de SGBD. Lógica de negócios extensa e complexa pode ser incorporada na sub-rotina, oferecendo assim melhor desempenho.

## Diferenças entre stored procedures no MySQL, PostgreSQL e SQL Server 
Embora todos eles suportem procedimentos armazenados como uma maneira de encapsular e executar uma série de instruções SQL, há variações na sintaxe, recursos e funcionalidades. Aqui estão alguns pontos-chave de diferença:

1.  **Diferenças de Sintaxe:**
    
    1.1   SQL Server usa Transact-SQL (T-SQL) para stored procedures.
    1.2 O MySQL usa sua própria linguagem procedural conhecida como MySQL Stored Procedure Language.
    1.3 O PostgreSQL usa PL/pgSQL como sua linguagem procedural.
    
2.  **Recursos de Linguagem Procedural:**
    
    2.1 O T-SQL do SQL Server oferece um conjunto rico de recursos de programação procedural, incluindo construções de controle de fluxo, tratamento de erros e gerenciamento de transações.
2.2 A linguagem de procedimento armazenado do MySQL é semelhante ao T-SQL, mas pode ter algumas diferenças sintáticas e um conjunto ligeiramente diferente de recursos.
2.3 O PL/pgSQL do PostgreSQL é uma linguagem versátil e poderosa, semelhante ao PL/SQL no Oracle, e fornece recursos como loops, declarações condicionais e tratamento de exceções.
    
3.  **Transaction Management:**
    
3.1 O tratamento de transações pode ter diferenças sutis. Por exemplo, a maneira como as transações são iniciadas, confirmadas ou revertidas pode variar.
3.2 O SQL Server frequentemente usa instruções `BEGIN TRANSACTION`, `COMMIT` e `ROLLBACK`.
3.3 MySQL e PostgreSQL têm seus equivalentes, mas a sintaxe e o comportamento podem diferir.
 
4.  **Error Handling:**
    
4.1 O SQL Server fornece blocos `TRY...CATCH` para tratamento estruturado de erros.
4.2 O MySQL usa `DECLARE ... HANDLER` para manipulação de exceções.
4.3 O PostgreSQL possui blocos `EXCEPTION` para tratamento de erros.

5.  **Suporte a Recursos Avançados:**
    
Cada sistema de banco de dados pode ter seu próprio conjunto de recursos avançados e extensões para procedimentos armazenados. Por exemplo, o PostgreSQL suporta várias linguagens além do PL/pgSQL, permitindo o uso de linguagens como PL/Python, PL/Perl, etc., para procedimentos armazenados.

6.  **Modelo de Segurança:**
    
Os modelos de segurança para procedimentos armazenados podem ser diferentes. O SQL Server, por exemplo, integra-se à autenticação do Windows, enquanto o MySQL e o PostgreSQL geralmente dependem de seus sistemas de gerenciamento de usuários.

7.  **Ferramentas e Gerenciamento:**
    
As ferramentas disponíveis para desenvolver, gerenciar e depurar procedimentos armazenados podem variar entre os sistemas de banco de dados. O SQL Server possui o SQL Server Management Studio (SSMS), o MySQL usa ferramentas como o MySQL Workbench, e o PostgreSQL possui ferramentas como o pgAdmin.

8.  **Compatibilidade:**
    
A portabilidade de procedimentos armazenados entre esses bancos de dados pode ser limitada devido a diferenças na sintaxe e nos recursos. Se você planeja mudar de sistema de banco de dados, pode ser necessário modificar seus procedimentos armazenados de acordo.

# Qual é a motivação por trás do uso de procedimentos de banco de dados?

Procedures de banco de dados são uma boa feature para encapsular lógica de negócios, validar campos e proteger seus dados. No entanto, na minha opinião, eu nunca os usaria para alcançar esses objetivos. A melhor maneira de fazer essas coisas é usar uma API, onde você pode encapsulá-las.

Prefiro usar procedimentos para obter informações sobre as entidades do banco de dados, como tabelas, usuários e índices.

# Tabela

| Stored Procedure | Descrição |
|  --------  |  -------  |
|`sp_help`|Fornece informações sobre um banco de dados, uma tabela, uma visualização ou um índice.|
|`sp_who`|Exibe informações sobre usuários e processos atuais.|
|`sp_configure`|Exibe ou altera configurações globais.|
|`sp_who2`|Semelhante a sp_who, mas fornece informações mais detalhadas.
|`sp_spaceused`|Exibe a quantidade de espaço usado e reservado por uma tabela.
|`sp_rename`|Renomeia um objeto criado pelo usuário no banco de dados atual.
|`sp_helptext`|Exibe a definição de uma regra, padrão ou trigger definido pelo usuário.
|`sp_adduser`|Adiciona uma nova conta de login do SQL Server.
|`sp_addlogin`|Adiciona um novo login para o SQL Server.
|`sp_helpindex`|Exibe informações sobre índices em uma tabela.
|`sp_depends`|Exibe informações sobre dependências de um objeto.
|`sp_helpconstraint`|Exibe informações sobre as constraints de uma table.

# Usabilidade
Em uma query SQL, você pode rodar o comando abaixo e recuperar a information de uma tabela, por exemplo:

`exec sp_help 'table_name'`