[Script Info] Title: [Events] Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text Dialogue: 0,0:00:04.93,0:00:08.43,Default,,0000,0000,0000,,Vamos a um outro uso muito \Nimportante das "Triggers", Dialogue: 0,0:00:08.43,0:00:10.23,Default,,0000,0000,0000,,que é para uma função nobre Dialogue: 0,0:00:10.23,0:00:13.24,Default,,0000,0000,0000,,muito utilizada por administradores \Nde banco de dados, Dialogue: 0,0:00:13.24,0:00:15.70,Default,,0000,0000,0000,,a auditoria do que está acontecendo. Dialogue: 0,0:00:15.70,0:00:18.82,Default,,0000,0000,0000,,Então, eu posso criar uma tabela\Nque eu chamo de auditoria, Dialogue: 0,0:00:18.82,0:00:22.92,Default,,0000,0000,0000,,e registrar quando alguém cadastrou \Nalguma coisa, apagou ou removeu, Dialogue: 0,0:00:22.92,0:00:25.79,Default,,0000,0000,0000,,guardando esses dados como \Nbackup, por exemplo, Dialogue: 0,0:00:25.79,0:00:29.74,Default,,0000,0000,0000,,ou simplesmente podemos saber \Nquem é que apagou o que e quando. Dialogue: 0,0:00:29.74,0:00:31.84,Default,,0000,0000,0000,,São informações muito importantes, Dialogue: 0,0:00:31.84,0:00:34.16,Default,,0000,0000,0000,,então, eu posso utilizar \Na "Trigger" para isso. Dialogue: 0,0:00:34.16,0:00:35.05,Default,,0000,0000,0000,,Vamos a um exemplo. Dialogue: 0,0:00:35.05,0:00:37.19,Default,,0000,0000,0000,,Eu tenho um exemplo aqui pronto \Npara nós brincarmos, então. Dialogue: 0,0:00:37.19,0:00:40.86,Default,,0000,0000,0000,,Vou criar tabela de auditoria,\Nportanto, agora no início, Dialogue: 0,0:00:40.86,0:00:43.17,Default,,0000,0000,0000,,essa tabela vai guardar o "codigo" Dialogue: 0,0:00:43.17,0:00:47.30,Default,,0000,0000,0000,,a "hora" que esta ação aconteceu, Dialogue: 0,0:00:47.30,0:00:48.95,Default,,0000,0000,0000,,qual é a "operacao" em si, Dialogue: 0,0:00:48.95,0:00:51.22,Default,,0000,0000,0000,,a antiga informação e a nova. Dialogue: 0,0:00:51.22,0:00:55.32,Default,,0000,0000,0000,,Como eu mencionei, eu poderia\Naté mesmo guardar o usuário que fez isso, Dialogue: 0,0:00:55.32,0:00:57.53,Default,,0000,0000,0000,,mas eu vou manter, então, o exemplo\Nexatamente como estava, Dialogue: 0,0:00:57.53,0:01:00.36,Default,,0000,0000,0000,,vou criar aqui a tabela de auditoria. Dialogue: 0,0:01:00.36,0:01:02.64,Default,,0000,0000,0000,,Muito bem, a tabela criada. Dialogue: 0,0:01:02.64,0:01:06.14,Default,,0000,0000,0000,,E agora eu vou criar uma "PROCEDURE", Dialogue: 0,0:01:06.14,0:01:09.30,Default,,0000,0000,0000,,então, na sequência aqui\Neu vou criar uma "PROCEDURE" Dialogue: 0,0:01:09.30,0:01:12.57,Default,,0000,0000,0000,,para dar uma automatizada nessa operação. Dialogue: 0,0:01:12.57,0:01:16.79,Default,,0000,0000,0000,,E com a "PROCEDURE" eu também posso Dialogue: 0,0:01:16.79,0:01:20.12,Default,,0000,0000,0000,,burlar, de certa maneira, se é que \Nburlar é a palavra correta, Dialogue: 0,0:01:20.12,0:01:24.46,Default,,0000,0000,0000,,mas eu posso com a "PROCEDURE"\Nfazer o "COMMIT" desse "INSERT", Dialogue: 0,0:01:24.46,0:01:27.19,Default,,0000,0000,0000,,eu posso registrar de fato\No que está acontecendo, Dialogue: 0,0:01:27.19,0:01:31.82,Default,,0000,0000,0000,,já que a "TRIGGER" me impede de chamar\Nesse tipo de operação dentro do seu corpo. Dialogue: 0,0:01:31.82,0:01:33.94,Default,,0000,0000,0000,,Então, nós vamos criar \Numa "PROCEDURE" antes Dialogue: 0,0:01:33.94,0:01:37.33,Default,,0000,0000,0000,,que vai registrar a operação \Nna tabela de auditoria, Dialogue: 0,0:01:37.33,0:01:40.43,Default,,0000,0000,0000,,então, eu tenho aqui um "CREATE OR\NREPLACE PROCEDURE registra", Dialogue: 0,0:01:40.43,0:01:43.78,Default,,0000,0000,0000,,"p_codigo, p_operacao, p_antigo, p_novo". Dialogue: 0,0:01:43.78,0:01:47.48,Default,,0000,0000,0000,,Eu tenho até um "PRAGMA\NAUTONOMOUS_TRANSACTION" aqui Dialogue: 0,0:01:47.48,0:01:51.75,Default,,0000,0000,0000,,para que eu tenha certeza que a "TRIGGER" \Nvai poder executar com sucesso. Dialogue: 0,0:01:51.75,0:01:53.48,Default,,0000,0000,0000,,E aqui está a operação em si, Dialogue: 0,0:01:53.48,0:01:57.94,Default,,0000,0000,0000,,"INSERT INTO auditoria", as cinco \Ninformações em si, Dialogue: 0,0:01:57.94,0:02:02.32,Default,,0000,0000,0000,,as quatro delas eu vou passar \Ncomo parâmetro, Dialogue: 0,0:02:02.32,0:02:03.67,Default,,0000,0000,0000,,mas uma delas eu não preciso, Dialogue: 0,0:02:03.67,0:02:05.62,Default,,0000,0000,0000,,uma delas é a data e hora atuais, Dialogue: 0,0:02:05.62,0:02:08.90,Default,,0000,0000,0000,,e aí eu apelo para o "SYSDATE"\Npara me dar essa informação. Dialogue: 0,0:02:08.90,0:02:12.20,Default,,0000,0000,0000,,Então, eu vou criar a "PROCEDURE",\Nvamos lá. Dialogue: 0,0:02:12.20,0:02:17.03,Default,,0000,0000,0000,,Procedimento criado, esse procedimento\Nentão, vai registrar informação, Dialogue: 0,0:02:17.03,0:02:19.54,Default,,0000,0000,0000,,deixa eu trazer o "SET SERVEROUTPUT ON" \Npara baixo. Dialogue: 0,0:02:19.54,0:02:22.23,Default,,0000,0000,0000,,E agora sim eu vou \Nfazer a "TRIGGER". Dialogue: 0,0:02:22.23,0:02:27.12,Default,,0000,0000,0000,,Então, um "CREATE OR REPLACE \NTRIGGER mudancas_salariais", Dialogue: 0,0:02:27.12,0:02:31.96,Default,,0000,0000,0000,,vou chamar sempre antes de "INSERT"\Nou "UPDATE" ou mesmo "DELETE" Dialogue: 0,0:02:31.96,0:02:34.21,Default,,0000,0000,0000,,informações da tabela de empregados, Dialogue: 0,0:02:34.21,0:02:38.01,Default,,0000,0000,0000,,que é uma tabela sensível, tem \Nsalários e tudo mais. Dialogue: 0,0:02:38.01,0:02:40.74,Default,,0000,0000,0000,,E para cada linha que \Neu for fazer uma mudança, Dialogue: 0,0:02:40.74,0:02:42.92,Default,,0000,0000,0000,,eu vou fazer o seguinte procedimento, Dialogue: 0,0:02:42.92,0:02:44.59,Default,,0000,0000,0000,,eu vou fazer uma alternância, Dialogue: 0,0:02:44.59,0:02:46.37,Default,,0000,0000,0000,,então, tem um "CASE" bem aqui, Dialogue: 0,0:02:46.37,0:02:49.24,Default,,0000,0000,0000,,no momento que eu estiver inserindo,\Nentão, o "INSERTING", Dialogue: 0,0:02:49.24,0:02:50.95,Default,,0000,0000,0000,,eu vou chamar o "registra", Dialogue: 0,0:02:50.95,0:02:55.91,Default,,0000,0000,0000,,passando o código do novo funcionário, Dialogue: 0,0:02:55.91,0:02:57.46,Default,,0000,0000,0000,,qual é a ação que eu quero registrar? Dialogue: 0,0:02:57.46,0:02:58.84,Default,,0000,0000,0000,,O "INSERTING". Dialogue: 0,0:02:58.84,0:03:02.02,Default,,0000,0000,0000,,A inserção, o ":OLD.sal" e o ":NEW.sal", Dialogue: 0,0:03:02.02,0:03:05.32,Default,,0000,0000,0000,,embora, como é um "INSERTING",\Neu não tenho o antigo aqui, Dialogue: 0,0:03:05.32,0:03:07.75,Default,,0000,0000,0000,,essa informação vai ficar \Nzerada no final das contas. Dialogue: 0,0:03:07.75,0:03:10.79,Default,,0000,0000,0000,,O "UPDATING", \Ne a única diferença aqui Dialogue: 0,0:03:10.79,0:03:13.66,Default,,0000,0000,0000,,é que eu vou pegar código \Nantigo como referência, Dialogue: 0,0:03:13.66,0:03:17.03,Default,,0000,0000,0000,,e vai ser um "UPDATE"\Ne não uma "INSERT". Dialogue: 0,0:03:17.03,0:03:19.90,Default,,0000,0000,0000,,E no "DELETING", eu tenho \Npraticamente a mesma linha, Dialogue: 0,0:03:19.90,0:03:23.14,Default,,0000,0000,0000,,a diferença é que eu vou registrar \Nque a ação que aconteceu Dialogue: 0,0:03:23.14,0:03:25.77,Default,,0000,0000,0000,,foi uma remoção,\Nfoi apagar. Dialogue: 0,0:03:25.77,0:03:26.87,Default,,0000,0000,0000,,E aqui eu vou executar, Dialogue: 0,0:03:26.87,0:03:30.80,Default,,0000,0000,0000,,portanto, vou criar\Nessa minha "TRIGGER". Dialogue: 0,0:03:30.80,0:03:33.47,Default,,0000,0000,0000,,Muito bem, então eu criei uma "TRIGGER", Dialogue: 0,0:03:33.47,0:03:37.92,Default,,0000,0000,0000,,a grande lógica por trás dessa "TRIGGER"\Né que na verdade é uma "PROCEDURE", Dialogue: 0,0:03:37.92,0:03:40.47,Default,,0000,0000,0000,,e ela está sendo chamada \Naqui no "registra". Dialogue: 0,0:03:40.47,0:03:44.02,Default,,0000,0000,0000,,Então, eu posso, portanto, ter uma\N"TRIGGER" chamando "PROCEDURE", Dialogue: 0,0:03:44.02,0:03:45.22,Default,,0000,0000,0000,,não tem problema nenhum. Dialogue: 0,0:03:45.22,0:03:47.15,Default,,0000,0000,0000,,E agora sim eu vou fazer um teste, Dialogue: 0,0:03:47.15,0:03:50.12,Default,,0000,0000,0000,,então, eu tenho o "SET SERVEROUTPUT ON", Dialogue: 0,0:03:50.12,0:03:54.07,Default,,0000,0000,0000,,embora nesse exemplo ele se torne\Ndesnecessário no final das contas. Dialogue: 0,0:03:54.07,0:03:57.80,Default,,0000,0000,0000,,Eu vou colocar para ter certeza\Nde alterar o formato da data Dialogue: 0,0:03:57.80,0:04:00.57,Default,,0000,0000,0000,,para um formato mais amigável\Naqui no Brasil, Dialogue: 0,0:04:00.57,0:04:04.66,Default,,0000,0000,0000,,então, isso aqui é só para eu poder ter \Na data e hora no formato mais interessante, Dialogue: 0,0:04:04.66,0:04:06.14,Default,,0000,0000,0000,,pronto, alterado. Dialogue: 0,0:04:06.14,0:04:09.11,Default,,0000,0000,0000,,E agora eu vou inserir um \Nnovo funcionário, Dialogue: 0,0:04:09.11,0:04:11.44,Default,,0000,0000,0000,,eu estou inserindo aqui, \Nele vai ser o código "1000", Dialogue: 0,0:04:11.44,0:04:15.35,Default,,0000,0000,0000,,e ele vai ter o salário \Nde R$2780,00 reais. Dialogue: 0,0:04:15.35,0:04:18.89,Default,,0000,0000,0000,,Quando eu clico aqui,\Nrepare que uma linha foi inserida Dialogue: 0,0:04:18.89,0:04:20.83,Default,,0000,0000,0000,,e, além da linha inserida, Dialogue: 0,0:04:20.83,0:04:24.55,Default,,0000,0000,0000,,permita-me mostrar aqui\Na tabela de funcionários Dialogue: 0,0:04:24.55,0:04:29.00,Default,,0000,0000,0000,,com esse novo funcionário,\N"empno=1000". Dialogue: 0,0:04:29.00,0:04:34.44,Default,,0000,0000,0000,,Então, essa pessoa que eu acabei \Nde inserir também aqui, Dialogue: 0,0:04:34.44,0:04:36.49,Default,,0000,0000,0000,,repare que eu não passei \Nas outras informações, Dialogue: 0,0:04:36.49,0:04:39.54,Default,,0000,0000,0000,,eu só tenho o código e o salário\Nno final das contas, Dialogue: 0,0:04:39.54,0:04:42.78,Default,,0000,0000,0000,,que é o que interessa para a minha\N"PROCEDURE" de auditoria. Dialogue: 0,0:04:42.78,0:04:44.35,Default,,0000,0000,0000,,Então, vou dar um \N"SELECT * FROM auditoria", Dialogue: 0,0:04:44.35,0:04:48.02,Default,,0000,0000,0000,,repare que além da inserção \Nna tabela de funcionários, Dialogue: 0,0:04:48.02,0:04:50.87,Default,,0000,0000,0000,,essa linha aqui não existia, Dialogue: 0,0:04:50.87,0:04:52.49,Default,,0000,0000,0000,,ele também deu "INSERT", Dialogue: 0,0:04:52.49,0:04:56.03,Default,,0000,0000,0000,,ele disparou um "INSERT" automático\Nna minha tabela de auditoria. Dialogue: 0,0:04:56.03,0:04:57.13,Default,,0000,0000,0000,,O código "1000", Dialogue: 0,0:04:57.13,0:05:00.97,Default,,0000,0000,0000,,essa data e hora que eu acabei \Nde fazer a função, "INSERT", Dialogue: 0,0:05:00.97,0:05:06.14,Default,,0000,0000,0000,,o antigo salário não existe\Ne o novo salário é "2780". Dialogue: 0,0:05:06.14,0:05:07.31,Default,,0000,0000,0000,,Eu posso fazer um "UPDATE", Dialogue: 0,0:05:07.31,0:05:11.81,Default,,0000,0000,0000,,eu vou, então, atualizar \No salário desse mesmo funcionário. Dialogue: 0,0:05:11.81,0:05:15.28,Default,,0000,0000,0000,,Pronto, linha atualizada. Dialogue: 0,0:05:15.28,0:05:18.22,Default,,0000,0000,0000,,Eu vou olhar agora na \Ntabela de funcionário Dialogue: 0,0:05:18.22,0:05:20.55,Default,,0000,0000,0000,,e repare que eu dobrei \No salário dele. Dialogue: 0,0:05:20.55,0:05:22.17,Default,,0000,0000,0000,,O salário era de R$2.780 reais, Dialogue: 0,0:05:22.17,0:05:26.32,Default,,0000,0000,0000,,se tornou R$5.560 reais\Nagora da mesma pessoa "1000". Dialogue: 0,0:05:26.32,0:05:28.29,Default,,0000,0000,0000,,E agora na tabela de auditoria Dialogue: 0,0:05:28.29,0:05:31.64,Default,,0000,0000,0000,,eu tenho registrado não só o momento \Nque eu inseri o funcionário, Dialogue: 0,0:05:31.64,0:05:36.00,Default,,0000,0000,0000,,mas também o momento com data,\Nhora, minuto, tudo certinho Dialogue: 0,0:05:36.00,0:05:39.87,Default,,0000,0000,0000,,de quando eu mudei o salário dele,\Nquando eu dobrei o salário dele. Dialogue: 0,0:05:39.87,0:05:43.81,Default,,0000,0000,0000,,E pra terminar a demonstração,\Npor que não aproveitar Dialogue: 0,0:05:43.81,0:05:46.61,Default,,0000,0000,0000,,e apagar esse funcionário\Nque eu acabei de criar? Dialogue: 0,0:05:46.61,0:05:51.57,Default,,0000,0000,0000,,Então, um "empno = 1000" Dialogue: 0,0:05:51.57,0:05:56.02,Default,,0000,0000,0000,,e vou apagar esse funcionário,\Nportanto, está apagado. Dialogue: 0,0:05:56.02,0:05:59.19,Default,,0000,0000,0000,,E na tabela aqui no \N"SELECT * FROM auditoria", Dialogue: 0,0:05:59.19,0:06:02.39,Default,,0000,0000,0000,,repare que eu tenho as três \Noperações registradas, Dialogue: 0,0:06:02.39,0:06:04.60,Default,,0000,0000,0000,,o momento que eu inseri o funcionário, Dialogue: 0,0:06:04.60,0:06:06.40,Default,,0000,0000,0000,,o momento que eu atualizei Dialogue: 0,0:06:06.40,0:06:08.07,Default,,0000,0000,0000,,e o momento que eu o removi. Dialogue: 0,0:06:08.07,0:06:10.53,Default,,0000,0000,0000,,Então, eu consigo ter a informação Dialogue: 0,0:06:10.53,0:06:13.54,Default,,0000,0000,0000,,e no código eu consigo saber\Nexatamente quem foi, não é? Dialogue: 0,0:06:13.54,0:06:18.78,Default,,0000,0000,0000,,Então, essas três operações\Naconteceram para o meu empregado "1000". Dialogue: 0,0:06:18.78,0:06:24.48,Default,,0000,0000,0000,,Então, repare como acaba sendo simples\Nde criar uma tabela de auditoria Dialogue: 0,0:06:24.48,0:06:28.92,Default,,0000,0000,0000,,e dentro dessa tabela, portanto,\Neu posso guardar qualquer informação, Dialogue: 0,0:06:28.92,0:06:34.43,Default,,0000,0000,0000,,para depois fazer algum tipo de acareação\Nou saber se alguém apagou por engano, Dialogue: 0,0:06:34.43,0:06:37.53,Default,,0000,0000,0000,,ou deu um aumento de salário \Nque fosse indevido, Dialogue: 0,0:06:37.53,0:06:39.100,Default,,0000,0000,0000,,eu consigo, portanto, ter uma boa visão Dialogue: 0,0:06:39.100,0:06:42.23,Default,,0000,0000,0000,,do que acontece dentro \Ndo meu banco de dados.