diff --git a/T2/steamdb.rb b/T2/steamdb.rb
index f42c55cff0894be9d58eb764e9d9b31540655adc..54f8ae6dbf3150ff8541b7b9f6dd23acd3723aeb 100644
--- a/T2/steamdb.rb
+++ b/T2/steamdb.rb
@@ -233,37 +233,38 @@ def insere(tabela, args)
   end
 end
 
-def exclui(tabela, args)
-  to_be_deleted = nil
+def select_rows(tabela, args)
+  selected = []
   error = false
   case tabela
   when "developers"
-    to_be_deleted = Developer.all
+    selected = Developer.all
     args.each do |x|
       x = x.split("=")
       case x[0]
       when "id"
         if (is_a_integer(x[1]))
-          to_be_deleted = to_be_deleted.select {|delete| delete.id == x[1].to_i}
+          selected = selected.select {|delete| delete.id == x[1].to_i}
         else 
           puts "Erro de Síntaxe: Valor inválido para #{x[0]}"
           error = true
         end
       when "name"
         if is_a_string(x[1])
-          to_be_deleted = to_be_deleted.select {|delete| delete.name == x[1].tr('"','')}
+          selected = selected.select {|delete| delete.name == x[1].tr('"','')}
         else 
           puts "Erro de Síntaxe: Valor inválido para #{x[0]}"
           error = true
         end
       when "country"
         if is_a_string(x[1])
-          to_be_deleted = to_be_deleted.select {|delete| delete.country == x[1].tr('"','')}
+          selected = selected.select {|delete| delete.country == x[1].tr('"','')}
         else 
           puts "Erro de Síntaxe: Valor inválido para #{x[0]}"
           error = true
         end
       else 
+        puts "foi no select"
         puts "Atributo #{x[0]} não encontrado."
         error = true
       end
@@ -272,48 +273,42 @@ def exclui(tabela, args)
       end 
       next
     end
-    if to_be_deleted.length > 0
-      to_be_deleted.each do |d| 
-        d.destroy
-      end
-      puts "#{to_be_deleted.length} linha(s) deletada(s) da tabela #{tabela}!"
-    end
   when "games"
-    to_be_deleted = Game.all
+    selected = Game.all
     args.each do |x|
       x = x.split("=")
       case x[0]
       when "id"
         if (is_a_integer(x[1]))
-          to_be_deleted = to_be_deleted.select {|delete| delete.id == x[1].to_i}
+          selected = selected.select {|delete| delete.id == x[1].to_i}
         else 
           puts "Erro de Síntaxe: Valor inválido para #{x[0]}"
           error = true
         end
       when "name"
         if is_a_string(x[1])
-          to_be_deleted = to_be_deleted.select {|delete| delete.name == x[1].tr('"','')}
+          selected = selected.select {|delete| delete.name == x[1].tr('"','')}
         else 
           puts "Erro de Síntaxe: Valor inválido para #{x[0]}"
           error = true
         end
       when "description"
         if is_a_string(x[1])
-          to_be_deleted = to_be_deleted.select {|delete| delete.country == x[1].tr('"','')}
+          selected = selected.select {|delete| delete.country == x[1].tr('"','')}
         else 
           puts "Erro de Síntaxe: Valor inválido para #{x[0]}"
           error = true
         end
       when "is_released"
         if x[1] === "true" || x[1] === "false"
-          to_be_deleted = to_be_deleted.select {|delete| (delete.is_released == (x[1] === "true" ? true : false))}
+          selected = selected.select {|delete| (delete.is_released == (x[1] === "true" ? true : false))}
         else 
           puts "Erro de Síntaxe: Valor inválido para #{x[0]}"
           error = true
         end
       when "developer_id"
         if is_a_integer(x[1])
-          to_be_deleted = to_be_deleted.select {|delete| delete.developer_id == x[1].to_i}
+          selected = selected.select {|delete| delete.developer_id == x[1].to_i}
         else 
           puts "Erro de Síntaxe: Valor inválido para #{x[0]}"
           error = true
