none
Duvida - Triggers e Procedures RRS feed

  • Pergunta

  • Olá galera estou desenvolvendo um Banco de Dados no SQl server e preciso de ajuda para eloborar trigger e minhas procedures.
    Meu BD é de um jogo e só salvara imagens do jogo, e pontuações e nome do jogador.
    Vou precisar de uma procedure para inserir os dados do jogador e as imagens, e triggers para atualizar os recordes caso alguém faça uma pontuação superior a outro jogador que ficara disponivel na tabela recordes.

     

    porém algo me diz que estou fazendo errado não tenho expericiencia.

     

    //trigger que substituirá a pontuação do jogador nos melhores recordes

    CREATE TRIGGER PONTUACAO
    ON Recordes
    FOR INSERT
    AS
    BEGIN
        DECLARE
        @pontuacao    nchar(10),
        @nome        nchar(10),
        @ID          INT

        SELECT @ID = ID, @pontuacao = pontuacao FROM INSERTED

        UPDATE Recordes SET pontuacao = pontuacao + @pontuacao
        WHERE ID = @ID
    END
    GO


    //triger que substituirá o nome do jogador nos melhores recordes


    CREATE TRIGGER NOME
    ON Recordes
    FOR INSERT
    AS
    BEGIN
        DECLARE
        @pontuacao    nchar(10),
        @nome        nchar(10),
        @ID          INT

        SELECT @ID = ID, @nome = nome FROM INSERTED

        UPDATE Recordes SET nome = nome + @nome
        WHERE ID = @ID
    END
    GO

    // procedure que passará os dados do jogador na tabelá recordes


    CREATE PROCEDURE Dados_Recordes
        
        @pontuacao    nchar(10),
        @nome        nchar(10),
        @ID           int

    AS


    BEGIN

        INSERT INTO Recordes
        (
            pontuacao,
            nome,    
            ID
        )      
        
        VALUES
        (
            @pontuacao    nchar(10),
            @nome        nchar(10),
            @ID            INT
        )


    //procedure que passará os dados do jogador na tabela do jogador





    CREATE PROCEDURE Dados_Jogador
        
        @pontuacao    nchar(10),
        @nome        nchar(10),


    AS


    BEGIN

        INSERT INTO Recordes
        (
            pontuacao,
            nome_jogador,    
            
        )      
        
        VALUES
        (
            @pontuacao    nchar(10),
            @nome_jogador    nchar(10),
        )

    //procedure que irá passar o img list para o banco de dados


    CREATE PROCEDURE Imagens_cartas
        
        @cartas IMAGE,

    AS


    BEGIN

        INSERT INTO Cartas
        (
            cartas
        )      
        
        VALUES
        (
            @cartas
        )

    END

    segunda-feira, 27 de outubro de 2014 05:27

Respostas

  • Bom dia Matheus,

    Vou colocar as minhas observações:

    • Nas procedures Dados_Recordes e Dados_Jogador você colocou o BEGIN mas não colocou o END;
    • Nessas mesmas procedures você está declarando o tipo da variável nos valores, porém só precisa passar o valor;
    • Na procedure Imagens_cartas você colocou uma vírgula após declarar o único parâmetro, porém dessa forma a procedure não é criada.
    • Nas triggers você está tentando recuperar o @ID do jogador. Para isso, faça (SET @ID = (SELECT...));
    • Na trigger NOME você está concatenando os nomes. É isso mesmo que você quer?
    • Na trigger PONTUACAO, você está concatenando as pontuações. É isso mesmo que você quer?
    • Verifique se os parâmetros são do mesmo tipo que os campos na tabela.

    Abaixo eu fiz as correções que eu falei.

    CREATE TRIGGER PONTUACAO
    ON Recordes
    FOR INSERT
    
    AS
    
    BEGIN
    
        DECLARE
        @pontuacao    nchar(10),
        @nome        nchar(10),
        @ID          INT
    
        SET @ID = (SELECT ID FROM INSERTED)
        SET @pontuacao= (SELECT @pontuacao FROM INSERTED)
    
        UPDATE Recordes SET pontuacao = pontuacao + @pontuacao
        WHERE ID = @ID
    
    END
    
    GO
    CREATE TRIGGER NOME
    ON Recordes
    FOR INSERT
    
    AS
    
    BEGIN
    
        DECLARE
        @pontuacao    nchar(10),
        @nome        nchar(10),
        @ID          INT
    
        SET @ID = (SELECT ID FROM INSERTED)
        SET @nome = (SELECT nome FROM INSERTED)
    
        UPDATE Recordes SET nome = nome + @nome
        WHERE ID = @ID
    
    END
    
    GO
    CREATE PROCEDURE Dados_Recordes
        
        @pontuacao    nchar(10),
        @nome        nchar(10),
        @ID           int
    
    AS
    
    
    BEGIN
    
        INSERT INTO Recordes
        (
            pontuacao,
            nome,    
            ID
        )      
        
        VALUES
        (
            @pontuacao,    
            @nome,        
            @ID          
        )
    END
    CREATE PROCEDURE Dados_Jogador
        
        @pontuacao    nchar(10),
        @nome        nchar(10)
    
    
    AS
    
    
    BEGIN
    
        INSERT INTO Recordes
        (
            pontuacao,
            nome_jogador    
            
        )      
        
        VALUES
        (
            @pontuacao,   
            @nome_jogador    
        )
    END
    CREATE PROCEDURE Imagens_cartas
        
        @cartas IMAGE
    
    AS
    
    
    BEGIN
    
        INSERT INTO Cartas
        (
            cartas
        )      
        
        VALUES
        (
            @cartas
        )
    
    END

    Abs.


    Dicas de programação em .net, C# e SQL - http://smcode.com.br/blog.aspx



    • Editado Bruno Destro segunda-feira, 27 de outubro de 2014 10:03
    • Sugerido como Resposta Deric Ferreira segunda-feira, 27 de outubro de 2014 11:04
    • Marcado como Resposta Matheuskzt segunda-feira, 27 de outubro de 2014 16:33
    segunda-feira, 27 de outubro de 2014 09:58

