Baixe o app para aproveitar ainda mais
Prévia do material em texto
SQL - DML 1 SELECT A estrutura básica de uma consulta em SQL consiste em três cláusulas: SELECT, FROM e WHERE 2 SELECT Corresponde à operação de PROJEÇÃO da álgebra relacional. Ela é usada para listar os atributos desejados como resultado de uma consulta 3 FROM É uma lista de relações a serem varridas na execução da expressão A princípio, para consultas, a utilização do SELECT e FROM são obrigatórios em qualquer consulta 4 WHERE Corresponde ao predicado de seleção da álgebra relacional. Consiste em um predicado envolvendo atributos das relações que aparecem na cláusula FROM. As cláusulas ainda podem ser ainda ser compostas com outras cláusulas utilizando operadores lógicos AND e OR 5 SELECT Seleção de colunas específicas Seleção de todas as colunas 6 SELECT Eliminação de Duplicações Utilização de pseudônimos (alias) 7 WHERE Objetivo: filtrar um conjunto de linhas de uma tabela ou um conjunto delas Operadores: =, <>, <, >, IS NULL, IN, BETWEEN, NOT, LIKE 8 Exemplo 9 1) Quais são os funcionários de Juiz de Fora? 2) Quais são os funcionários que possuem carteira de motorista? 3) Quais são os funcionários do sexo feminino? 4) Quais são os funcionários que o nome começa com a letra M? 5) Quais são os funcionários com idade superior a 40 anos? Exemplo - Respostas 10 Exemplo Conjunção e Disjunção de condições 1) Quais são os funcionários de Juiz de Fora que são do sexo masculino? 2) Quais são os funcionários que tem carteira de habilitação e são do sexo feminino? 3) Quais são os funcionários que recebem mais que R$ 750,00 e possuem mais de 30 anos de idade? 4) Quais são os funcionários do sexo masculino OU funcionários que o nome começa com a letra J? 11 Exemplo - Respostas 12 ORDER BY Objetivo: ordenar o resultado de uma consulta A ordenação é feita pelas colunas indicadas na cláusula ASC Ordenação crescente DESC Ordenação decrescente 13 Exemplo 14 1) Ordene os registros pelo nome de maneira ascendente 2) Ordene os registros pelo código 3) Ordene os registros pela idade de maneira decrescente Exemplo - Respostas 15 JOIN Objetivo: combinar linhas de tabelas diferentes, através de valores comuns em colunas correspondentes (basicamente a ligação ocorre através da chave estrangeira) No JOIN as colunas e os dados de ambas as tabelas que estão envolvidas são trazidas no resultado por isto ele é utilizado. 16 JOIN Como você construiria consultas que respondessem as perguntas abaixo: 1) Quais os nomes dos departamentos que possuem empregados que ganham mais de R$ 1000,00? 2) Qual o nome do funcionário e o nome do departamento que ele trabalha? 3) Qual o preço de cada produto que o cliente Luiz Felipe comprou na nota fiscal número 000456? 4) Quais os nomes dos alunos que obtiveram nota maior que 80 na disciplina DCC060? 17 JOIN O que se percebe na verdade, é que as informações requeridas estão em mais de uma tabela ao mesmo tempo, por isto a necessidade de se fazer a junção de tabelas para retornar os dados necessários. O JOIN mais comum é o INNER JOIN que simplesmente retorna todas as linhas que contém o mesmo valor para o campo que faz a ligação entre as duas tabelas. 18 INNER JOIN Retorna todas as linhas da relação R1 e da relação R2 que possuem o mesmo valor para o campo em que foi feito o JOIN 1) Quais os nomes dos departamentos que possuem empregados que ganham mais que R$ 1000,00? 2) Qual o nome do funcionário e o nome do departamento que ele trabalha? 19 Respostas (1) 20 Respostas (2) 21 LEFT JOIN Primeiramente um INNER JOIN é realizado. Depois, para cada linha da relação R1 que não satisfaz a condição do JOIN, é concatenada ainda as colunas da relação R2 porém com valores nulos. Em outras palavras, traz todos os registros de R1, os que satisfazem o JOIN e os que não satisfazem. 22 LEFT JOIN 1) Retorne tantos os alunos que ingressaram no ano de 2005 que estão matriculados na disciplina DCC060 quanto os que não estão. 2) Retorne tantos os empregados que estão alocados para o projeto ‘GED’ quanto os que não estão. 23 Respostas (1) 24 Respostas (2) 25 Esta consulta já não é tão trivial, pois exige além de um LEFT JOIN um INNER JOIN e a informação que precisa retornar está espalhada entre 3 tabelas diferentes Respostas (2) - Continuação 26 RIGHT JOIN Primeiramente um INNER JOIN é realizado. Depois, para cada linha da relação R2 que não satisfaz a condição do JOIN, é concatenada ainda as colunas da relação R1 porém com valores nulos. Em outras palavras, traz todos os registros de R2, os que satisfazem o JOIN e os que não satisfazem. É o caminho inverso do LEFT JOIN 27 RIGHT JOIN 1) Retorne todos os nomes dos produtos que foram e os que não foram vendidos no dia 01/12/2006. 28 Respostas (1) 29 Respostas (1) - Continuação 30 Funções de Agregação Objetivo: Calcular um determinado valor sobre um conjunto de linhas, como por exemplo, média, valor máximo, mínimo, quantas linhas foram retornadas e etc. Funções mais comuns: COUNT AVG MAX MIN SUM 31 COUNT Retorna a quantidade de linhas do grupo COUNT(*) inclui todas as linhas (mesmo as repetidas caso haja) COUNT(coluna) retorna o número de linhas com valores não nulos da coluna especificada COUNT(DISTINCT coluna) retorna o número de linhas com valores distintos naquela coluna 32 COUNT 1) Quantos são os empregados que trabalham no departamento financeiro? 2) Quantas notas fiscais foram geradas entre 01/11/2006 e 30/11/2006? 3) Quantos departamentos possui a empresa? 4) Quantos alunos estão matriculados na disciplina DCC009 no período letivo 3-2006? 33 Respostas - COUNT 34 MAX Retorna o valor máximo da coluna dentro do grupo 1) Qual o maior salário do departamento Recursos Humanos? 2) Qual o maior salário da empresa? 3) Qual a nota fiscal de maior valor que já foi lançada? 4) Qual foi a maior nota na disciplina DCC060 em toda a história? 35 MAX - Respostas 36 MIN Retorna o valor mínimo da coluna dentro do grupo Qual o menor salário do departamento Recursos Humanos? Qual o menor salário da empresa? Qual a nota fiscal de menor valor que já foi lançada? Qual foi a menor nota na disciplina DCC060 em toda a história? 37 MIN - Respostas 38 SUM Retorna o somatório da coluna dentro do grupo 1) Qual o valor da folha de pagamento do departamento Pessoal? 2) Qual o valor das notas fiscais que foi faturado no dia 01/12/2006? 39 SUM - Respostas 40 AVG Retorna a média da coluna dentro do grupo 1) Qual a média de idade do departamento de Informática? 2) Qual foi o valor médio faturado no mês de novembro pela empresa? 41 AVG – Respostas 42 GROUP BY Agrupar valores vindos de funções de agregação por alguma coluna em especial. Por exemplo, quantos funcionários existem por departamento. Qual a média de idade por departamento. Quanto foi faturado por dia no mês de novembro. Questões como estas são respondidas através das funções de agregação porém utilizando ainda a cláusula GROUP BY 43 GROUP BY Um detalhe que nunca deve ser esquecido, cada coluna que aparecer na cláusula SELECT excetuando-se as funções de agregação devem obrigatoriamente aparecer na cláusula GROUP BY 44 GROUP BY 1)Quantos funcionários existem em cada departamento da empresa? 2) Qual a média de idade dos funcionários por departamento da empresa? 3) Qual foram os valores faturados em cada dia do mês em todo o ano na empresa? 4) Qual foi a média das notas dos alunos em cada disciplina do período letivo 3-2006? 45 GROUP BY - Respostas 46 HAVING Restringir os valores vindos de funções de agregação e cláusulas GROUP BY. 1) Quais são os departamentos que possuem média salarial acima de R$ 2000,00? 2) Quais são as disciplinas onde a média de notas dos alunos no período letivo 3-2006 foi acima de 60? 3) Quais foram os dias que o faturamento ultrapassou o valor de R$ 1000,00 no mês de julho? 47 HAVING – Respostas 48 Inserção, atualização e exclusão em SQL. •49 Inserção de Dados Adicionando tupla/registro à tabela INSERT INTO <tabela> (<lista de atributos>) VALUES (<valores>) INSERT INTO Empregado(Cad, Nome, Sexo, Salario, Num_Dep, Cad_Supv) VALUES (015, ‘José da Silva’, ‘M’, 1000, 1, 020) •50 insert into empregado values (‘Richard’, ‘K’, ‘Marini’, ‘4830672’, ’13-06- 1953’, ’98, Oak Forest, TX’, ’M’, 37000, ‘3468345’, ‘4’); Insira uma tupla, de um novo empregado, para o qual sabe-se apenas os atributos pnome, unome, dno e ssn. insert into empregado(pnome, unome, dno, ssn) values (‘Richard’, ‘Marini’, 4, ‘4830672’); •51 Crie uma tabela que contenha o total de empregados e o total de salários e cada departamento. create table depts_info (dept_nomevarchar(15), no_de_emps integer, total_sal integer); insert into depts_info (dept_nome, no_de_emps, total_sal) select dnome, count (*), sum (salario) from (departamento join empregado on dnumero = dno) group by dnome; •52 Atualização de Dados Atualizando tuplas/registros UPDATE <nome tabela> SET <nome atributo> = valor WHERE <condição> UPDATE Empregado SET Salario = 1500 WHERE Cad = 015 •53 Exemplos de uso do comando update: update projeto set plocalização = ‘Bellaire’, dnum = 5 where pnumero = 10; update empregado set salario = salario * 1,1 where dno in (select dnumero from departamento where dnome = ‘Pesquisa’); •54 Deletando Dados Apagando tuplas/registros da tabela DELETE FROM <tabela> WHERE <condição> DELETE FROM Empregado WHERE Salario > 5000 •55 Exemplos de uso do comando delete: delete from empregado where unome = ‘Brown’; delete from empregado where ssn = ‘1234530’; delete from empregado where dno in (select dnumero from departamento where dnome = ‘Pesquisa’); delete from empregado; •56 SQL •57 Índices Índices é maneira muito comum de melhorar a performance do banco de dados. Um índice permite ao servidor de banco de dados encontrar e retornar linhas específicas mais rapidamente do que sem índices. Mas índices também podem sobrecarregar o sistema de banco de dados, portanto deve ser usado com cuidado •58 Índices Índice primário A chave especifica qual registro possui aquela chave e aponta para este registro Índice secundário Índice cuja chave não pertence a chave primária A entrada aponta para todos os registros que contém aquele valor de chave X •59 Índices Sugestões A coluna é frequentemente utilizada na cláusula where Para as FOREIGN KEYS, pois estão geralmente envolvidas em JOINS Para as PRIMARY KEYS e UNIQUE KEYS normalmente o SGBD cria automaticamente um índice Observações Não é permitida a alteração de índices Normalmente, a decisão de utilizar um índice ou não é do sistema, não do usuário •60 Tipos de Índices A grande maioria dos bancos oferecem pelo menos duas implementações para os índices B-Trees Hashing Onde as B-Trees são mais comumente utilizadas como estruturas que armazenam os índices •61 B-Tree Definição Árvore de busca de ordem N A raiz possui no mínimo 2 filhos Cada folha possui no mínimo (n-1)/2 valores de chave Cada nó interior possui no mínimo n/2 filhos Todos os ramos tem o mesmo comprimento •62 B-Tree •63 B-Tree •64 B-Tree Trabalha com consultas de igualdade ou comparação em dados que podem estar ordenados em qualquer ordem. O otimizados de consultas da maioria dos SGBDs usam o índice B-Tree nos campos onde foram criados quando há um destes operadores: < <= = >= > •65 B-Tree Outras construções que são equivalentes aos operadores lógicos como BETWEEN e IN também fazem uso de índices B-Tree nas consultas realizadas. (Porém, dependendo do SGBD, a comparação IS NULL não é equivalente a = NULL portanto não utilizaria a estrutura de índices B-Tree) •66 B-Tree Consultas que envolvem busca por padrões como o operador LIKE quando o padrão é uma constante e é buscado só como início da string (Ex: nome LIKE ‘Luiz%’) também utiliza do índice para acelerar a consulta. Porém qualquer coisa fora deste padrão não utiliza índices. Ex: nome LIKE ‘%a%’ OR nome LIKE ‘pe%’ •67 Índice Hashing São usados pelo otimizador de consultas somente em condições de igualdade (operador =) Não é muito utilizado pois a princípio é mais lento que os indíces em B-Tree e em alguns bancos de dados, após alguma queda do servidor por exemplo, eles precisam ser reindexados CREATE INDEX name ON table USING hash (column); (PostgreSQL) •68 Índice UNIQUE Índices UNIQUE podem ser utilizados para forçar que uma determinada coluna ou combinação de colunas terão valores únicos assim como a constraint UNIQUE •69 Índice UNIQUE Quando um índice UNIQUE é criado, múltiplas linhas que contenham valores duplicados para a coluna(s) do índice criado não são permitidas. A maioria dos SGBDs como PostgreSQL cria automaticamente índices para chaves primárias e colunas UNIQUE definidas através de constraint por isto é importante definir esta situação por constraint e não criação de índices manualmente pois pode haver duplicação de informação •70 Comando INSERT Adiciona novas linhas a tabela requerida Se as colunas não forem especificadas, o comando assume as colunas na ordem de criação das tabelas devendo assim ser informados tantos valores quantas forem as colunas da tabela •71 Comando INSERT Considere a tabela abaixo: •72 Comando INSERT O comando abaixo está correto? •73 Comando INSERT O comando abaixo está correto? Temos dois problemas, pois estão faltando 2 campos nos VALUES já que não foram especificados as colunas. O banco entende que os dados seriam inseridos na ordem das colunas que foram criadas •74 Comando INSERT O comando abaixo está correto? •75 Comando INSERT O comando abaixo está correto? •76 Comando INSERT Quando omitimos alguma coluna como fizemos comando anterior omitindo a coluna registro e habilitação o SGBD tenta assumir para essas colunas o valor DEFAULT caso ele tenha sido definido OU tenta inserir NULL. Porém, o NULL depende da obrigatoriedade definida ao se criar a tabela, pois se for obrigatória o valor da coluna, o comando não será executado com sucesso •77 Comando INSERT O comando abaixo está correto? •78 Comando INSERT Na maioria dos SGBDs comerciais é possível fazer inserções utilizando como entrada retornos de uma consulta que foi realizada. Alguns bancos aceitam que e em único comando INSERT possam ser inseridos vários dados de uma vez como o PostgreSQL porém isso depende de implementação do SGBD •79 ComandoINSERT •80 Comando UPDATE O objetivo é atualizar um registro ou um conjunto de registros nas colunas indicadas no comando que satisfazem as condições estabelecidas na cláusula WHERE recebendo os novos valores que são passados ou até mesmo valores vindos de outras tabelas. Somente as colunas especificadas no comando são atualizadas •81 Comando UPDATE Table Qual tabela terão registros atualizados Alias Apelido que pode ser utilizado para se referenciar a tabela, porém qualquer campo abaixo vai ser referenciado por alias.nome_campo Column Qual coluna da tabela que terá os valores alterados •82 Comando UPDATE Expression A expressão que será atribuída a coluna. Pode ser uma constante, pode ser o resultado de uma stored procedure desde que ela retorne um resultado compatível com o tipo de dados do campo, pode ser ainda o valor vindo de outro campo de outra tabela e até mesmo o valor do próprio campo sendo usado com alguma operação como operações aritméticas por exemplo Fromlist Assim como nas consultas (SELECTs), no comando UPDATE é possível trazer dados de outras tabelas para um possível join ou satisfazer alguma condição na cláusula WHERE •83 Comando UPDATE Condition Uma expressão que retorna um valor booleano. Somente os registros que atenderem a estas condições são afetados pelo UPDATE •84 Comando UPDATE Pode-se ainda atualizar linhas a partir de outra tabela •85 Comando UPDATE Considere mais uma vez a estrutura •86 Comando UPDATE O que o comando abaixo realiza? •87 Comando UPDATE É preciso sempre verificar atento as condições na cláusula WHERE pois qualquer erro pode representar uma atualização numa quantidade de registros muito grande ou até mesmo em toda a tabela causando um problema de última hora para voltar com as informações no seu estado anterior •88 Comando UPDATE •89 Comando DELETE Comando para excluir as linhas de uma tabela que satisfazem uma condição É importante não confundir DELETE com DROP, o comando DROP destrói toda a estrutura inclusive os dados de uma tabela, enquanto o DELETE manipula dados de uma tabela, porém a estrutura sempre é mantida e nunca é afetada •90 Comando DELETE •91 Sintaxe: Apaga um conjunto de linhas que satisfazem a condição indicada: Apaga todas as linhas da tabela Depto já que nenhuma condição foi indicada: 92 Banco de Dados SQL TRIGGERS (Gatilhos) 93 TRIGGERS (GATILHOS) Uma TRIGGER é um tipo especial de sp que é executado automaticamente em conseqüência de uma modificação (INSERT, UPDATE, DELETE) na tabela na qual a TRIGGER foi configurada. Chama-se disparar a trigger a execução automática da mesma Não podem ser executadas usando EXEC. 94 Uma TRIGGER é sempre associada a uma tabela, porém os comandos que formam a TRIGGER podem acessar dados de outras tabelas. Ex: dadas as tabelas Nota_Fiscal(Num_nota, valor_total) Produto(Cod_Prod, nome, preço, estoque) Nota_Prod(Num_nota, Cod_Prod, quantidade) Pode-se criar uma Trigger para a operação de INSERT na tabela Nota_Prod. Sempre que for inserido um novo item de pedido na tabela Nota_Prod será disparada um Trigger que atualiza o nível de estoque do produto que está sendo vendido 95 Com o uso de TRIGGERs pode-se definir “Regras de Negócio” do BD Representam regras do “mundo real” Ex: Aprovar financiamento maiores que um determinado valor Pode-se usar TRIGGERS para exclusão e atualização em cascata Se o comando que está sendo executado violar a definição de uma CONSTRAINT definida, a TRIGGER não irá disparar 96 NO SQLServer 2000/2005 existem alguns tipos de TRIGGERS: DELETE UPDATE AFTER INSERT INSTEAD OF AFTER: é disparada APÓS todos os comandos de uma TRIGGER associada com um DELETE, UPDATE e INSERT terem sidos executados INSTEAD OF é disparada ANTES dos comandos serem executados. Processa as constraints antes da execução da trigger. 97 O SQLServer 2000/2005 permite especificar TRIGGERs em Views (INSTEAD OF) Nos comandos que definem a TRIGGER pode-se usar a maioria dos comandos SQL, inclusive estruturas IF..ELSE e WHILE. Não são permitidos os seguintes comandos: ALTER DATABASE, CREATE DATABASE, DROP DATABASE, LOAD DATABASE, LOAD LOG, RESTORE DATABASE, RESTORE LOG, RECONFIGURE 98 Os comandos que compõe a TRIGGER tem acesso a duas tabelas especiais: DELETED TABLE INSERTED TABLE Essas tabelas existem apenas na memória do servidor, não sendo gravadas em disco Os registros dessas tabelas são acessíveis somente durante a execução da TRIGGER Para referenciar essas tabelas temporárias dentro da TRIGGER usa-se os nomes DELETED INSERTED 99 A tabela DELETED armazena cópias de registros afetados por um comando DELETE ou UPDATE Armazena os registros antes da alteração A tabela INSERTED armazena cópias dos registros afetados por um comando INSERT ou UPDATE. Os registros na tabela INSERTED são cópias dos novos registros da tabela da tabela que disparou a TRIGGER 100 Sintaxe: CREATE TRIGGER nome_da_trigger ON nome_da_tabela ou nome_da_view [WITH ENCRYPTION] {FOR | AFTER| INSTEAD OF} {[DELETE] [,] [INSERT] [,] [UPDATE]} AS comando 1 comando 2 ..... comando n 101 Exemplo: Criar uma TRIGGER que evite que sejam inseridos novos clientes na tabela CLIENTE (banco de dados LOCADORA) em que o compo UF seja igual a ‘AC’ ou ‘PA’. Essa TRIGGER será criada para a ação INSERT. CREATE TRIGGER TG_Permite_UF ON Cliente FOR INSERT AS IF EXISTS (SELECT * FROM INSERTED WHERE UF_CLI IN ('PA', 'AC')) BEGIN PRINT 'INSERÇÃO DE REGISTRO CANCELADA.' PRINT 'ESTADO (UF) PROIBIDO!!' ROLLBACK END ELSE 102 Crie uma TRIGGER calcule e insera a data de devolução prevista na tabela EMP_DEV sempre que uma fita for emprestada CREATE TRIGGER tg_CALCULA_DATA_DEV_PREV ON EMP_DEV FOR INSERT AS IF EXISTS (SELECT * FROM INSERTED) BEGIN UPDATE EMP_DEV SET DATA_DEV_PREV = DATEADD(DD,1,DATA_EMP) END 103 Crie uma TRIGGER que calcule e insira a data de devolução prevista na tabela EMP_DEV sempre que uma fita for emprestada. Se a fita for de catálogo ela tem dois dias para ser entregue. Lançamentos podem ficar locadas apenas 1 dia. alter table Fita add Tipo_fita varchar (10) Constraint CKTipo_fita check (Tipo_fita in ('catálogo','Lançamento')) DROP TRIGGER tg_CALCULA_DATA_DEV_PREV 104 CREATE TRIGGER tg_CALCULA_DATA_DEV_PREV ON EMP_DEV FOR INSERT AS IF EXISTS (SELECT * FROM INSERTED INNER JOIN FITA ON FITA.COD_FITA = INSERTED.COD_FITA WHERE Tipo_fita = 'catálogo') BEGIN UPDATE EMP_DEV SET DATA_DEV_PREV = DATEADD(DD,2,DATA_EMP) WHERE emp_dev.cod_fita = (select inserted.cod_fita from inserted) END ELSE IF EXISTS (SELECT * FROM INSERTED INNER JOIN FITA ON FITA.COD_FITA = INSERTED.COD_FITA WHERE Tipo_fita = 'Lançamento') BEGIN UPDATE EMP_DEV SET DATA_DEV_PREV = DATEADD(DD,1,DATA_EMP) 105 Crie uma TRIGGER que calcule o valor da multa de um cliente sempre que o mesmo devolver a fita à locadora. Isso significa que toda a vez que o campo “dev_efet” for preenchido (UPDATE) a multa será calculada. CREATE TRIGGER tg_CALCULA_MULTA ON EMP_DEV FOR UPDATE AS IF UPDATE (DATA_DEV_EFET) BEGIN UPDATE EMP_DEV SET multa = 1.5 * DATEDIFF(DD,DATA_DEV_PREV,DATA_DEV_EFET) WHERE DATEDIFF(DD,DATA_DEV_PREV,DATA_DEV_EFET) > 0 END IF UPDATE (DATA_DEV_EFET) BEGIN UPDATE EMP_DEVSET multa = 0 WHERE DATEDIFF(DD,DATA_DEV_PREV,DATA_DEV_EFET) <= 0 END 106 Vamos supor que, por ordem da admistraçao não seja permitido fazer alterações e inserções na tabela Fornecedor. Para garantir esta norma implemente um trigger que dispare em resposta a comandos UPDATE e INSERT na tabela Fornecedor. Esta trigger deve emitir um aviso de que as alterações e inserções foram suspensas e registrar em uma tabela o nome do usuário que tentou fazer a alteração e o nome do fornecedor que tentou-se alterar ou inserir. CREATE TABLE TENTOU_ALTERAR ( FORNECEDOR VARCHAR (50) NOT NULL, USUÁRIO CHAR (30) NOT NULL ) 107 CREATE TRIGGER Tg_NÃO_ALTERAINSERE_FORNECEDOR ON FORNECEDOR FOR INSERT, UPDATE AS -- VARIAVEL QUE SERÁ UTILIZADA NA TRIGGER DECLARE @NOME_FORNECEDOR VARCHAR(50) -- VERIFICA SE FOI FEITA ALGUMA ALTERAÇÃO (INSERT OU UPDATE) IF EXISTS (SELECT * FROM DELETED) BEGIN SET @NOME_FORNECEDOR = (SELECT NOME_FORN FROM DELETED) PRINT 'VC NÃO PODE ALTERAR O REGISTRO DE UM FORNECEDOR' ROLLBACK INSERT INTO TENTOU_ALTERAR VALUES (@NOME_FORNECEDOR, CURRENT_USER) END IF EXISTS (SELECT * FROM INSERTED) BEGIN SET @NOME_FORNECEDOR = (SELECT NOME_FORN FROM INSERTED) 108 Habilitando e Desabilitando Trigger Para desabilitar temporariamente uma trigger: ALTER TABLE Nome_da_Tabela DISABLE TRIGGER Nome_da_Trigger Para habilitar novamente uma trigger: ALTER TABLE Nome_da_Tabela ENABLE TRIGGER Nome_da_Trigger
Compartilhar