@@ -327,48 +322,42 @@ def exclui(tabela, args)
       end 
       next
     end
-    if to_be_deleted.length > 0
-      to_be_deleted.each do |d| 
-        d.destroy
-      end
-      puts "#{to_be_deleted.length} linha(s) deletada(s) da tabela #{tabela}!"
-    end
   when "prices"
-    to_be_deleted = Price.all
+    selected = Price.all
     args.each do |x|
       x = x.split("=")
       case x[0]
       when "id"
         if (is_a_integer(x[1]))
-          to_be_deleted = to_be_deleted.select {|delete| delete.id == x[1].to_i}
+          selected = selected.select {|delete| delete.id == x[1].to_i}
         else 
           puts "Erro de Síntaxe: Valor inválido para #{x[0]}"
           error = true
         end  
       when "price_us"
       	if is_a_integer(x[1])
-      	  to_be_deleted = to_be_deleted.select {|delete| delete.price_us == x[1].to_i}
+      	  selected = selected.select {|delete| delete.price_us == x[1].to_i}
       	else 
       	  puts "Erro de Síntaxe: valor inválido para #{x[0]}"
       	  error = true
       	end
       when "price_br"
       	if is_a_integer(x[1])
-      	  to_be_deleted = to_be_deleted.select {|delete| delete.price_br == x[1].to_i}
+      	  selected = selected.select {|delete| delete.price_br == x[1].to_i}
       	else 
       	  puts "Erro de Síntaxe: valor inválido para #{x[0]}"
       	  error = true
       	end
       when "price_ru"
       	if is_a_integer(x[1])
-      	  to_be_deleted = to_be_deleted.select {|delete| delete.price_ru == x[1].to_i}
+      	  selected = selected.select {|delete| delete.price_ru == x[1].to_i}
       	else 
       	  puts "Erro de Síntaxe: valor inválido para #{x[0]}"
       	  error = true
       	end
       when "game_id"
       	if is_a_integer(x[1])
-      	  to_be_deleted = to_be_deleted.select {|delete| delete.game_id == x[1].to_i}
+      	  selected = selected.select {|delete| delete.game_id == x[1].to_i}
       	else 
       	  puts "Erro de Síntaxe: valor inválido para #{x[0]}"
       	  error = true
@@ -382,34 +371,28 @@ def exclui(tabela, args)
       end 
       next
     end
-    if to_be_deleted.length > 0
-      to_be_deleted.each do |d|
-        d.destroy
-      end
-      puts "#{to_be_deleted.length} linha(s) deletada(s) da tabela #{tabela}!"
-    end
   when "categories"
-    to_be_deleted = Category.all
+    selected = Category.all
     args.each do |x|
       x = x.split("=")
       case x[0]
       when "id"
         if (is_a_integer(x[1]))
-          to_be_deleted = to_be_deleted.select {|delete| delete.id == x[1].to_i}
+          selected = selected.select {|delete| delete.id == x[1].to_i}
         else 
           puts "Erro de Síntaxe: Valor inválido para #{x[0]}"
           error = true
         end
       when "name"
         if is_a_string(x[1])
-          to_be_deleted = to_be_deleted.select {|delete| delete.name == x[1].tr('"','')}
+          selected = selected.select {|delete| delete.name == x[1].tr('"','')}
         else 
           puts "Erro de Síntaxe: Valor inválido para #{x[0]}"
           error = true
         end
       when "description"
         if is_a_string(x[1])
-          to_be_deleted = to_be_deleted.select {|delete| delete.name == x[1].tr('"','')}
+          selected = selected.select {|delete| delete.name == x[1].tr('"','')}
         else 
           puts "Erro de Síntaxe: Valor inválido para #{x[0]}"
           error = true
@@ -423,27 +406,21 @@ def exclui(tabela, args)
       end 
       next
     end