Todas as Respostas

  • Bom dia Matheus,

    Vou colocar as minhas observações:

    • Nas procedures Dados_Recordes e Dados_Jogador você colocou o BEGIN mas não colocou o END;
    • Nessas mesmas procedures você está declarando o tipo da variável nos valores, porém só precisa passar o valor;
    • Na procedure Imagens_cartas você colocou uma vírgula após declarar o único parâmetro, porém dessa forma a procedure não é criada.
    • Nas triggers você está tentando recuperar o @ID do jogador. Para isso, faça (SET @ID = (SELECT...));
    • Na trigger NOME você está concatenando os nomes. É isso mesmo que você quer?
    • Na trigger PONTUACAO, você está concatenando as pontuações. É isso mesmo que você quer?
    • Verifique se os parâmetros são do mesmo tipo que os campos na tabela.

    Abaixo eu fiz as correções que eu falei.

    CREATE TRIGGER PONTUACAO
    ON Recordes
    FOR INSERT
    
    AS
    
    BEGIN
    
        DECLARE
        @pontuacao    nchar(10),
        @nome        nchar(10),
        @ID          INT
    
        SET @ID = (SELECT ID FROM INSERTED)
        SET @pontuacao= (SELECT @pontuacao FROM INSERTED)
    
        UPDATE Recordes SET pontuacao = pontuacao + @pontuacao
        WHERE ID = @ID
    
    END
    
    GO
    CREATE TRIGGER NOME
    ON Recordes
    FOR INSERT
    
    AS
    
    BEGIN
    
        DECLARE
        @pontuacao    nchar(10),
        @nome        nchar(10),
        @ID          INT
    
        SET @ID = (SELECT ID FROM INSERTED)
        SET @nome = (SELECT nome FROM INSERTED)
    
        UPDATE Recordes SET nome = nome + @nome
        WHERE ID = @ID
    
    END
    
    GO
    CREATE PROCEDURE Dados_Recordes
        
        @pontuacao    nchar(10),
        @nome        nchar(10),
        @ID           int
    
    AS
    
    
    BEGIN
    
        INSERT INTO Recordes
        (
            pontuacao,
            nome,    
            ID
        )      
        
        VALUES
        (
            @pontuacao,    
            @nome,        
            @ID          
        )
    END
    CREATE PROCEDURE Dados_Jogador
        
        @pontuacao    nchar(10),
        @nome        nchar(10)
    
    
    AS
    
    
    BEGIN
    
        INSERT INTO Recordes
        (
            pontuacao,
            nome_jogador    
            
        )      
        
        VALUES
        (
            @pontuacao,   
            @nome_jogador    
        )
    END
    CREATE PROCEDURE Imagens_cartas
        
        @cartas IMAGE
    
    AS
    
    
    BEGIN
    
        INSERT INTO Cartas
        (
            cartas
        )      
        
        VALUES
        (
            @cartas
        )
    
    END

    Abs.


    Dicas de programação em .net, C# e SQL - http://smcode.com.br/blog.aspx



    • Editado Bruno Destro segunda-feira, 27 de outubro de 2014 10:03
    • Sugerido como Resposta Deric Ferreira segunda-feira, 27 de outubro de 2014 11:04
    • Marcado como Resposta Matheuskzt segunda-feira, 27 de outubro de 2014 16:33
    segunda-feira, 27 de outubro de 2014 09:58
  • Olá agradeço a ajuda, porém nas trigger minha intenção é substituir por outra por exemplo, na minha tabela recordes vou armazenar apenas 10 jogadores, e a trigger seria para substituir caso alguém fizesse uma pontuação maior que os 10.
    segunda-feira, 27 de outubro de 2014 15:05
  • o jogo eh on-line? Cuidado com o delay entre os jogadores (lag) devido a performance entre suas consultas.

    Na época que eu montei algo parecido, eu tinha uma rotina que fazia este calculo, mas no caso, tinha uma tabela com somente a pontuacao do jogador e seu nickname, e seria nesta tabela que fazia as alteracoes.

    segunda-feira, 27 de outubro de 2014 16:15
  • o Jogo não é on-line, só quero fazer funcional essa minha "troca" de nomes e pontuações nas triggers.
    segunda-feira, 27 de outubro de 2014 16:58
  • Bom dia Matheus,

    Vou colocar as minhas observações:

    • Nas procedures Dados_Recordes e Dados_Jogador você colocou o BEGIN mas não colocou o END;
    • Nessas mesmas procedures você está declarando o tipo da variável nos valores, porém só precisa passar o valor;
    • Na procedure Imagens_cartas você colocou uma vírgula após declarar o único parâmetro, porém dessa forma a procedure não é criada.
    • Nas triggers você está tentando recuperar o @ID do jogador. Para isso, faça (SET @ID = (SELECT...));
    • Na trigger NOME você está concatenando os nomes. É isso mesmo que você quer?
    • Na trigger PONTUACAO, você está concatenando as pontuações. É isso mesmo que você quer?
    • minha intenção é substituir por outra por exemplo, na minha tabela recordes vou armazenar apenas 10 jogadores, e a trigger seria para substituir caso alguém fizesse uma pontuação maior que os 10.
    • Verifique se os parâmetros são do mesmo tipo que os campos na tabela.

    Abaixo eu fiz as correções que eu falei.

    CREATE TRIGGER PONTUACAO
    ON Recordes
    FOR INSERT
    
    AS
    
    BEGIN
    
        DECLARE
        @pontuacao    nchar(10),
        @nome        nchar(10),
        @ID          INT
    
        SET @ID = (SELECT ID FROM INSERTED)
        SET @pontuacao= (SELECT @pontuacao FROM INSERTED)
    
        UPDATE Recordes SET pontuacao = pontuacao + @pontuacao
        WHERE ID = @ID
    
    END
    
    GO
    CREATE TRIGGER NOME
    ON Recordes
    FOR INSERT
    
    AS
    
    BEGIN
    
        DECLARE
        @pontuacao    nchar(10),
        @nome        nchar(10),
        @ID          INT
    
        SET @ID = (SELECT ID FROM INSERTED)
        SET @nome = (SELECT nome FROM INSERTED)
    
        UPDATE Recordes SET nome = nome + @nome
        WHERE ID = @ID
    
    END
    
    GO
    CREATE PROCEDURE Dados_Recordes
        
        @pontuacao    nchar(10),
        @nome        nchar(10),
        @ID           int
    
    AS
    
    
    BEGIN
    
        INSERT INTO Recordes
        (
            pontuacao,
            nome,    
            ID
        )      
        
        VALUES
        (
            @pontuacao,    
            @nome,        
            @ID          
        )
    END
    CREATE PROCEDURE Dados_Jogador
        
        @pontuacao    nchar(10),
        @nome        nchar(10)
    
    
    AS
    
    
    BEGIN
    
        INSERT INTO Recordes
        (
            pontuacao,
            nome_jogador    
            
        )      
        
        VALUES
        (
            @pontuacao,   
            @nome_jogador    
        )
    END
    CREATE PROCEDURE Imagens_cartas
        
        @cartas IMAGE
    
    AS
    
    
    BEGIN
    
        INSERT INTO Cartas
        (
            cartas
        )      
        
        VALUES
        (
            @cartas
        )
    
    END

    Abs.


    Dicas de programação em .net, C# e SQL - http://smcode.com.br/blog.aspx




    terça-feira, 28 de outubro de 2014 04:47