(Creating a Stored Procedure Select, insert, delete and update. SQL SERVER)
Olá, webianos!
Hoje vou explicar como criar uma Stored Procedure em SQL SERVER. Sempre de forma resumida e sintetica.
Mas pq usar uma stored procedure?
1. Desempenho. Mais rapido que command sql, pois o procedimento de caminho ficar registrado no BD (Banco de dados). Assim quando vc executar a stored procedure o BD não vai precisar mapear o caminho.
2. Manutenção. Imagine que vc tendo uma SP (stored procedure) que retorne só o campo nome de uma lista de produtos. Ai vc quer colocar o codigo do produto junto com o nome. Se usar uma procedure vc concatena o codigo do produto no nome dele, e pronto, onde exibia o nome agora exibirá codigo + nome.
3. Organização. Se utilizar só SP no seu projeto, os procedimento de dados ficará centralizado no BD e de aplicação na aplicação.
4. Tratamento de dados. Vc poderá fazer o tratamento de dados na camada de BD. Assim sua aplicação fica mais limpa, só chamando o SP. O procedimento de analise, work-flow é feito no próprio BD.
5. Camada BD. Para fazer manutenções não será necessario mexer na aplicação. Só alterar a SP e ja está tudo resolvido.
Existe varias razões para usar SP. É uma prática ja utilizada em grandes softwares.
Chega de blablabla, vamos ao que interessa, como criar uma Stored Procedure.
Vc pode utilizar um SP para fazer um procedimento de Select, Insert, Delete e/ou Update. Isso mesmo, vc pode ter um select e um insert na mesma SP. Vc pode usar “if” e regras de negocio dentro de uma SP.
1. Exemplo Select Simples:
CREATE PROCEDURE minhaSP
AS
BEGIN
SELECT * FROM minhaTabela
END
Observe que “minhaSP” eh o nome que vc cria para a procedure, pode ser qualquer nome, o importante é usar um nome semantico. Por exemplo, uma procedure que faz o login, use o nome “sp_login”, ou “sp_faz_login”.
2. Exemplo Select com parametros:
CREATE PROCEDURE minhaSP
@id int
AS
BEGIN
SELECT * FROM minhaTabela WHERE id=@id
END
3. Exemplo Select multiplos parametros:
CREATE PROCEDURE minhaSP
@cor varchar(100),
@placa varchar(100)
AS
BEGIN
SELECT * FROM Carro WHERE cor=@cor and placa=@placa
END
4. Exemplo Insert multiplos parametros:
CREATE PROCEDURE minhaSP
@cor varchar(100),
@placa varchar(100),
@marca varchar(200)
AS
BEGIN
INSERT INTO carro(marca, placa, cor)
VALUES(@marca,@placa,@cor)
END
5. Exemplo update multiplos parametros:
CREATE PROCEDURE minhaSP
@cor varchar(100),
@placa varchar(100),
@marca varchar(200)
AS
BEGIN
UPDATE carro SET cor=@cor, marca=@marca WHERE placa=@placa
END
6. Exemplo Select e Insert:
CREATE PROCEDURE minhaSP
@placa varchar(100)
AS
BEGIN
SELECT * FROM carro WHERE placa=@placa
INSERT INTO log_placa_pesquisada(placa)
VALUES(@placa)
END
7. Exemplo Select integrado Insert:
CREATE PROCEDURE minhaSP
@id int
AS
BEGIN
declare @placa varchar(100)
SELECT @placa=placa FROM carro WHERE id=@id
INSERT INTO log_placa_pesquisada(placa)
VALUES(@placa)
END
8. Exemplo Delete com parametros:
CREATE PROCEDURE minhaSP
@id int
AS
BEGIN
DELETE minhaTabela WHERE id=@id
END
9. Exemplo Delete com Insert:
CREATE PROCEDURE minhaSP
@id int
AS
BEGIN
DELETE minhaTabela WHERE id=@id
INSERT INTO log_delete(id)
VALUES(@id)
END
10. Exemplo Select Dinâmico: (colaboração de Sandro Lima)
CREATE PROCEDURE [dbo].[minhaSP]
@nome varchar(50),
@dataNascimento datetime,
@email varchar(100)
AS
DECLARE @sql varchar(900)
SET @SQL = ‘select * from tblUsuario where 1=1’
IF (@nome IS NOT NULL)
BEGIN
SET @SQL = @SQL + ‘ AND Nome = ‘+ QUOTENAME(@nome,””)
END
IF (@dataNascimento IS NOT NULL)
BEGIN
set @SQL = @SQL + ‘ AND dataNascimento = ‘ + QUOTENAME(@dataNascimento,””)
END
IF (@email IS NOT NULL)
BEGIN
set @SQL = @SQL + ‘ AND email = ‘ + QUOTENAME(@email,””)
END
exec(@SQL)
Exemplos de uso:
exec minhaSP sandro,null,null
exec minhaSP null,’2008-02-04′,null
exec minhaSP null,null,sandro.lima@asoec.com.br
Bom uso, e se tiver alguma dúvida deixe seu comentario com email para eu responder.
Mestre…
Queria saber se vc etm outros artigos sobre store procedure..
Flavio
Flavio, tudo bem?
Eu não tenho outros artigos falando de store procedure, mas posso fazer. vc tem alguma sugestão de tema?
abraços… valeu pelo comentario.
Maicon
Maicon , eu gostaria de ter um paramentro da procedure A na procedure B , como eu faço isso depois de ja feitas ,e via QuerySql
TENTO EXECUTAR A ULTIMA PROCEDURE E RETORNA ESTAS MENSAGENS DE ERRO.
Msg 156, Level 15, State 1, Procedure minhaSP, Line 7
Incorrect syntax near the keyword ‘select’.
Msg 137, Level 15, State 2, Procedure minhaSP, Line 10
Must declare the scalar variable “@SQL”.
Msg 137, Level 15, State 2, Procedure minhaSP, Line 15
Must declare the scalar variable “@SQL”.
Msg 137, Level 15, State 2, Procedure minhaSP, Line 20
Must declare the scalar variable “@SQL”.
Msg 137, Level 15, State 2, Procedure minhaSP, Line 23
Must declare the scalar variable “@SQL”.
Amigo, tudo bem?… me mande sua procedure pelo comentario.. é erro de sintaxe, talvez “aspas” faltando.
abraços…
OLA!!
TENHO QUE FAZER UM SISTEMA DE LOCADORA, MAIS NÃO CONSIGO CRIAR UMA PROCEDURE DE INSERT, UPDATE E DELETE PARA A TABELA CLIENTE, PEÇO A AJUDA DE VCS.
SOU GRATO PELA ATENÇÃO
Ola, Haniel!
Eu posso te ajudar sim… qual é a sua duvida?
Olá, tem alguma maneira de fazer uma store procedure que me exiba todos os inserts que foram inseridos( das tabelas ) … em forma de comando, como se eu estivesse inserindo, só que eles já foram inseridos … Dessa maneira eu não precisaria ficar inserindo dados no banco toda vez que chega um versão do sistema pra teste, ai só executaria os inserts, seria uma mão na roda, abraço
Ola, Endrigo! tudo bem? vc poderia me explicar com mais detalhes o que realmente vc quiz dizer!? talvez eu posso te ajudar!
COMO POSSO CRIAR UMA SP ONDE DENTRO DO SELECT TENHO UMA SUBQUERY COM TABELA DINAMICA
PRECISO PEGAR O CAMPO ID DO SELECT PARA MONTAR O NOME DA TABELA DO SUBSELECT
ALGUEM JA FEZ ISSO?
CREATE PROCEDURE SP_CTAS_APAGAR_CONTABIL
(
@ID_EMPRESA VARCHAR(3),
@ANO_EXERCICIO VARCHAR(4)
)
AS
BEGIN
SET NOCOUNT ON
DECLARE @_SLD VARCHAR(3)
DECLARE @_ID VARCHAR(3)
DECLARE @TBLSALDO VARCHAR(10)
DECLARE @SQL_SP VARCHAR(1500)
SET @_SLD = ”’SLD”’
SET @_ID = ‘+”ID”+’
SET @TBLSALDO = @_SLD+@_ID+@ANO_EXERCICIO
SET @SQL_SP = ‘
SELECT ID,
(SELECT SUM(INICIAL+DMC01-CMC01+DMC02-CMC02+DMC03-CMC03+DMC04-CMC04+DMC05-CMC05+DMC06-CMC06+DMC07-CMC07+DMC08-CMC08+DMC09-CMC09+DMC10-CMC10+DMC11-CMC11+DMC12-CMC12)
FROM ”’+LTRIM(@TBLSALDO)+”’
WHERE LEFT(CODIGO,5)=”11111” AND LEN(CODIGO)>5) AS SALDO_CAIXA,
(SELECT SUM(INICIAL+DMC01-CMC01+DMC02-CMC02+DMC03-CMC03+DMC04-CMC04+DMC05-CMC05+DMC06-CMC06+DMC07-CMC07+DMC08-CMC08+DMC09-CMC09+DMC10-CMC10+DMC11-CMC11+DMC12-CMC12)
FROM ”’+LTRIM(@TBLSALDO)+”’
WHERE LEFT(CODIGO,5)=”11121” AND LEN(CODIGO)>5) AS SALDO_BANCO ,
(SELECT SUM(INICIAL+DMC01-CMC01+DMC02-CMC02+DMC03-CMC03+DMC04-CMC04+DMC05-CMC05+DMC06-CMC06+DMC07-CMC07+DMC08-CMC08+DMC09-CMC09+DMC10-CMC10+DMC11-CMC11+DMC12-CMC12)
FROM ”’+LTRIM(@TBLSALDO)+”’
WHERE LEFT(CODIGO,5)=”11122” AND LEN(CODIGO)>5) AS SALDO_APLICACAO
FROM CLIENTE
WHERE ID IN (SELECT EMPRESA FROM CLIENTE_GRUPO WHERE GRUPO=”’+@ID_EMPRESA+”’)’
EXECUTE(@SQL_SP)
END
Amigo, eu nunca fiz isso.. mas posso dar um pesquisada pra vc com alguns amigos DBA.
abraços..
Altemir, desde o SQL Server 2005 a Microsoft introduziu um recurso chamado CTE – Common Table Expressions. Dê uma pesquisada nesse assunto, pois irá te ajudar muito nessas chamadas recursivas e subselects.
Segue o link com algumas informações:
http://msdn.microsoft.com/en-us/library/ms190766.aspx
Abraço.
Será que vc poderia me ajudar? não sei se é exatamente isso que estou procurando, mas penso que vc possa me esclarecer..
Bem, eu estou trabalhando em uma firma aqui na suíça e começando minha vida “profissional”, pois ainda não terminei os estudos de informática e por isso estou como estágiaria aqui nessa firma.
Meu conhecimento na área de sql é muito pequeno, sei só o básico dos básicos, e meu chefe pediu pra que eu fizesse algumas mudanças em algumas informações para o cliente, como por exemplo o nr. do produto/artigo para outro.
Coisa bem normal, mas como foram várias tabelas que tinham esse produto/artigo, tive que mudar em todas elas.
Então me deram a sugestão de eu preparar um ‘script’, que eu entendi como procedure, para que eu não precisasse escrever tantas vezes os updates só pra uma tabela.. tudo bem que dessa vez eram só 4 produtos/artigos, mas eram 10 tabelas, ou seja, 40 vezes o update se fossem mais, ficaria um bom tempo fazendo isso.
Por isso ficaria muito grata se vc me ajudasse, pq não tô conseguindo não.
Fico aguardando sua ajuda.
Luara, posso te ajudar sim! me manda um email com mais detalhes do que vc esta fazendo, e do que vc precisa. meu email é webmaicon@gmail.com abraços… e seja bem vinda ao mundo TI
Eu posso usar um parametro para definir um campo na busca? Se sim, como eu faço?
por exemplo:
@Campo varchar(50)
@Texto varchar(50)
select * from TABELA where @campo = @texto
Sim, é possivel. Para isso vc terá que usar o EXEC.
Veja no exemplo “10. Exemplo Select Dinâmico: (colaboração de Sandro Lima)”
Abaixo um exemplo q fiz sem testar. Teste, corrija e nos envie.
CREATE PROCEDURE [dbo].[minhaSP]
@Campo varchar(50),
@Texto varchar(50)
AS
DECLARE @sql varchar(900)
SET @SQL = ‘select * from TABELA where ‘ + @Campo + ‘ = ‘ + @Texto
END
exec(@SQL)
Não tinha pensado nesse modo, desculpe.
Muito obrigado pela ajuda.
Não consegui testar ainda pois não estou com meu note, mas no “olhometro” vai funcionar, só esta faltando uma aspa simples no final do @Texto.
Chegando em casa vou testar e se funcionar eu aviso.
Muito obrigado pelo post e por responder, primeiro blog que o autor responde e é educado.
Não esta faltando aspa simples, olhei correndo, desculpe.
Estou com a seguinte questão:
Em um banco de dados de uma loja virtual existe uma tabela PRODUTOS.
Toda vez que um determinado produto estiver com menos de 5 unidades em estoque,
é desejado que seja inserido na tabela COMPRAS_REPOSICAO um registro com a descrição
do produto para que o dono da loja possa providenciar o aumento do estoque.
A partir dai eu criei a tabela Produtos
create table produtos
(
id int not null unsigner auto_increment,
descricao varchar (50),
quantidade int,
primary key (id)
);
create table compras_reposicao
(
id int not null auto_increment,
produto varchar(50) ,
primary key(id)
);
Criei a Stored Procedure para fazer o que o enunciado pede:
CREATE PROCEDURE `PRODUTO_FALTANDO`()
BEGIN
DECLARE DES VARCHAR(50);
SELECT @DES=DESCRICAO FROM PRODUTOS WHERE QUANTIDADE<5;
INSERT INTO COMPRAS_REPOSICAO (PRODUTO) VALUES(@DES);
END
O código insere um nomo registro na tablea mas no campo produto o valor inserido é null. Só fica o ID que é auto incrementado.
Ola, ismael.
Veja as seguintes dicas:
1. use identificador unico por tabela, ou seja substituia “id” por “id_tabela”. exemplo: id_produtos, id_compras_reposicao
2. na tabela produtos acrescente o campo “quantidade_tipo”, pra representar a “unidade” de medida da quantidade, existe produtos que são “unidades”, “caixas”, “pacotes”.. etc.
3. Altere a tabela “compras_reposicao”, em vez de inserir o “produto”, insira o “id_produtos”. Assim se houver alteração no nome do produto não ficará com dois nomes em duas tabelas. Além disso ajudará na criação de relatorios.
Desculpa perguntar sou nova em TI,
estou com uma duvida simples
na parte da procedure
CREATE PROCEDURE [dbo].[minhaSP]
@nome varchar(50),
@dataNascimento datetime,
@email varchar(100)
AS
DECLARE @sql varchar(900)
SET @SQL = ‘select * from tblUsuario where 1=1′
IF (@nome IS NOT NULL)
BEGIN
SET @SQL = @SQL + ‘ AND Nome = ‘+ QUOTENAME(@nome,””)
END
porque “SET” o que significa o SET nesse caso?
Elisa, boa noite…
“set” significa “setar” ou atribuir.
No caso da linha: SET @SQL = ‘select * from tblUsuario where 1=1′
Você esta dizendo para setar o conteudo da variavel @SQL para ‘select * from tblUsuario where 1=1′
Obrigada
Como criar um Stored procedured como variais tabelas
Boa tarde Prezado,
Pretendo criar uma rotina e gostaria de saber se posso fazer e como fazer com SP.
Preciso que, sempre que gravarem um documento (FA – Fatura) que seja emitito para um destes clinetes (001, 002 e 003) ele me actualiza o campo ‘descricao’ da tabela ‘historico’ com o nome do cliente (descricao). Ou seja, existe uma tabela clientes, mas estes clientes em concreto são clientes diversos e quando se emite uma FA eles alteram o nome do cliente no documento. Mas o nome do cliente na tabela ‘cliente’ permanece, ele grava apenas numa outra tabela ‘cabecdoc’.
Através de uma query consigo manualmente actualizar, mas gostaria de automatizar.
Update Historico Set Descricao=(select nome from CabecDoc where TipoDoc=’FA’ and Serie=’2015′ and NumDoc=’75’)
Where TipoDoc=’FA’ and Serie=’2017′ and NumDoc=’75’
Grato pela atenção
CD
Boa tarde amigo.
Tenho vários bancos de dados BANCO_1(Principal) BANCO_2, _3, _4…(Empresas). Em todos os banco existe uma tabela empresa, quem possuem a mesma estrutura, no BANCO_1 tenho o cadastro de todas as empresa dos BANCO_2, _3, _4…! Gostaria de ao atualizar qualquer informação da Empresa no BANCO_1, os dados fossem atualizado na tabela empresa do BANCO_2 ou _3 ou _4.
Ex.: Atualizei a Empresa Cod 1 no BANCO_1, as informações desta empresa fossem atualizadas no banco dela.
Queria usar uma SP, mais não tenho muito familiaridade com o processo. Estou usando o MySql.
É possível realizar esta ação?
Olá, daniel, bom dia.
Vc precisa criar um trigger de Update na tabela Empresa do BANCO_1, chamando esta sua procedure para fazer a integração/sincronização.
Para acessar os bancos use o prefixo junto com as tabelas, exemplo: update BANCO_2.Empresa SET ….
Bom dia Webmaicon, obrigado por ter respondido, será que poderia me ajudar neste questão.
Consegui fazer editar e empresa, ao editar na Base Principal desta forma:
DELIMITER $$
USE `projects`$$
DROP TRIGGER /*!50032 IF EXISTS */ `empresas_iguais`$$
CREATE
/*!50017 DEFINER = ‘root’@’localhost’ */
TRIGGER `empresas_iguais` AFTER UPDATE ON `cs_empresas`
FOR EACH ROW UPDATE empresaum.cs_empresas
SET empresaum.cs_empresas.empresa_razao_social =
NEW.empresa_razao_social,
empresaum.cs_empresas.empresa_nome_fantasia =
NEW.empresa_nome_fantasia,
empresaum.cs_empresas.empresa_db_host = NEW.empresa_db_host,
empresaum.cs_empresas.empresa_db_user = NEW.empresa_db_user,
empresaum.cs_empresas.empresa_db_password = NEW.empresa_db_password,
empresaum.cs_empresas.empresa_db_nome = NEW.empresa_db_nome,
empresaum.cs_empresas.empresa_tipo = NEW.empresa_tipo,
empresaum.cs_empresas.empresa_cnpj_cpf = NEW.empresa_cnpj_cpf,
empresaum.cs_empresas.empresa_contato = NEW.empresa_contato,
empresaum.cs_empresas.empresa_email = NEW.empresa_email,
empresaum.cs_empresas.empresa_telefone = NEW.empresa_telefone,
empresaum.cs_empresas.empresa_celular = NEW.empresa_celular,
empresaum.cs_empresas.empresa_logo = NEW.empresa_logo,
empresaum.cs_empresas.empresa_registro = NEW.empresa_registro,
empresaum.cs_empresas.empresa_level = NEW.empresa_level,
empresaum.cs_empresas.empresa_status = NEW.empresa_status
WHERE empresaum.cs_empresas.empresa_id = NEW.empresa_id;
$$
DELIMITER;
Onde empresaum É o banco BANCO_1. Como posso colocar este valor empresaum dinâmico, de acordo do a o campo empresa_db_nome que existe no cadastro da empresa na base principal, fazendo assim com que atualize a empresa no banco que ela se encontra cadastrada. Pode dar uma luz? Por favor!
Bom dia Webmaicon, obrigado por ter respondido, será que poderia me ajudar neste questão.
Consegui fazer editar e empresa, ao editar na Base Principal desta forma:
DELIMITER $$
USE `projects`$$
DROP TRIGGER /*!50032 IF EXISTS */ `empresas_iguais`$$
CREATE
/*!50017 DEFINER = ‘root’@’localhost’ */
TRIGGER `empresas_iguais` AFTER UPDATE ON `cs_empresas`
FOR EACH ROW UPDATE empresaum.cs_empresas
SET empresaum.cs_empresas.empresa_razao_social =
NEW.empresa_razao_social,
empresaum.cs_empresas.empresa_nome_fantasia =
NEW.empresa_nome_fantasia,
empresaum.cs_empresas.empresa_db_host = NEW.empresa_db_host,
empresaum.cs_empresas.empresa_db_user = NEW.empresa_db_user,
empresaum.cs_empresas.empresa_db_password = NEW.empresa_db_password,
empresaum.cs_empresas.empresa_db_nome = NEW.empresa_db_nome,
empresaum.cs_empresas.empresa_tipo = NEW.empresa_tipo,
empresaum.cs_empresas.empresa_cnpj_cpf = NEW.empresa_cnpj_cpf,
empresaum.cs_empresas.empresa_contato = NEW.empresa_contato,
empresaum.cs_empresas.empresa_email = NEW.empresa_email,
empresaum.cs_empresas.empresa_telefone = NEW.empresa_telefone,
empresaum.cs_empresas.empresa_celular = NEW.empresa_celular,
empresaum.cs_empresas.empresa_logo = NEW.empresa_logo,
empresaum.cs_empresas.empresa_registro = NEW.empresa_registro,
empresaum.cs_empresas.empresa_level = NEW.empresa_level,
empresaum.cs_empresas.empresa_status = NEW.empresa_status
WHERE empresaum.cs_empresas.empresa_id = NEW.empresa_id;
$$
DELIMITER;
Onde empresaum É o banco BANCO_1. Como posso colocar este valor empresaum dinâmico, de acordo do a o campo empresa_db_nome que existe no cadastro da empresa na base principal, fazendo assim com que atualize a empresa no banco que ela se encontra cadastrada. Pode dar uma luz? Por favor!
Não entendi suas frases, revise ou faça um texto mais legivel.
Desculpe, tentei deixar mais claro agora. E obrigado por estar tentando me ajudar.
USE `projects`$$ ==> (“`projects`” – Aqui tenho todas as Empresa cadastradas é o BANCO_1(Principal)).
FOR EACH ROW UPDATE empresaum.cs_empresas ==>(“empresaum.” – Aqui é o banco da empresa que quero atualizar as informações (Banco da Empresa BANCO_2, ou BANCO_3 ou BANCO_4…)
de acordo com a epresa que for editada no BANCO_1(Principal), nessa trigger o valor está fixo, preciso deixar dinâmico).
De acordo com o campo empresa_db_nome que existe no cadastro da empresa no BANCO_1(Principal), fazendo assim com que atualize a empresa as informações no
Banco da Empresa BANCO_2, ou BANCO_3 ou BANCO_4…) que ela se encontra cadastrada.
Dá para fazer isso?
Quando eu falei texto legivel é pq tem muito erro de digitação, ai não da para entender.
Enfim, pelo que entendi, vc quer saber se tem como fazer o update inteiro com todas as colunas da outra tabela (ou banco). Não tem como, vc precisa especificar cada coluna que terá o upload.
Vc esta executando os comandos update dentro da trigger, minha sugestão enviada é vc criar uma Procedure e chamar ela dentro da Trigger passando os parametros (registro e tabela), assim vc terá em um unico lugar este codigo de update, facilitando a manutenção e reutilização deste Procedure.
Boa noite, estudando maus um pouco e cheguei a este resultado.
DELIMITER $$
CREATE
/*[DEFINER = { user | CURRENT_USER }]*/
TRIGGER `projects`.`empresas_iguais` AFTER UPDATE
ON `projects`.`cs_empresas`
FOR EACH ROW BEGIN
IF ((NEW.empresa_razao_social OLD.empresa_razao_social)
OR(NEW.empresa_nome_fantasia OLD.empresa_nome_fantasia)
OR(NEW.empresa_db_host OLD.empresa_db_host)
OR(NEW.empresa_db_user OLD.empresa_db_user)
OR(NEW.empresa_db_password OLD.empresa_db_password)
OR(NEW.empresa_db_nome OLD.empresa_db_nome)
OR(NEW.empresa_tipo OLD.empresa_tipo)
OR(NEW.empresa_cnpj_cpf OLD.empresa_cnpj_cpf)
OR(NEW.empresa_contat OLD.empresa_contat)
OR(NEW.empresa_email OLD.empresa_email)
OR(NEW.empresa_telefone OLD.empresa_telefone)
OR(NEW.empresa_celular OLD.empresa_celular)
OR(NEW.empresa_logo OLD.empresa_logo)
OR(NEW.empresa_registro OLD.empresa_registro)
OR(NEW.empresa_level OLD.empresa_level)
OR(NEW.empresa_status OLD.empresa_status))
THEN
SET @DB_EMPRESA = (SELECT empresa_db_nome FROM cs_empresas WHERE empresa_id = OLD.empresa_id);
IF @DB_EMPRESA != “”
THEN
SET @DB_EMPRESA.cs_empresas.empresa_razao_social = NEW.empresa_razao_social,
@DB_EMPRESA.cs_empresas.empresa_nome_fantasia = NEW.empresa_nome_fantasia,
@DB_EMPRESA.cs_empresas.empresa_db_host = NEW.empresa_db_host,
@DB_EMPRESA.cs_empresas.empresa_db_user = NEW.empresa_db_user,
@DB_EMPRESA.cs_empresas.empresa_db_password = NEW.empresa_db_password,
@DB_EMPRESA.cs_empresas.empresa_db_nome = NEW.empresa_db_nome,
@DB_EMPRESA.cs_empresas.empresa_tipo = NEW.empresa_tipo,
@DB_EMPRESA.cs_empresas.empresa_cnpj_cpf = NEW.empresa_cnpj_cpf,
@DB_EMPRESA.cs_empresas.empresa_contato = NEW.empresa_contato,
@DB_EMPRESA.cs_empresas.empresa_email = NEW.empresa_email,
@DB_EMPRESA.cs_empresas.empresa_telefone = NEW.empresa_telefone,
@DB_EMPRESA.cs_empresas.empresa_celular = NEW.empresa_celular,
@DB_EMPRESA.cs_empresas.empresa_logo = NEW.empresa_logo,
@DB_EMPRESA.cs_empresas.empresa_registro = NEW.empresa_registro,
@DB_EMPRESA.cs_empresas.empresa_level = NEW.empresa_level,
@DB_EMPRESA.cs_empresas.empresa_status = NEW.empresa_status
WHERE @DB_EMPRESA.cs_empresas.empresa_id = OLD.empresa_id;
END IF;
END IF;
END$$
DELIMITER ;
Porém está me retornando o seguinte erro:
1 queries executed, 0 success, 1 errors, 0 warnings
Query: CREATE TRIGGER `projects`.`empresas_iguais` AFTER UPDATE ON `projects`.`cs_empresas` FOR EACH ROW BEGIN if ((NEW.empresa_razao_s…
Error Code: 1064
You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ‘WHERE @DB_EMPRESA.cs_empresas.empresa_id = OLD.empresa_id;
end if;
‘ at line 42
Execution Time : 0 sec
Transfer Time : 0 sec
Total Time : 0.001 sec
vc não esta seguindo minhas orientações, falei 3x pra criar uma procedure e chamar ela via trigger.
Boa noite. Aminha dúvida é bem “tosca”, mas talvez seja a dúvida de muitos (desculpe a ignorância):
– O que quer dizer 1=1 no final da Stored Procedure?
1=1, true=true, 0=0… não significa nada, ou seja… 1=1 == true/verdadeira. Não é recomendado fazer isso, mas muitos programações que criam suas querys dinamicamente deixa este 1=1 pra facilitar a montagem do WHERE adicionamento os proximos comandos colocando “and” no inicio.
Por exemplo:
SELECT * FROM usuarios WHERE 1=1 [aqui o programador coloca as opcoes de where com “and” no inicio]
Em php:
$query = “SELECT * FROM usuarios WHERE 1=1″;
if ($filtrar==”nome”) {
$query = $query. ‘ and nome like %”.$nome.”%’;
}
Resultando em: SELECT * FROM usuarios WHERE 1=1 and nome like $nome
Se nao tivesse o 1=1, daria erro de sintaxe.
Deu pra entender?