-    if to_be_deleted.length > 0
-      to_be_deleted.each do |d|
-        d.destroy
-      end
-      puts "#{to_be_deleted.length} linha(s) deletada(s) da tabela #{tabela}!"
-    end
   when "category_games"
-    to_be_deleted = CategoryGame.all
+    selected = CategoryGame.all
     args.each do |x|
       x = x.split("=")
       case x[0]
       when "category_id"
         if (is_a_integer(x[1]))
-          to_be_deleted = to_be_deleted.select {|delete| delete.category_id == x[1].to_i}
+          selected = selected.select {|delete| delete.category_id == x[1].to_i}
         else 
           puts "Erro de Síntaxe: Valor inválido para #{x[0]}"
           error = true
         end
       when "game_id"
         if (is_a_integer(x[1]))
-          to_be_deleted = to_be_deleted.select {|delete| delete.category_id == x[1].to_i}
+          selected = selected.select {|delete| delete.category_id == x[1].to_i}
         else 
           puts "Erro de Síntaxe: Valor inválido para #{x[0]}"
           error = true
@@ -457,32 +434,228 @@ def exclui(tabela, args)
       end 
       next
     end
-    if to_be_deleted.length > 0
-      to_be_deleted.each do |d|
-        d.destroy
-      end
-      puts "#{to_be_deleted.length} linha(s) deletada(s) da tabela #{tabela}!"
-    end
   else
     puts "Tabela #{tabela} não encontrada."
   end
+  return selected
 end
 
-.select {|alt| alt.name == x[1].tr('"','')}
+def exclui(tabela, args)
+  selected = select_rows(tabela,args)
+  if selected.length > 0
+    selected.each do |d|
+      d.destroy
+    end
+    puts "#{selected.length} linha(s) deletada(s) da tabela #{tabela}!"
+  end
+end
 
 def altera(tabela, args)
   error = false
   case tabela
   when "developers"
-    
+    selected = select_rows(tabela, args[0..0])
+    args[1..args.length-1].each do |x|
+      x = x.split("=")
+      selected.each do |dev|
+        case x[0] 
+        when "name"
+          if is_a_string(x[1])
+            dev.name = x[1].tr('"','');
+          else 
+            puts "Erro de Síntaxe: Valor inválido para #{x[0]}!"
+            error = true
+          end
+        when "country"
+          if is_a_string(x[1])
+            dev.country = x[1].tr('"','')
+          else 
+            puts "Erro de Síntaxe: Valor inválido para #{x[0]}!"
+            error = true
+          end
+        else
+          puts "Atributo #{x[0]} não encontrado."
+          error = true
+        end
+        if error 
+          break
+        else
+          dev.save
+        end
+      end 
+      next
+    end
+    if !error
+      puts "#{selected.length} linha(s) atualizada(s) na tabela #{tabela}!"
+    end
   when "games"
-
+    selected = select_rows(tabela, args[0..0])
+    args[1..args.length-1].each do |x|
+      x = x.split("=")
+      selected.each do |game|
+        case x[0] 
+        when "name"
+          if is_a_string(x[1])
+            game.name = x[1].tr('"','')
+          else 
+            puts "Erro de Síntaxe: Valor inválido para #{x[0]}!"
+            error = true
+          end
+        when "description"
+          if is_a_string(x[1])
+            game.description = x[1].tr('"','')
+          else
+            puts "Erro de Síntaxe: Valor inválido para #{x[0]}!"
+            error = true
+          end         
+        when "is_released"
+          if x[1] === "true" || x[1] === "false"
+            game.is_released = x[1] === "true" ? true : false
+          else 
+            puts "Erro de Síntaxe: Valor inválido para #{x[0]}!"
+            error = true
+          end   
+        when "developer_id"
+          if is_a_integer(x[1]) 
+            game.developer_id = x[1]
+          else 
+            puts "Erro de Síntaxe: Valor inválido para #{x[0]}!"
+            error = true
+          end
+        else
+          puts "Atributo #{x[0]} não encontrado."
+          error = true
+        end
+        if error 
+          break
+        else
+          game.save
+        end
+      end 
+      next
+    end
+    if !error
+      puts "#{selected.length} linha(s) atualizada(s) na tabela #{tabela}!"
+    end
   when "prices"
