Professor Eduardo Professor Enildo Adição de Comentários Comentários são informações que adicionamos ao código que desenvolvemos para documentar os scripts, permitindo que outros desenvolvedores compreendam melhor o que escrevemos. No script operadores aritméticos, acrescente o seguinte texto: Comentários com múltiplas linhas Outa forma de adicionar comentários é através de barras com asterisco, que permitem comentários com múltiplas linhas. Exemplo: Teste operacional básico SELECT CURRENT_TIMESTAMP; SELECT SUSER_SNAME(); Para executar a instrução, use o comando de menu Consultar/executar ou simplesmente acione a tecla de função <F5>. Detalhes de Painel Menu File: File/Open/File “Permite ao usuário abrir salvar arquivos e script, que tem a terminação QSL” Object Explorer: Painel a esquerda da tela, mostra estrutura hierárquica as instâncias conectadas, seus bancos de dados e suas estruturas de tabelas, procedures e functions. É possível conectar diversas instâncias ao mesmo tempo e escrever scripts, acessar objetos, desde que você tenha as permissões. Editos de Querys: Com o botão New Query é possível abrir novas janelas de query e também usar a combinação de atalhos Ctrl+N. Database Selection: Um Listbox localizado na barra de botões que lista todos os bancos de dados criados na instância, de sistema ou criados pelo usuário. Banco de dados do Sistema Na janela Object Explorer encontraremos os bancos de dados do sistema, criados durante o processo de instalação do produto. Master (registra informações de instância, login, servidores conectados e configurações do sistema. Model (é utilizado como um template para a criação de outros banco de dados. Msdb (armazena informações sobre agendamento de jobs e configurações de algumas funcionalidades. Tempdb (armazena todos os bjetos que são criados temporariamente. Primeiros Scripts em T-SQL A linguagem Transact-SQL é uma extensão proprietária do SQL comum desenvolvido pela Microsoft. Abra uma janela de query e digite o treco de código seguinte: Clique no botão execute ou F5. O SQL Server as strings são indicadas com aspas simples. Como salvar o Script: Clique no botão salvar, localizado no painel superior, a tela para escolha do nome e da localização do arquivo deve se abrir. Informe o nome “Script1”, selecione uma pasta para salvar o arquivo e clique em OK. Variáveis no T-SQL e Tipos de Dados Com o T-SQL é possível criar variáveis que recebem e retornam valores, utilizando os tipos de dados disponíveis no SQL Server. Os valores atribuídos às variáveis são armazenados em memória, assim que a sessão é encerrada, os dados a essas variáveis são perdidos. New query: Execute. Tipos de variáveis Toda declaração de variáveis no T-SQL deve ser “tipada”, ou seja, deve utilizar um dos tipos de dados disponíveis no SQL Server, que são os seguintes: Tipos numéricos exatos Bigint bit decimal int money numeric smallint smallmoney tinyint Tipos numéricos aproximados float real Data e hora date datetime2 datetime datetimeoffset smalldatetime time Cadeia de caracteres char text varchar Outros tipos de dados Cadeia de caracteres unicode Cursor nchar SQL_variant ntext table nvarchar timestamp hierarchyid uniqueidentifier xml Binários binary image varbinary Concatenação de Strings Utilizando o operador de adição “+”, podemos concatenar strings de todo tipo, como variáveis declaradas com tipos de caracteres. New query Execute. Vale observar que a atribuição de calor de variáveis pode ser feita com SET ou SELECT, levando ao mesmo resultado. A atribuição com SET está dentro dos padrões ANSI, mas com SELECT permite atribuição múltipla. New query Execute. Operadores Aritméticos Os operadores aritméticos em T-SQT são: operação operador adição + subtração - multiplicação * divisão / mod % New query: Execute Obs: “AS” para definir um nome para a coluna de resultado desta operação. Comparadores Lógicos e Controle de Fluxo com T-SQL. No contexto da programação de sistemas informatizados, controle de fluxo é a ordem em que os comandos e instruções são executados. Um comando de controle de fluxo, com base em uma condição lógica estática ou dinâmica, permite determinar o prosseguimento de dois ou mais caminhos possíveis do código. Comparadores Lógicos Operador Descrição > Maior que < Menor que = Igual a <> Diferente de >= Maior ou igual a <= Menor ou igual a Utilizando o IF É possível criar uma divisão de fluxo com base em uma condição com IF. New query: Uso do WHILE O comando WHILE é uma estrutura de controle que, baseado em uma condição lógica, determina a execução de uma instrução específica repetidamente. New query: Exemplo: --operadores aritméticos Realização de Operações Aritméticas Básicas --operações aritméticas básicas Datas com GETDATE() e CURRENT_TIMESTAMP A função GETDATE() e a função CURRENT_TIMESTAMP retornam a data atual do sistema operacional em que a instância está sendo executada. As funções não esperam nenhum argumento, e retornam como resuLtado um valor do tipo DATETIME. A função pode ser executada com um simples SELECT; A diferença é que GETDATE() é uma extensão do T-SQL e CURRENT_TIMESTAMP é padrão ANSI. Conversão de tipos de Dados com CAST e CONVERT As funções de conversão de tipos de dados d T-SQL são o CAST padrão ANSI e o CONVERT é uma extensão do SQL Server. New Query DECLARE @VALOR INT SET @VALOR = 1000 PRINT ‘VALOR É ‘ + @VALOR Analisando o Erro Erro ao executar Msg 245, Level 16, State 1, Line 6 Conversion failed when converting the varchar value ‘VALOR É ‘ to data type int. O erro ocorreu ao tentar concatenar a string ‘VALOR É’ com a variável do tipo inteiro @VALOR, houve um erro de conversão. Para que este trecho funcione, é necessário converter o valor no momento da concatenação. Altere o código da seguinte forma: Com o CONVERT é necessário informar primeiramente o tipo de dados e depois o valor a ser convertido. Por que usar o CONVERT? O CONVERT permite um terceiro argumento opcional, que é muito útil para conversão de datas. Em processo de integração de dados e sistemas, é possível que datas se encontrem em formatos diversos e a conversão em DATETIME diretamente pode não ser possível. A função CONVERT é muito útil para estas situações. New Query: SELECT CONVERT (DATETIME, ‘10/25/2025’, 101) As [mm/dd/yyyy] , CONVERT (DATETIME, ‘2025.10.25’, 102) As [yyyy.mm.dd] , CONVERT (DATETIME, ‘25/10/2025’, 103) As [dd/mm/yyyy] , CONVERT (DATETIME, ’25.10.2025’, 104) As [dd.mm.yyyy] , CONVERT (DATETIME, ’25-10-2025’, 105) As [dd-mm-yyyy] O terceiro argumento da função CONVERT, denominado STYLE, serve para que a função assimile o formato de entrada do segundo argumento, possibilitando que a função execute a conversão. Resultado É possível executar também o processo inverso, ou seja, converter valores do tipo DATIME e uma cadeia de caracteres com o formato desejado. Observe este exemplo em que se usa a função CURRENT_TIMESTAMP que retorna a data e a hora do servidor em que a instância está instalada. New Query: SELECT CONVERT (VARCHAR, CURRENT_TIMESTAMP, 101) As [mm/dd/yyyy] , CONVERT (VARCHAR, CURRENT_TIMESTAMP, 102) As [yyyy.mm.dd] , CONVERT (VARCHAR, CURRENT_TIMESTAMP, 103) As [dd/mm/yyyy] , CONVERT (VARCHAR, CURRENT_TIMESTAMP, 104) As [dd.mm.yyyy] , CONVERT (VARCHAR, CURRENT_TIMESTAMP, 105) As [dd-mm-yyyy] Resultado Exercício 1 Escreva um trecho de código realizando a multiplicação entre duas variáveis do tipo REAL, sendo com o valor de 8 e a outra com o valor de 9. Adicione ao script um comentário com o enunciado desta questão* Resolução Revisão dos Comandos SQL O comando para criar uma base de dados é? CREATE DATABASE New Query: CREATE DATABASE BDEXEMPO1; Clique com o botão direito no BDEXEMPLO1, no menu selecione a opção Propriedades; Arquivo MDF e LDF O arquivo MDF é utilizado para armazenar os dados propriamente ditos, assim como as estruturas de dados. O MDF é chamado de arquivo de BD primário. O LDF é o que chamamos de arquivos de log, ou o log transacional do SQL Server. Nesse arquivo estão todas as transações realizadas no banco de dados desde a sua criação ou de seu último backup full até o momento atual. O comando para excluir uma base de dados é? DROP DATABASE BDEXEMPLO1; Para que sua execução seja possível, é necessário que o banco de dados não esteja em uso por nenhum outro usuário no momento da intervenção. Exercício 2 1. Crie uma base de dados com nome de “BDProjetoTSQL”. 2. Crie uma tabela com nome de “TBclientes”, com os campos; Nomecli (caracteres até 100) Enderecocli (caracteres até 100) Telefonecli (caracteres até 25) Emailcli (caracteres até 100) Resultado Visualizando as propriedades da tabela A procedure SP_HELP Outra opção para visualizar a estrutura de uma tabela no SQL Server é executar a procedure SP_HELP, informe entre aspas simples nome da tabela a ser analisada. Resultado Geração de Script de uma tabela Podemos gerar um script de criação de uma tabela já existente em um banco de dados utilizando o Management Studio. Expanda a aba Object Explorer até chegar à tabela que deseja obter o script e clique com o botão direito do mouse, no menu de contexto selecione a opção “/script table as” / “CREATE To” / “New Query Editor Windows. Resultado Exercício 3 Altere a tabela TBclientes, incluindo um campo com nome de “DataNascimentocli” que receberá dados do tipo data e hora. Resultado Alteração de tabelas com o comando ALTER TABLE É possível alterar tabelas, adicionando e removendo colunas com o comando ALTER TABLE em conjunto som os comandos ALTER COLUMN. Para adicionar uma nova coluna em uma tabela existente use o comando ALTER TABLE em conjunto com ADD. Para alterar uma coluna já existente em uma tabela use o comando ALTER TABLE em conjunto com ALTER COLUMN. Exercício 4 Altere o campo “DataNascimentocli” da tabela TBclientes, para que o campo seja de preenchimento obrigatório. Resultado Chaves Primárias Chaves primárias são colunas que possuem valores distintos em cada linha ou registro de uma tabela. Valores nulos também não podem estar associados a uma coluna candidata à chave primária. Campos do tipo chave primária são recomendavelmente associados a campos auto incrementais. Campos deste tipo preenchem-se automaticamente, começando a partir de um valor inicial, evoluindo crescentemente através de um determinado parâmetro. Exercício 5 Altere a tabela TBclientes, incluindo um campo com nome de “Codigocli” que receberá dados do tipo número inteiro, será um campo chave primária e será auto incremental iniciando no numero 1 e incrementando de um em um. Resultado Utilize o comando SP_HELP para conferir se o campo foi criado corretamente. Inserção de registros na tabela com comando INSERT Para inserir registros na tabela, devemos utilizar o comando INSERT, cuja sintaxe é relativamente simples; INSERT INTO <nome_tabela> (campo1,campo2,campoN) VALUE (dado1, dado2, dadoN) [;] Podemos inserir múltiplos registros na mesma instruções; INSERT INTO <nome_tabela> (campo1,campo2,campoN) VALUE (dado1, dado2, dadoN) , (dado1, dado2, dadoN) , (dado1, dado2, dadoN) , (dado1, dado2, dadoN) [;] Exercício 6 Insira os seguintes registros na tabela “Tbclientes”; 1. Nome (Bill Gates), endereço (Rua da Feia, 12), telefone (2222-3333), e- mail ([email protected]) e data de nascimento (28/10/1955); 2. Nome ( Benjamin Franklin), endereço (Rua Só Nós Dois, 3 14) , telefone (2222-3334) e-mail ([email protected]) edata de nascimento (17/01/1706); 3. Nome ( John Lennon), endereço (Rua Deus-te-guarde, 123) , telefone (2222-3335) e-mail ([email protected]) e data de nascimento (09/10/1940); 4. Nome ( Thomas Edison), endereço (Largo da Boa Morte, 32) , telefone (2222-3336) e-mail ([email protected]) e data de nascimento (11/02/1847); 5. Nome ( Steve Jobs), endereço (Rua Capitão da Meia-noite, 55) , telefone (2222-3337) e-mail ([email protected]) e data de nascimento (24/02/1955). Exercício Insira os seguintes registros na tabela “Tbclientes”; 1. Nome (Bill Gates), endereço (Rua da Feia, 12), telefone (2222-3333), e- mail ([email protected]) e data de nascimento (28/10/1955); 2. Nome ( Benjamin Franklin), endereço (Rua Só Nós Dois, 3 14) , telefone (2222-3334) e-mail ([email protected]) edata de nascimento (17/01/1906); 3. Nome ( John Lennon), endereço (Rua Deus-te-guarde, 123) , telefone (2222-3335) e-mail ([email protected]) e data de nascimento (09/10/1940); 4. Nome ( Thomas Edison), endereço (Largo da Boa Morte, 32) , telefone (2222-3336) e-mail ([email protected]) e data de nascimento (11/02/1847); 5. Nome ( Steve Jobs), endereço (Rua Capitão da Meia-noite, 55) , telefone (2222-3337) e-mail ([email protected]) e data de nascimento (24/02/1955). Erro MENSAGEM 242, Nivel 16, Estado 3, Linha 2 A conversão de um tipo de dados varchar para um tipo de dados datetime resultou em um valor fora do intervalo. A instrução foi encerrada. Resultado Retorno de registro com comando SELECT O comando SELECT retorna dados de variáveis e strings, porém tem sua função maiores na seleção de registros em tabelas armazenadas em bancos de dados relacionais. Comando para campos específicos. Exemplo; Comando para todos os campos. Exemplo; Retorno de consulta com função A função GETDATE(), pode ser usada em um contexto de consulta, com outras colunas de uma query: SELECT Codigocli, Nomecli, GETDATE() AS [Data Atual] FROM TBclientes; Filtro de Registro com Comando WHERE Podemos filtrar os registros que desejemos visualizar com base em determinados critérios que atendem à necessidade do negócio, utilizando o comando WHERE. Com esse comando é possível determinar o que desejamos visualizar, comparando os campos com determinadas condições estabelecidas, usando os operadores de comparação. Exemplo: SELECT Codigocli, Nomecli, Enderecocli, Telefonecli, Emailcli,DataNascimentocli FROM TBclientes WHERE Codigocli > 3; Exercício 7 Realize uma consulta onde mostre o nome do cliente com código de numero 4, e uma data limite de 30 dias a partir da data de hoje. Solução Realize uma consulta onde o mostre o nome do cliente com código de numero 4, e uma data limite de 30 dias a partir da data de hoje. Operador AND Podemos fazer comparações mais completas, envolvendo outros campos, usando o operador AND. Por exemplo, se quisermos ver os clientes com o código maior que 3 e com data de nascimento posterior ao ano de 1950: SELECT Codigocli, Nomecli, Enderecocli, Telefonecli, Emailcli,DataNascimentocli FROM TBclientes WHERE Codigocli > 3 AND DataNascimentocli >'19500101'; Operador OR O comando OR permite retornar valores que satisfazem uma ou outra condição. Exemplo: SELECT FROM WHERE OR Codigocli, Nomecli, Enderecocli, Telefonecli, Emailcli,DataNascimentocli TBclientes Codigocli > 3 DataNascimentocli >'19500101'; Operador Between Podemos fazer comparações de faixas de dados com comando BEWEEEN utilizando um valor inicial e um final de comparação. Exemplo: SELECT FROM WHERE AND AND * Tbclientes Codigocli > 1 DataNascimentocli BETWEEN '19000101' '19850101'; Operador LIKE Podemos usar o operador LIKE nas consultas para realizar pesquisas aproximadas em campos de caracteres. Por exemplo, para consultar todos os registros com o primeiro caractere do campo nomecli igual a “B”: SELECT * FROM TBclientes WHERE Nomecli LIKE 'B%'; Caractere “%” No script anterior foi utilizado o caractere “%”, que permite realizar a consulta aproximada. Podemos usar o “%” para pesquisar não apenas no começo, mas também no final da string. Exemplo: SELECT * FROM TBclientes WHERE Nomecli LIKE '%n'; Exemplo no meio da string: SELECT * FROM TBclientes WHERE Nomecli LIKE '%m%'; Exercício 8 Insira os dois registros abaixo no BDProjetoTSQL na tabela TBclientes; Nome Endereço Telefone Marcelo Silva Rua da Feia, 22 2222-3333 E-mail Data Nasc 28/10/2000 [email protected] Marcela Teixeira Rua Só, 14 2222-4334 17/01/1999 [email protected] Solução Uso do LIKE com colchetes [] O comando LIKE pode ser complementado com os colchetes para pesquisas mais complexas. Por exemplo, para consultar todos os registros de clientes que têm como primeiro nome , sem importar o sobrenome. Exemplo: SELECT * FROM TBclientes WHERE Nomecli LIKE 'Marcel[ao]%'; O Comando TOP O comando TOP permite limitar o número de registro que serão mostrados pela instrução SELECT, a qual recebe como argumento único o número de registros a serem mostrados pela query. Veja exemplo do script mostrando os dois primeiros registros da tabela: ----------------------------------------------------------------- Exemplo com * Ordenação dos Registros com o ORDER BY Para dispor os registros em uma determinada ordem, use o comando ORDER BY. O argumento ORDER BY espera apenas a indicação das colunas em que você deseja ordenar a seleção desejada. Exemplo: Exemplo em ordem decrescente: Atualização dos Registros com o Comando UPDATE O comando UPDATE permite atualizar registros em tabelas do SGBD, alterando o valor de uma ou mais colunas. Exemplo alterando os dados do cliente com o código igual a “1”, que mudou de endereço. Exercício 9 Adicione um campo nomeado como “Cep” do tipo “VARCHAR(10)” na tabela Tbclientes na base de dados BDProjetoTSQL. Solução As Funções ISNULL e COALESCE A função ISNULL é utilizada para tratar campos com valores “nulos”, seja em consultas ou em trechos de códigos SQL. Veja uma consulta completa de todos as colunas da tabela TBclientes; Observe que a coluna Cep está com indicador “NULL” em todos os registros da tabela, pois não contém nenhum dado. Para fins de relatórios e de apresentações de dados mais finalizados, é possível trocar o indicador “NULL” por outra mais descritivo. Exemplo podemos trocar o indicador NULL por “Sem Cep” : Analise as consultas abaixo Exercício 10 Faça uma atualização no registros do cliente com o código “1”, inserindo no campo cep o dado “99909-303”. Solução Ao executar a consulta realizada anteriormente, observe que para o cliente com código 1, em que alteramos o valor da coluna Cep, o valor mostrado é o da coluna. A função COALESCE tem o mesmo propósito da função ISNULL, porém a função COALESCE faz parte do padrão ANSI, ou seja, está presente em outros bancos de dados, diferentes do ISNULL que é uma extensão do SQL Server. A função COALESCE tem a mesma sintaxe do ISNULL, porém com uma diferença básica: pode receber mais de dois parâmetros, diferente da função ISNULL que pode receber apenas dois. Exemplo: Exclusão de Registros com o comando DELETE Para excluir um registro que foi inserido em uma tabela do SQL Server, devemos usar o comando DELETE que, assim como os comandos SELECT e UPDATE, pode se utilizar da cláusula WHERE para filtrar os dados a serem excluídos. Exemplo excluindo o cliente com o código igual a sete: Uma questão importante quando excluímos registros de tabelas com um campo com propriedade Identity é que, depende dos registros que estão sendo excluídos, podemos ter “gaps” na sequência do campo Identity. Exercício 11 1. Insira um novo registro com os seguintes dados: Nome ( Joselito Manga) Endereço ( Rua das Minas, 33) Telefone (9191-3343) Email ([email protected]) Data de Nascimento ( 22/04/1990) 2. Após inserir o registro faça uma consulta que mostre todos os dados de todos os clientes. Solução Observe que na lista de resultados temos uma lacuna na sequência dos valores Identity. Exclusão de Todos os Registros com o Comando TRUNCATE TABLE Para excluir todos os registros de uma tabela, podemos usar o comando DELETE sem nenhuma restrição na cláusula WHERE. Se a tabela não possui relacionamentos e desejamos excluir todos os registros sem nenhuma descriminação, é mais recomendado utilizar o comando TRUNCATE TABLE, por questões de desempenho, mas tenha muito cuidado ao utilizar esse comando. Exemplo da sintaxe: Observação: O comando TRUNCATE TABLE exclui os registros da tabela, porém dá um RESET na coluna Identity. Tabelas Temporárias Tabelas temporárias são comuns, mas existem apenas no escopo da sessão em que foram criadas. Não estão armazenadas fisicamente no banco de dados de maneira definitiva. Para criar uma tabela temporária, basta acrescentar o prefixo “#” ao nome da tabela na sua criação. Observe que podemos criar essa tabela no mesmo Database em que criamos a tabela de clientes, pois na verdade tabelas temporárias são armazenadas no Tempdb. Opcionalmente, podemos criar uma tabela temporária de outra maneira através do comando SELECT, usando a instrução INTO. Essa técnica cria uma tabela temporária implicitamente já com os dados da tabela preexistente, diferente do comando CRATE TABLE que executa essa operação de maneira explícita e “vazia”. Exemplo sintaxe: O SELECT INTO permite a criação de tabelas físicas também. Basta remover o caractere “#”. Tabelas temporárias se dividem em dois tipos: Globais; Locais. Tabelas locais são criadas com o caractere Sharp (“#”). Tabelas globais são criadas com dois caractere Sharp (“##”). Exemplo: SELECT * INTO # TBClientes FROM TBClientes; A criação de tabelas temporárias é muito útil para validação de dados e realização de testes em scripts mais complexos. Relacionamento e Integridade Referencial Integridade referencial é uma propriedade relacionada aos valores de uma coluna de uma tabela de banco de dados. Todos os valores dessa coluna têm uma correspondência em outra coluna de outra tabela. Se esta condição estiver satisfeita, podemos dizer que há uma integridade referencial entre duas tabelas. Chave Estrangeira Uma coluna é declarada como chave estrangeira quando faz referência a dados de uma coluna que é declarada chave Primária em outra tabela. A chave Estrangeira pode conter valores nulos (ausência de dados), porém os registros que tão preenchidos devem ter correspondência na outra tabela. No caso de tentativa de exclusão de registro que são referenciados por uma chave estrangeira, um banco de dados relacional pode impor a integridade referencial, impedindo a exclusão, excluindo todos os registros relacionados ou até mesmo tornando nulas as colunas de registros que faziam referência à chave que foi excluída. Verificando tabelas existente No SQL Server, para cada banco de dados criado em uma instância, um novo registro na view de sistema sys.databases. Além de várias outras ferramentas que substituem o MS em forma gráfica (Exemplo: SQL DBX), podemos fazer via prompt de comando ou em uma janela de consulta. Exemplo de comando para verificar quais as tabelas que existem na base de dados em uso: Exemplo de comando para verificar quais as tabelas existem em uma base especifica: Assim, basta consultar esta tabela para realizar a tarefa desejada Exercício 12 A) Na base de dados “BDProjetoTSQL”. Realize uma consulta para verificar quais tabelas existem. B)Faça uma consulta para verificar todos os registros da tabela existente. C) Inclua os seguintes registros na tabela “Existente”; 1. Nome (Bill Gates), endereço (Rua da Feia, 12), telefone (2222-3333), e-mail ([email protected]) e data de nascimento (28/10/1955); 2. Nome ( Benjamin Franklin), endereço (Rua Só Nós Dois, 3 14) , telefone (22223334) e-mail ([email protected]) e data de nascimento (17/01/1906); 3. Nome ( John Lennon), endereço (Rua Deus-te-guarde, 123) , telefone (2222-3335) e-mail ([email protected]) e data de nascimento (09/10/1940); 4. Nome ( Thomas Edison), endereço (Largo da Boa Morte, 32) , telefone (2222-3336) e-mail ([email protected]) e data de nascimento (11/02/1847); 5. Nome ( Steve Jobs), endereço (Rua Capitão da Meia-noite, 55) , telefone (2222- 3337) e-mail ([email protected]) e data de nascimento (24/02/1955). Solução A) Na base de dados “BDProjetoTSQL”. Realize uma consulta para verificar quais tabelas existem. B)Faça uma consulta para verificar todos os registros da tabela existente. C) Inclua os seguintes registros na tabela “Existente”; D) Na base de dados “BDProjetoTSQL”. Crie uma tabela com nome de “TBprodutos”, com os campos; Codprod (Int “Identity/PK”) Descprod (Varchar(150)) Valorprod (Numeric(18,2)) Ativo (Bit) Para atender ao requisito de valor padrão no campo “Ativo”, informe a instrução default, em que será informado o valor “1”. Exemplo de declaração default: Campo Bit Default(1); Solução D) Na base de dados “BDProjetoTSQL”. Crie uma tabela com nome de “TBprodutos”, com os campos; Para atender ao requisito de valor padrão no campo “Ativo”, informe a instrução default, em que será informado o valor “1”. Exemplo de declaração default: Campo Bit Default(1); E) Na base de dados “BDProjetoTSQL”. Crie uma tabela com nome de “TBvendas”, deve apresentar a seguinte estrutura; Coluna Tipo de dados Descrição Notafiscal Int (Identity) Codigocli Int Chave estrangeira da tabela TBcliente Codigoproduto Int Chave estrangeira da tabela TBproduto Datavenda DateTime Quantidade Int Valortotal Numeric (18,2) Chave primária da tabela Data da venda, valor padrão, data e hora atuais Quantidades de itens vendidos Valor total da venda, calculado pelo quantidade de itens, e valor de venda do produto Exemplo de referência de campo: <Campo> <tipo> REFERENCES <tabela> (<campo>) E) Na base de dados “BDProjetoTSQL”. Crie uma tabela com nome de “TBvendas”, deve apresentar a seguinte estrutura; Exemplo de referência de campo: <Campo> <tipo> REFERENCES <tabela> (<campo>) Análise de instruções IDENTITY, “controla a numeração automaticamente conforme números pré-estabelecidos”. PRIMARY KEY, “indica um campo da tabela como chave primária, o mesmo não irá se repetir nos outros registros”. REFERENCES, “recebe como argumento a tabela e o campo em que a respectiva chave primária (PK) foi definida, portanto, todos os valores atribuídos à coluna deve ter uma correspondência em outra tabela”. GETDATE(), “retorna a data atual do sistema operacional em que a instância foi instalada. CONSTRAINT "Constraint" são objetos no banco de dados que servem para definir sua integridade. Ou seja, são as chaves primárias, chaves estrangeiras, chaves secundárias e outros elementos que garantem segurança aos dados das tabelas, evitando que sejam excluídos ou alterados indevidamente os dados que entram em sua base. Constraint FOREIGN KEY - FK Sempre que criamos uma chave estrangeira, o SQL Server cria uma constraint para assegurar a integridade daquela chave estrangeira. Quando criamos a chave estrangeira de clientes na criação da tabela usando a instrução references, a criação da constraint foi implícita com um nome gerado automaticamente. Quando criamos com o comando ALTER TABLE, podemos atribuir um nome explícito a essa constraint. Exemplo: Verificando a estrutura da TBvendas Verificando as tabelas Existente na base “BDProjetoTSQL” Comando para verificar quais as tabelas existem na base de dados em uso SELECT * FROM information_schema.tables; Criando um Diagrama Clique com o botão direito do mouse na pasta Database Diagrams e clique na opção New Database Diagram, Selecione as tabelas e clique no botão “Adicionar”. Diagrama integridade referencial criado. Para melhor visualização, podemos posicionar as ligações das tabelas. Realize uma consulta nas tabelas para verificar os registros. Exercício 13 Insira os registros abaixo na TBprodutos da base de dados BDProjetoTSQL. Os registros são fictícios. Código do Produto Descrição Valor 6 Tecnologia da informação 23.000,00 5 Sistemas da informação 25.000,00 9 Segurança da informação 22.000,00 10 Processamentos de dados 21.000,00 1 Ciência da computação 24.000,00 7 Física computacional 23.500,00 3 Engenharia da computação 25.000,00 4 Engenharia de software 24.000,00 8 Engenharia de sistemas 23.000,00 2 Engenharia mecatrônica 25.000,00 Solução exercício 13 Observe o resultado Exercício 14 Insira os registros abaixo na TBvendas da base de dados BDProjetoTSQL. Os registros são fictícios. Código Cliente Código Produto Data Venda Quant. Valor da venda 6 2 01/01/2014 1 25.000,00 2 6 01/01/2014 1 23.000,00 6 1 01/01/2014 1 24.000,00 4 4 01/01/2014 2 24.000,00 4 3 01/06/2014 1 25.000,00 3 7 01/06/2014 2 23.500,00 2 5 01/06/2014 1 25.000,00 3 10 01/06/2014 2 21.000,00 2 2 01/06/2014 1 25.000,00 4 5 01/06/2014 1 25.000,00 2 7 01/06/2014 1 23.500,00 3 4 01/06/2014 2 24.000,00 4 7 01/06/2014 1 23.500,00 Analisando solução A instrução INSERT em conflito com a restrição FOREIGN KEY "FK__TBvendas__Codigo__15502E78". O conflito ocorreu no banco de dados "BDProjetoTSQL", tabela "dbo.TBclientes", a coluna 'Codigocli'. A instrução foi encerrada. Verificando TBclientes Erro de referência, não pode ser efetuada uma venda para um cliente que não está cadastrado! Ao tentar executar o passo quatro, inserir os registros na TBvendas, ocorre o mesmo erro. Por que? Se você analisou o passa três percebeu que quando executou o comando “SELECT * FROM TBclientes” o código 6 não existe, ou seja, ele não existe! Por tanto o erro continua. Possível Solução Tentando solucionar o problema do código do cliente, poderíamos pensar em truncar a tabela, mas por conta da constraint isso não é permitido. Obs: em um banco de produção isso nunca será uma possível solução! Para fins de didático vamos tentar truncar a tabela Tbcliente para solucionar o nosso problema: Como indica a mensagem de erro Msg 4712, o comando TRUNCATE não pode ser executado pois existe uma constraint “restrição” na tabela. Como solucionar? Vamos aproveitar para treinarmos o comando Drop. Comando DROP Primeiro é preciso saber qual o nome da constrant, para isso verificamos a estrutura da Tbvendas: SP_HELP TBvendas; Sintaxe DROP constraint ALTER TABLE <nome_tabela> DROP CONSTRAINT < nome_constraint>[;] Após retirada da restrição o comando TRUNCATE pode ser executado: Agora podemos inserir os dados novamente. Analisando a TBclientes Observe o campo Codigocli. Agora os códigos 1 até 10 existem, portanto podemos retornar ao passo quatro do exercício 14? Não, antes devemos adicionar a restrição que foi excluída. ADD Constraint Sinntaxe: ALTER TABLE <nome_tabela> ADD CONSTRAINT <nome_constraint> FOREIGN KEY <nome_campo> REFERENCES <nome_Tabela> (<nome_campo)[;] Verificando estrutura da tabela Passo 4 – exercício 14 Diagrama Criação de um campo calculado Campos calculados são colunas virtuais que por padrão não estão armazenadas fisicamente no banco de dados. Estão dispostas apenas de maneira lógica. Uma coluna ou campo calculado pode ter diversas aplicações, como listar por extenso uma data ou calcular o resultado de uma operação aritmética entre dois ou mais campos de uma tabela. No caso da tabela Tbvendas, um cálculo interessante é o produto da quantidade de itens de venda e o valor da venda. Exercício 15 Realize uma consulta na tabela Tbvendas, mostrando todos os campos (colunas) mais um campo calculado com o valor total da nota, observe que a coluna deve ser nomeada como “Total da Nota”. Solução 15 Renomeando coluna Sintaxe: SP_RENAME <nome_tabela>.<nome_coluna_atual> , <novo_nome_coluna> , ‘COLUMN’ [;] Para renomear objetos tipo tabela: SP_RENAME <nome_tabela> , <novo_nome_tabela> [;] Exercício 16 Renomeie a coluna “Valortotalprod” para “Valor”. Solução 16 Teoria dos conjuntos e JOINS em Banco de Dados O JOIN é uma cláusula da linguagem SQL que permite criar consultas combinando resultados de uma ou duas tabelas por meio de valores comuns entre uma ou várias colunas de cada tabela. Quando se fala em uma tabela, a referência é feita a casos específicas chamados SELF JOINS, ou JOINS de uma tabela com ela mesma. Para entender melhor os JOINS e sua aplicação, tente visualizar as tabelas como conjuntos e os registros como elementos de cada um desses conjuntos. Por meio dos JOINS podemos consultar os elementos de cada um desses conjunto e as respectivas intersecções, uniões e diferenças. Comando INNER JOIN O padrão ANSI SQL define quatro tipos, sendo INNER, OUTTER, LEFT e RIGHT. O INNER JOIN consulta os registros de duas tabelas, verificando todos os registros de cada uma selecionando os que têm valores em comum, com base no critério estabelecido no JOIN. INNER JOIN No banco de dados ProjetoTSQL, criamos três tabelas, sendo clientes, produtos e vendas. Estabelecemos dois relacionamentos entre clientes e Vendas, e entre Produtos e Vendas, desta forma não é possível inserir vendas com clientes que não existem, mas é possível que existam clientes que não realizam vendas. Exemplo: (“Para listar o nome de cada cliente e a data da venda também de cada cliente, podemos usar o comando INNER JOIN. Exemplo O INNER JOIN é considerado o tipo de JOIN “padrão”. Podemos executar a query anterior com outra sintaxe eliminando o INNER e obteremos o mesmo resultado. Com o JOIN trazendo a intersecção dos registros da tabela Clientes (ou conjunto A) e da tabela Vendas (conjunto B). Comando LEFT JOIN O comando LEFT JOIN, entre duas tabelas hipotéticas A e B, vai trazer todos os registros da tabela A independente do critério estabelecido no predicado do JOIN. Ou seja, se a tabela A contém 100 registros e nenhum deles tem um correspondente na outra, baseado no critério de comparação, a query ainda assim vai trazer 100 registros, porém onde a correspondência existir, os dados correspondentes serão resgatados. Exemplo A query apresentada vai produzir todos os registros, mais que o resultado da query anterior. Observe que para os clientes que não efetuaram nenhuma compra, a coluna Datavendaprod está “nula”. Basicamente por meio do LEFT JOIN estamos trazendo todos os registros da tabela Clientes, mais a intersecção com a tabela Vendas. Comando RIGHT JOIN O comando RIGHT JOIN produz um resultado semelhante ao LEFT JOIN, porém com a inversão da comparação. Exemplo: Podemos listar a descrição de todos os produtos e a data da venda de cada um deles junto com os produtos que não realizaram vendas através de uma query com o comando RIGHT JOIN . Observe que podemos chegar exatamente ao mesmo resultado, usando LEFT JOIN e invertendo a posição das tabelas. _______________________________________________ Comando OUTER JOIN As conexões externas servem para efetuar junções entre tabelas sem que necessariamente exista entre elas uma combinação exata. O LEFT e o RIGHT OUTER JOIN são os componentes desse tipo de conexão. Não é obrigado o uso do termo OUTER, se você encontrar apenas LEFT JOIN, por exemplo, funcionará da mesma maneira. O OUTER JOIN pode ser utilizado quando você quiser retornar uma lista de todos os programadores, mesmo que estes não estejam relacionados a nenhuma linguagem de programação. A diferença do LEFT para o RIGHT está apenas na identificação de qual tabela da junção irá retornar todos os dados. O mais comum é o LEFT, pois normalmente colocamos a tabela mais importante primeiro. Inclusive a ordem das tabelas e das cláusulas de restrições na consulta, em alguns bancos, altera o desempenho. Comando CROSS JOIN CROSS JOIN – Todos os dados da tabela à esquerda de JOIN são cruzados com os dados da tabela à direita de JOIN por meio do CROSS JOIN, também conhecido como produto cartesiano. É possível cruzarmos informações de duas ou mais tabelas. Leia mais em: Cláusulas FULL JOIN, CROSS JOIN, UPDATE e DELETE Associação de Tabelas: SQL Server 2008 - Parte 3 http://www.devmedia.com.br/clausulas-full-join-cross-join-update-e-deleteassociacao-de-tabelas-sql-server-2008-parte-3/18931#ixzz2xy2j14Hb http://technet.microsoft.com/pt-br/library/ms190690(v=sql.105).aspx http://www.sqlguides.com/sql_cross_join.php Plano cartesiano Quando estudamos o plano cartesiano vimos também o conceito de par ordenado. Agora com base nestes conceitos estudaremos o produto cartesiano. O produto cartesiano de dois conjuntos A e B são todos os pares ordenados (x, y), sendo que x pertence ao conjunto A e y pertence ao conjunto B. Vamos tomar como exemplo os seguintes conjuntos A e B: Note que segundo a definição de produto cartesiano, todos os elementos de são pares ordenados em que o primeiro elemento pertence ao conjunto A e o segundo ao conjunto B. http://www.matematicadidatica.com.br/ProdutoCartesiano.aspx Exercício Apresente uma consulta onde mostre os nomes dos clientes que realizaram compras e as datas das vendas. Solução Comando CASE O comando CASE, comum em diversas linguagens de programação, avalia uma lista de condições verificadas em um ou mais campos e retorna apenas um de vários resultados possíveis. A sintaxe do CASE não é complexa. Depois do comando /case, as condições são avaliadas uma a uma com os argumentos WHEN e THEN. SELECT CASE WHEN <Expressão lógica 1> THEN <Resultado da expressão 1> WHEN <Expressão lógica 2> THEN <Resultada da expressão 2> ELSE <Resultado fora das condições listadas> END FROM <tabela> Exemplo Por meio do exemplo acima criamos uma classificação baseada no valor de venda de cada produto. Observe que na avaliação lógica, entre o comando WHEN e THEN, podemos ter qualquer condição e neste exemplo foi utilizado o comparador BETWEEN. Agrupamento de Dados com GROUP BY A cláusula GROUP BY permite agrupar registros baseados em um critério estabelecido no argumento da instrução posicionado logo após o comando. Sintaxe SELECT <campo> FROM <tabela> GROUP BY <campo> Exemplo Após o comando SELECT vejamos o tabela vendas apresentada Agora execute o comando com o comando GROUP BY Exercício Apresente uma consulta onde mostre os nomes dos clientes que realizaram compras e as datas das vendas, mas se o cliente realizou mais de uma compra no mesmo dia só deve aparecer uma vez, exemplo; o cliente comprou no dia 01/01/2014 uma vez, mas no dia 02/02/2014 ele realizou quatro compras, nesse caso aparecerá no nome do cliente e a data 01/01/2014 e o nome dele com a data 02/01/2014 apenas uma vez, informando que nesta data ele comprou. Solução Funções de Agregações Uso do COUNT A função COUNT pode ser usado para contar o número de registros estabelecidos em uma condição GROUP BY. Por exemplo para, contar o número de compras realizadas por cada cliente em um determinado dia. Estudar http://technet.microsoft.com/pt-br/library/ms175997.aspx Soma de valores com SUM A função SUM soma valores numéricos em um conjunto de valores estabelecidos pelo GROUP BY. A tabela Tbvendas tem um campo determinado “”Valor”, que armazena o valor pelo qual o produto foi vendido. Exemplo INNER JOIN com três tabelas Exercício Realize uma consulta onde mostre o nome do cliente os dias em que ele realizou compras, a quantidade de produtos comprados no dia e a soma total das notas do dia. Veja resultado abaixo. Solução Uso do AVG O comando AVG permite calcular a média de valores em um conjunto estabelecido pelo comando GROUP BY. Por exemplo, podemos calcular a média dos valores das notas. Uso do CAST Sintaxe: select cast(SUM(campo) as decimal(7,2)) A cláusula HAVING A cláusula HAVING permite filtrar resultados dos conjuntos agregados pela condição GROUP BY. Criação de VIEWS Uma VIEW é uma tabela criada “virtualmente”, através de uma query, que define seu conteúdo e metadados. A VIEW tem uma série de propósitos, como, por exemplos, fazer com que todos os desenvolvedores utilizem a mesma regra de negócio ao acessar um SET de dados ou, por questões de segurança, limitar o acesso aos objetos propriamente ditos para determinados usuários, delegando a eles acesso apenas às VIEWS. A sintaxe para a criação da VIEW é bastante simples. Basta utilizar o comando CREATE VIEW informando como argumento o nome da VIEW a ser criada, o prefixo AS e a query que definirá a consulta a ser realizada. CREATE VIEW <nome_vista> AS <Instrução SQL>; Exemplo Para criar uma VIEW listando apenas os contatos dos clientes. Consulta a View VWclientesContatos: Consulte: http://www.1keydata.com/pt/sql/sql-create-view.php Criação de TRIGGERS Trigger, traduzindo literalmente do inglês, significa gatilho. No contexto de banco de dados, trigges são procedimentos armazenados, disparados por eventos de atualização, exclusão ou inserção em tabelas do SGBD. (UPDATE, INSERT, DELETE) Exercício Criar uma tabela denominada TBprodutoHistórico, que deve armazenar todas as alterações realizadas na tabela Tbprodutos. Primeiramente vamos criar a tabela TBprodutoHistórico, que deve ter a mesma estrutura da tabela Tbprodutos, com um campo denominado DataAlteracao que vai armazenar a data e hora da operação e um campo TipoAlteracao que vai armazenar um string. Na atualização é preciso diferenciar os valores como estavam antes do UPDATE e como ficaram depois do UPDATE. Solução TRIGGER Cria um gatilho DML, DDL ou de logon. Um gatilho é um tipo especial de procedimento armazenado que é executado automaticamente quando um evento ocorre no servidor de banco de dados. Os gatilhos DML são executados quando um usuário tenta modificar dados através de um evento DML (linguagem de manipulação de dados). Os eventos DML são instruções INSERT, UPDATE ou DELETE em uma tabela ou exibição. Esses gatilhos são disparados quando qualquer evento válido é acionado, independentemente de quaisquer linhas da tabela serem afetadas ou não. Seqüência para Criar uma TRIGGER Quando você for criar um Trigger deverá definir : 1. O nome 2. A Tabela para o qual o Trigger irá ser criado 3. Quando o Trigger deverá ser disparado 4. Os comandos que determinam qual ação o Trigger deverá executar Sintaxe trigger CREATE TRIGGER trigger_name ON { table | view } { [ { IF UPDATE ( column ) [ { AND | OR } UPDATE ( column ) ] [ ...n ] | IF ( COLUMNS_UPDATED ( ) { bitwise_operator } updated_bitmask ) { comparison_operator } column_bitmask [ ...n ] }] sql_statement [ ...n ] } } Exemplo -- SQL Server Syntax Trigger on an INSERT, UPDATE, or DELETE statement to a table or view (DML Trigger) CREATE TRIGGER [ schema_name . ]trigger_name ON { table | view } [ WITH <dml_trigger_option> [ ,...n ] ] { FOR | AFTER | INSTEAD OF } { [ INSERT ] [ , ] [ UPDATE ] [ , ] [ DELETE ] } [ NOT FOR REPLICATION ] AS { sql_statement [ ; ] [ ,...n ] | EXTERNAL NAME <method specifier [ ; ] > } <dml_trigger_option> ::= [ ENCRYPTION ] [ EXECUTE AS Clause ] <method_specifier> := assembly_name.class_name.method_name 1. CREATE TRIGGER [ schema_name . ]trigger_name schema_name : É o nome do esquema ao qual o gatilho DML pertence. Os gatilhos DML são definidos no escopo do esquema da tabela ou na exibição na qual são criados. schema_name não pode ser especificado para gatilhos DDL ou de logon. trigger_name: É o nome do gatilho. Um trigger_name deve estar de acordo com as regras para identificadores, a menos que trigger_name não possa ser iniciado com # ou ##. Exemplo -- SQL Server Syntax Trigger on an INSERT, UPDATE, or DELETE statement to a table or view (DML Trigger) CREATE TRIGGER [ schema_name . ]trigger_name ON { table | view } [ WITH <dml_trigger_option> [ ,...n ] ] { FOR | AFTER | INSTEAD OF } { [ INSERT ] [ , ] [ UPDATE ] [ , ] [ DELETE ] } [ NOT FOR REPLICATION ] AS { sql_statement [ ; ] [ ,...n ] | EXTERNAL NAME <method specifier [ ; ] > } <dml_trigger_option> ::= [ ENCRYPTION ] [ EXECUTE AS Clause ] <method_specifier> := assembly_name.class_name.method_name 2. ON { table | view } [ WITH <dml_trigger_option> [ ,...n ] ] table | view: É a tabela ou exibição na qual o gatilho DML é executado e às vezes referenciado como a tabela de gatilho ou exibição de gatilho. A especificação do nome totalmente qualificado da tabela ou da exibição é opcional Exemplo -- SQL Server Syntax Trigger on an INSERT, UPDATE, or DELETE statement to a table or view (DML Trigger) CREATE TRIGGER [ schema_name . ]trigger_name ON { table | view } [ WITH <dml_trigger_option> [ ,...n ] ] { FOR | AFTER | INSTEAD OF } { [ INSERT ] [ , ] [ UPDATE ] [ , ] [ DELETE ] } [ NOT FOR REPLICATION ] AS { sql_statement [ ; ] [ ,...n ] | EXTERNAL NAME <method specifier [ ; ] > } <dml_trigger_option> ::= [ ENCRYPTION ] [ EXECUTE AS Clause ] <method_specifier> := assembly_name.class_name.method_name 3ª { FOR | AFTER | INSTEAD OF } FOR: deve ser seguido do tipo de comando que acionam o trigger AFTER: determina que o trigger somente será disparado quando todas as rotinas especificadas no comando de disparo forem executadas com sucesso. INSTEAD OF: Determina que o trigger será executado ao invés do comando de disparo do mesmo. Exemplo -- SQL Server Syntax Trigger on an INSERT, UPDATE, or DELETE statement to a table or view (DML Trigger) CREATE TRIGGER [ schema_name . ]trigger_name ON { table | view } [ WITH <dml_trigger_option> [ ,...n ] ] { FOR | AFTER | INSTEAD OF } {[ INSERT] [,] [UPDATE] [,] [DELETE] } [NOT FOR REPLICATION ] AS { sql_statement [ ; ] [ ,...n ] | EXTERNAL NAME <method specifier [ ; ] > } <dml_trigger_option> ::= [ ENCRYPTION ] [ EXECUTE AS Clause ] <method_specifier> := assembly_name.class_name.method_name 4. { [ INSERT ] [ , ] [ UPDATE ] [ , ] [ DELETE ] } [ NOT FOR REPLICATION ] Indicam o tipo de ação que deve disparar o trigger. NOT FOR REPLICATION permite que você especifique que os objetos do banco de dados seguintes, sejam tratados de forma diferente quando um agente de replicação efetuar uma operação: Exemplo -- SQL Server Syntax Trigger on an INSERT, UPDATE, or DELETE statement to a table or view (DML Trigger) CREATE TRIGGER [ schema_name . ]trigger_name ON { table | view } [ WITH <dml_trigger_option> [ ,...n ] ] { FOR | AFTER | INSTEAD OF } { [ INSERT ] [ , ] [ UPDATE ] [ , ] [ DELETE ] } [ NOT FOR REPLICATION ] AS { sql_statement [ ; ] [ ,...n ] | EXTERNAL NAME <method specifier [ ; ] > } <dml_trigger_option> ::= [ ENCRYPTION ] [ EXECUTE AS Clause ] <method_specifier> := assembly_name.class_name.method_name Argumentos schema_name É o nome do esquema ao qual o gatilho DML pertence. Os gatilhos DML são definidos no escopo do esquema da tabela ou na exibição na qual são criados. schema_name não pode ser especificado para gatilhos DDL ou de logon. trigger_name É o nome do gatilho. Um trigger_name deve estar de acordo com as regras para identificadores, a menos que trigger_name não possa ser iniciado com # ou ##. table | view É a tabela ou exibição na qual o gatilho DML é executado e às vezes referenciado como a tabela de gatilho ou exibição de gatilho. A especificação do nome totalmente qualificado da tabela ou da exibição é opcional. Uma exibição só pode ser referenciada por um gatilho INSTEAD OF. Gatilhos DML não podem ser definidos em tabelas temporárias locais ou globais. DATABASE Aplica o escopo de um gatilho DDL ao banco de dados atual. Se for especificado, o gatilho será acionado sempre que event_type ou event_group ocorrer no banco de dados atual. ALL SERVER Aplica o escopo de um gatilho DDL ou de logon ao servidor atual. Se for especificado, o gatilho será acionado sempre que event_type ou event_group ocorrer em qualquer local no servidor atual. WITH ENCRYPTION Ofusca o texto da instrução CREATE TRIGGER. O uso de WITH ENCRYPTION impede que o gatilho seja publicado como parte da replicação do SQL Server. WITH ENCRYPTION não pode ser especificado para gatilhos CLR. EXECUTE ASE especifica o contexto de segurança no qual o gatilho é executado. Permite controlar a conta de usuário que a instância do SQL Server usa para validar permissões em quaisquer objetos do banco de dados referidos pelo gatilho. FOR | AFTER AFTER especifica que o gatilho DML é disparado apenas quando todas as operações especificadas na instrução SQL de gatilho são executadas com êxito. Todas as verificações de restrição e ações referenciais em cascata também devem obter êxito para que este gatilho seja disparado. AFTER é o padrão quando FOR é a única palavra-chave especificada. Gatilhos AFTER não podem ser definidos em exibições. INSTEAD OF Especifica que o gatilho DML será executado em vez da instrução SQL de gatilho, substituindo assim as ações das instruções de gatilho. INSTEAD OF não pode ser especificado para gatilhos DDL ou de logon. No máximo, um gatilho INSTEAD OF por instrução INSERT, UPDATE ou DELETE pode ser definido em uma tabela ou exibição. Entretanto, você pode definir exibições sobre exibições, onde cada uma tem seu próprio gatilho INSTEAD OF. Os gatilhos INSTEAD OF não são permitidos em exibições atualizáveis que usam WITH CHECK OPTION. O SQL Server gera um erro quando um gatilho INSTEAD OF é adicionado a uma WITH CHECK OPTION de exibição atualizável especificado. O usuário deve remover essa opção usando ALTER VIEW antes de definir o gatilho INSTEAD OF. { [ DELETE ] [ , ] [ INSERT ] [ , ] [ UPDATE ] } Especifica as instruções de modificação de dados que, quando tentadas nessa tabela ou exibição, ativam o gatilho DML. É necessário especificar pelo menos uma opção. É permitida qualquer combinação dessas opções em qualquer ordem na definição do gatilho. Para gatilhos INSTEAD OF, a opção DELETE não é permitida em tabelas que tenham um relacionamento referencial que especifique uma ação ON DELETE em cascata. Da mesma maneira, a opção UPDATE não é permitida em tabelas que tenham um relacionamento referencial que especifique uma ação ON UPDATE em cascata. event_type É o nome de um evento da linguagem Transact-SQL que, após a execução, faz com que um gatilho DDL seja acionado. event_group É o nome de um agrupamento predefinido de eventos da linguagem Transact-SQL. O gatilho DDL será acionado após a execução de qualquer evento da linguagem Transact-SQL que pertença ao event_group. Depois da conclusão de ALTER TRIGGER, event_group também atuará como uma macro por meio da adição dos tipos de evento que ele abrange à exibição do catálogo sys.trigger_events. NOT FOR REPLICATION Indica que o gatilho não deve ser executado quando um agente de replicação modificar a tabela envolvida no gatilho. sql_statement São as condições e as ações do gatilho. As condições de gatilho especificam critérios adicionais que determinam se os eventos DML, DDL ou de logon fazem com que as ações de gatilho sejam executadas. As ações de gatilho especificadas nas instruções Transact-SQL entram em vigor quando a operação é tentada. Os gatilhos podem incluir qualquer número e tipo de instruções TransactSQL, com exceções. Para obter mais informações, consulte Comentários. Um gatilho é criado para verificar ou alterar dados com base em uma instrução de definição ou modificação de dados. Ele não deve retornar dados ao usuário. Os gatilhos DML usam as tabelas lógicas (conceituais) deleted e inserted. Eles são estruturalmente semelhantes à tabela na qual o gatilho é definido, ou seja, a tabela na qual a ação do usuário é tentada. As tabelas deleted e inserted contêm os valores antigos ou novos das linhas que podem ser alteradas pela ação do usuário. Consulte http://msdn.microsoft.com/pt-br/library/ms178110.aspx http://technet.microsoft.com/ptbr/library/ms187940.aspx http://www.devmedia.com.br/login-e-permissoespermissoes-no-sql-server-2008-r2/24180 http://msdn.microsoft.com/pt-br/library/ms189799.aspx Criando uma Trigger para armazenar as atualizações Exercício 1. Faça uma atualização na Tbprodutos alterando a descrição do produto ‘Ciência da Computação’ para ‘Bacharel em Ciência da Computação’. 2. Faça uma consulta na TBprodutoHistorico e descreva o resultado obtido. Solução EXERCÍCIO 1. Criar uma tabela denominada TBclienteHistórico, que deve armazenar todas as alterações, inclusões e exclusões realizadas na tabela TBclientes. Primeiramente vamos criar a tabela TBclienteHistórico, que deve ter a mesma estrutura da tabela TBclientes, com um campo denominado DataAlteracao que vai armazenar a data e hora da operação e um campo TipoAlteracao que vai armazenar um string. Na atualização é preciso diferenciar os valores como estavam antes do UPDATE e como ficaram depois do UPDATE. 2. Crie um gatilho para essa função. FIM