-
+    selected = select_rows(tabela, args[0..0])
+    args[1..args.length-1].each do |x|
+      x = x.split("=")
+      selected.each do |price|
+        case x[0]
+        when "price_us"
+          if is_a_integer(x[1]) 
+            price.price_us = x[1]
+          else 
+            puts "Erro de Síntaxe: Valor inválido para #{x[0]}!"
+            error = true
+          end
+        when "price_br"
+          if is_a_integer(x[1]) 
+            price.price_br = x[1]
+          else 
+            puts "Erro de Síntaxe: Valor inválido para #{x[0]}!"
+            error = true
+          end
+        when "price_ru"
+          if is_a_integer(x[1]) 
+            price.price_ru = x[1]
+          else 
+            puts "Erro de Síntaxe: Valor inválido para #{x[0]}!"
+            error = true
+          end
+        when "game_id"
+          if is_a_integer(x[1]) 
+            price.game_id = x[1]
+          else 
+            puts "Erro de Síntaxe: Valor inválido para #{x[0]}!"
+            error = true
+          end
+        else 
+          puts "Atributo #{x[0]} não encontrado."
+          error = true
+        end
+        if error 
+          break
+        else
+          price.save
+        end
+      end 
+      next
+    end
+    if !error
+      puts "#{selected.length} linha(s) atualizada(s) na tabela #{tabela}!"
+    end
   when "categories"
-
+    selected = select_rows(tabela, args[0..0])
+    args[1..args.length-1].each do |x|
+      x = x.split("=")
+      selected.each do |category|
+        case x[0] 
+        when "name"
+          if is_a_string(x[1])
+            category.name = x[1].tr('"','')
+          else 
+            puts "Erro de Síntaxe: Valor inválido para #{x[0]}!"
+            error = true
+          end
+        when "description"
+          if is_a_string(x[1])
+            category.description = x[1].tr('"','')
+          else 
+            puts "Erro de Síntaxe: Valor inválido para #{x[0]}!"
+            error = true
+          end
+        else
+          puts "Atributo #{x[0]} não encontrado."
+          error = true
+        end
+        if error 
+          break
+        else
+          category.save
+        end
+      end 
+      next
+    end
+    if !error
+      puts "#{selected.length} linha(s) atualizada(s) na tabela #{tabela}!"
+    end    
   when "category_games"
-
+    selected = select_rows(tabela, args[0..0])
+    args[1..args.length-1].each do |x|
+      x = x.split("=")
+      selected.each do |game|
+        case x[0] 
+        when "category_id"
+          if is_a_integer(x[1])
+            category_game.category_id = x[1];
+          else 
+            puts "Erro de Síntaxe: Valor inválido para #{x[0]}!"
+            error = true
+          end
+        when "game_id"
+          if is_a_integer(x[1])
+            category_game.game_id = x[1]
+          else
+            puts "Erro de Síntaxe: Valor inválido para #{x[0]}!"
+            error = true
+          end
+        else
+          puts "Atributo #{x[0]} não encontrado."
+          error = true
+        end
+        if error 
+          break
+        else
+          category_game.save
+        end
+      end 
+      next
+    end
+    if !error
+      puts "#{selected.length} linha(s) atualizada(s) na tabela #{tabela}!"
+    end    
   else
     puts "Tabela #{tabela} não encontrada."
   end
@@ -532,7 +705,6 @@ puts "Olá! Seja bem vindo ao SteamDB!"
 
 while true do
   args = parse_input(gets.tr("\n",""))
-
   if args.length > 0
     case args[0]
     when "insere"