Recuperar registros borrados en SQL Server 2019

532 views
Skip to first unread message

integral

unread,
Jul 27, 2024, 12:51:44 PM7/27/24
to Comunidad de Visual Foxpro en Español

Que tal Amigos

Anoche realizando unas modificaciones de unos registros de un momento a otro una de las Tablas contenidas en la Base de datos llamada CONSUMOS comenzó a mostrar el siguiente mensaje :
  
 La Tabla esta Vacía

Ingrese a Sql Server 2019 y pude observar que una de las tablas llamada TERMINO esta vacía y no contiene ningún registro.

Existe alguna forma de recuperar registros borrados de una tabla de SQL Server

Agradezco sus comentarios y sugerencias.

Saludos,

Integral

Edwin Duran

unread,
Jul 27, 2024, 2:04:58 PM7/27/24
to Comunidad de Visual Foxpro en Español
Saludos  Integral

hasta donde se no hay forma, lo recomendable es lo backup, incluso antes  de hacer cualquier modificación se debe realizar un backup, hay herramientas gratuitas que hacen bakcup automáticamente. 

integral

unread,
Jul 28, 2024, 12:51:06 PM7/28/24
to Comunidad de Visual Foxpro en Español
Que tal Amigo Edwin :

Gracias por tus comentarios. 

Lo que me causa preocupación es lo fácil que accidentalmente se pueda borrar registros de una tabla contenida en una Base de Datos en SQL Server 2019.

Realmente pensaba que esto no me pasaría utilizando un gestor de Base de Datos. Tenia la idea que eran mas segura...

El ultimo Backup es de hace 5 días. Si restauro el BACKUP va a recuperar los registros de todas las tablas desde hace 5 días. Y ahí esta el detalle
las demás tablas de la Base de Datos CONSUMO tienen posteriores ingresos...

Se podrá restaurar solo la tabla que esta vacía

Seguiré buscando una solución.

Atte.,

Integral

Gerardo Cagnola

unread,
Jul 28, 2024, 12:57:40 PM7/28/24
to publice...@googlegroups.com
calmaaaaaa, cuidadooooo...

VOS sos el responsable si usas DELETE... no la base de datos...
son seguras si utulizas los comandos con responsabilidad
NO podés echarle la culpa por un error tuyo...
TODOS hemos cometido errores y los seguimos cometiendo...


--
Blog de la Comunidad Visual FoxPro en Español http://comunidadvfp.blogspot.com
---
Has recibido este mensaje porque estás suscrito al grupo "Comunidad de Visual Foxpro en Español" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a publicesvfoxp...@googlegroups.com.
Para ver esta conversación en el sitio web, visita https://groups.google.com/d/msgid/publicesvfoxpro/49628f68-e662-432d-b4db-7995b1f27e90n%40googlegroups.com.

Ing. Bernardo José Martínez Pérez

unread,
Jul 28, 2024, 1:52:24 PM7/28/24
to publice...@googlegroups.com
Por eso es recomendable hacer un select antes del delete para verificar si son los registros que queremos borrar.

De: publice...@googlegroups.com <publice...@googlegroups.com> en nombre de Gerardo Cagnola <ggca...@gmail.com>
Enviado: domingo, 28 de julio de 2024 10:57 a. m.
Para: publice...@googlegroups.com <publice...@googlegroups.com>
Asunto: Re: [vfp] Re: Recuperar registros borrados en SQL Server 2019
 

Dsan

unread,
Jul 28, 2024, 2:16:58 PM7/28/24
to publice...@googlegroups.com

Fijo DELETE SIN WHERE

Aun cuando uso la consola de SQL Server Management Studio si esto está en la base de datos de Producción.
inicio transacción reviso todo bien si es asi, a darle con commit o rollback, y ojo con la transacciones y no pegas a los demás usuarios si la dejas una tabla de consulta y no se usa WITH (NOLOCK).

Así es sql server es uno de los motores más seguros, seguido oracle entre los que he trabajado también hay otros sap hana, postgre sql... en el caso de mysql si tienes acceso remoto a las tablas las puedes encriptar borrar etc porque no están ancladas al servicio, cosas que no pasan con sql server.

PD: La magnífica... Respaldar antes de tocar y después a como quedó....

Saludos 

ds


Cristian Novoa

unread,
Jul 28, 2024, 2:53:32 PM7/28/24
to Comunidad de Visual Foxpro en Español
Puedes hacer un trigger para evitar eso, tanto para UPDATE como para DELETE.

Yo lo tengo, pues tengo la info de 9 empresas en la bd, y aunque la problemática es diferente, evito que se hagan operaciones en base de datos distintas.

Esteban Herrero

unread,
Jul 28, 2024, 5:50:05 PM7/28/24
to publice...@googlegroups.com

Algunas consideraciones p hacer:

Los motores SQL son MUY SEGUROS, acá lo q falló fuiste vos en algún Sql en tu programa donde usarte del Delete con un Where mal armado.

La sugerencia q recién te hicieron de hacer un backup antes de trabajar, o hacer la modificación en medio de una transacción o hacer un Select previo de lo q vas a usar en Delete, son opciones correctas, y lo mejor aún es hacer estar pruebas en una DB en prueba, "no en producción".

Lo otro a considerar es si tenes una tabla maestra q tiene registros q están involucrados a otras tablas, lo importante acá es armar una FK (Foreign Key) esto te evitaría al hacer un borrado accidental o con un Where Mal Armado, evitar perder los registros.

Otra cosa: NO EXISTE EN SQL un Recall como en VFP para recuperar registros, si existe un RollBack si la transacción no se cerró con un Comit.

Otro poroto q te sugiero, es si la DB está en un Server, es activar el Backup automático, esto te permite tener siempre el backup del día anterior y te puede salvar. Yo trabajo con FB y todos mis clientes tienen la DB en Linux y x la madrugada todos generan automáticamente el Backup y lo suben a una cuenta de Mega con un programa llamado RClone.

Saludos.

Message has been deleted

Wagner Cevallos

unread,
Jul 30, 2024, 3:54:50 PM7/30/24
to publice...@googlegroups.com
Una alternativa técnica es trabajar con campos bandera o de estado, que correspondan con valores que simulen el estado del registro, ejemplo:

Campo ->.   Estado    Equivalente a
____________________________________
Valor             0              Eliminado o           
                                       Inhabilitado
Valor.            1              Habilitado o 
                                       Activo 


Mario Dal Degan

unread,
Jul 30, 2024, 3:54:50 PM7/30/24
to Comunidad de Visual Foxpro en Español
En mi caso usamos un campo fecha_baja que se evalúa en todos los querys. Cuando el campo está lleno el registro está eliminado.
Simula un Deleted() de VFP.  
Este campo se combina con usuario_baja y permite tener un registro de qué usuario eliminó el registro.

Los querys quedan más o menos así:
Select * from MiTabla Where fecha_baja is null

Espero te sirva en adelante.

integral

unread,
Jul 31, 2024, 12:39:43 AM7/31/24
to Comunidad de Visual Foxpro en Español
Buenas Noches

Agradezco sus comentarios y sugerencias..

Aquí el código que estoy utilizando y que genero el problema...

IF Thisform.CboEstado.Value = "Terminado"                                  && Estado : Consumo / Terminado      
    WAIT WINDOW "Procesando Registro del Producto Terminado..." TIMEOUT 1

    ****************************************************************
    **  INSERTANDO EL REGISTRO EN LA TABLA : TERMINADO  **                                        
    ****************************************************************
    SELECT Cursor_Total_Perecible
         
     cSQL_Fin = " "      
     TEXT TO cSQL_Fin NOSHOW    

           INSERT INTO dbo.Terminado (
              fech_reg, registro, cod_gene, desc_gene, prod_name, ruta_prod, hora_reg, f_produ, dias_trans, estado, cant_pere, lote, precio, fecha_vto, obs_reg
       )   VALUES (
              ?m.fech_reg, ?m.registro, ?m.cod_gene, ?m.desc_gene, ?m.prod_name, ?m.ruta_prod, ?m.hora_reg, ?m.f_produ, ?m.dias_trans, ?m.estado, ?m.cant_pere, ?m.lote, ?m.precio,                         ?m.DatePicker, ?m.obs_reg
       )  

     ENDTEXT

     * Rutina de Validacion del Proceso
      Thisform.Retira()
     
ENDIF    

*--------------------------------------

PROCEDURE Retira
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*  BORRANDO EL REGISTRO DEL PRODUCTO DE LA TABLA : PERECIBLE  *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

DELETE FROM Cursor_Total_Perecible ;
       WHERE ALLTRIM(estado) = 'Terminado'

lnOk = SQLEXEC(cn, "DELETE FROM perecible WHERE RTRIM(estado) = 'Terminado'")
IF lnOK < 0
   WAIT WINDOW '[ El Registro No fue Eliminado... ]' TIMEOUT 1
ELSE
   WAIT WINDOW '[ Borrando el Registro del Producto Terminado... ]' TIMEOUT 1
ENDIF

*---------------------------------------

Lo extraño es que la Tabla donde se eliminaron los registros NO es la tabla donde se utiliza el DELETE FROM
 
Atte-.

Integral

PD : He encontrado un par de programas que ofrecen la recuperacion de los registros, ustedes recomiendan utilizar esos programas.

Dsan

unread,
Jul 31, 2024, 1:19:47 AM7/31/24
to publice...@googlegroups.com
Te comento yo aprendí a la mala, por eso te comento esto, es lo siguiente:

1. Un foxero u otro lenguaje no debemos meternos a interactuar asi por asi con sql server en este caso, no basta solo saber instalarlo e interactuar con SQL Pass-Through.

2. También hay que saber configurarlo tal vez no como DBA, pero sí un nivel básico avanzado dependiendo del alcance de tu app, esto es importantísimo e igual como dar mantenimiento ante inconvenientes con el servidor, disco duro problemas eléctrico donde no se daña la base de datos pero si se te pone en algún momento en modo emergencia por apagón indebidos.

3. Utilizar el Máximo sabiamente los Store Procedure, por aca compartió algo importante Miguel Antúnez y  Cristian Novoa entre otros. tenes un paso adelante si deseas pasar a otro lenguaje nomas vas a ejecutar, esto lleva tiempo pero te ahorras dolores de cabeza; esto se me ejecutan solo  que vaya un parámetro application en la línea EXECUTE tu_Stored_Procedure seguido...

4. En el primer momento que esto ocurrió, yo me hubiese ido al Monitor de actividades y ver que realmente sucedió en 
   Processes, Recent Expensive Queries, en el Activity Monitor, ahi estaria tu respuesta a tu gran pregunta porque y quien no exactamente puede ser esta rutinas, puede ser que tengas delete condicionados por otro lado ahi sale todo, equipo usuario aplicación, claro no se como lo trabajas tú, pero yo creo un usuario por cada acceso, he visto que algunos crean un solo usuario y a darle, pero a mi corta experiencia no es buena práctica.

Saludos

DS
PD:  Te recomiendo estudiar estos temas entre otros, veras que fácil es, solo es invertir tiempo, hay mucha documentación y buenos integrantes en estos grupos, a los cuales les agradezco.



integral

unread,
Jul 31, 2024, 11:24:47 AM7/31/24
to Comunidad de Visual Foxpro en Español
Que tal amigos del Foro

Muy Buenos Días

Gracias amigo Douglas por tus comentarios.

En verdad siempre he tratado de no eliminar registros, venia utilizando la técnica que comenta el colega  wagjavcevmac

Pero esta vez se me dio la idea de borrar un registro cada vez que el producto se termino.

He estado analizando al detalle la rutina y buscando el posible error.

También he buscado información sobre el tema y inclusive encontré un articulo donde explican paso a paso como recuperar los registros
de forma manual...

Menos mal que no se perdió un gran volumen de registros. 

Voy a mejor la rutina y tomar algunos ejemplos del siguiente link que encontré hoy.


Atte.,

Integral

Miguel Antúnez

unread,
Jul 31, 2024, 11:55:03 AM7/31/24
to publice...@googlegroups.com
  Contar con una base de datos de pruebas es indispensable. Antes de implementar cualquier cambio en el entorno productivo, es crucial realizar pruebas exhaustivas. Esto es especialmente importante cuando se trata de comandos peligrosos, como el DELETE, que no se recomienda usar de manera indiscriminada. Si es necesario eliminar registros, es preferible hacerlo de uno en uno utilizando su clave primaria (primary key)

Saludos.  



--

José Antonio Peña Martínez

unread,
Jul 31, 2024, 1:03:12 PM7/31/24
to publice...@googlegroups.com
Aquí es donde casi me da un ataque al corazón :

lnOk = SQLEXEC(cn, "DELETE FROM perecible WHERE RTRIM(estado) = 'Terminado'")

el uso de 
DELETE FROM perecible ... es para eliminar todos los registros de la tabla perecible y 
DELETE perecible WHERE aquí es para eliminar el scope resultante de where ...
Saludos!


Otra practica que a veces aplico, es antes de borrar hacer el dump a un archivo donde se van acumulando los registros borrados .


Pero si esta de miedo ese código

Saludos!
 



--
Desarrollo de Sistemas TecnoPro
José Antonio Peña

Saludos!

Afpsistemas - Fernando Maggi

unread,
Jul 31, 2024, 2:32:43 PM7/31/24
to publice...@googlegroups.com

Hola,

Que interesante tu comentario, en MYSQL uso todo el tiempo el DELETE FROM y ejecuta el where de forma correcta, por ejemplo:

 

"delete from itempre where presupuesto = ?presupuesto.codigo"

 

Saludos,

Fernando.

 

 

De: publice...@googlegroups.com <publice...@googlegroups.com> En nombre de José Antonio Peña Martínez
Enviado el: miércoles, 31 de julio de 2024 14:03
Para: publice...@googlegroups.com
Asunto: Re: [vfp] Re: Recuperar registros borrados en SQL Server 2019

 

Aquí es donde casi me da un ataque al corazón :

Gerardo Cagnola

unread,
Aug 1, 2024, 6:43:04 AM8/1/24
to publice...@googlegroups.com
pero también te puede dar miedo un update sin el correspondiente "where"...

ese "miedo" te puede dar con cualquier base de datos... el where es responsabilidad tuya!!!

José Antonio Peña Martínez

unread,
Aug 1, 2024, 12:44:01 PM8/1/24
to publice...@googlegroups.com
Es correcto... 

Realmente en mis sitemas que desarrollo uso el for each:

For each perecible where ....

end.




José Antonio Peña Martínez

unread,
Aug 1, 2024, 12:46:17 PM8/1/24
to publice...@googlegroups.com
Exacto:

Si, realmente en mis sistemas uso:

For each perecible where.... :
 delete perecible.
end.
para el scope deseado

y cuando quiero "limpiar" uno de mis puntos de venta para usarlo como base en un nuevo cliente

delete from perecible.
y lo repito para todas las tablas para que el sistema quede "limpio"

Saludos!




El jue, 1 ago 2024 a las 4:43, Gerardo Cagnola (<ggca...@gmail.com>) escribió:

Daniel Sánchez

unread,
Aug 1, 2024, 7:43:41 PM8/1/24
to publice...@googlegroups.com
Si tienes un backup crea una nueva bd em blanco y recupera el backup sobre esa base de datos vacia, una vez sube la info a esa nueva bd revisa la tabla en cuestión y haces un

 insert into select * from minuevabd.dbo.mitabla

y eso sí debe estar en el mismo servidor, antes puedes consultar si están los datos deseados.
.
Suerte

--
Blog de la Comunidad Visual FoxPro en Español http://comunidadvfp.blogspot.com
---
Has recibido este mensaje porque estás suscrito al grupo "Comunidad de Visual Foxpro en Español" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a publicesvfoxp...@googlegroups.com.


--
Daniel Sánchez Escobar
Investigación y Desarrollo
Reset Software SAC
Móvil y WhatsApp +051-949398047 / Móvil 948615385
Trujillo - Perú

P  Sugerimos no imprimir este e-mail a menos que sea absolutamente necesario. Protejamos el medio ambiente.

Daniel Sánchez

unread,
Aug 1, 2024, 8:59:01 PM8/1/24
to publice...@googlegroups.com
Para el insert into debes estar en tu base de datos a donde quieres que se pase los registros de la nueva base de datos que creaste con el backup que tenias.

integral

unread,
Aug 3, 2024, 12:22:15 AM8/3/24
to Comunidad de Visual Foxpro en Español

Buenas Noches

Amigo Daniel Sánchez

Tomando en cuenta tu sugerencia. He creado una nueva Bsse de datos en el mismo Servidor e instancia llamado BDCOPIA

Quise Restaurar desde un USB la copia Backup de la Base de Datos BDCONSUMO

Me marca el siguiente error :

Error en la restauración de la base de datos 'BDCOPIA'. (Microsoft.SqlServer.Management.RelationalEngineTasks)

INFORMACIÓN ADICIONAL:

Microsoft.Data.SqlClient.SqlError: El conjunto de copia de seguridad contiene una copia de una base de datos distinta de la existente 'BDCOPIA'

Cual seria la solucion a este problema.

Atte.,

Integral

Angel Dario Rodriguez

unread,
Aug 3, 2024, 9:46:11 AM8/3/24
to publice...@googlegroups.com
Buenas. Para prevenir esos dolorosos accidentes, tengo dos nomras. La primera es que no uso la sentencia DELETE en ningun procedimiento, es decir que no elimino registros, por el contrasrio utilizo en cada tabla un campo varchar(1) llamadao Status_Doc, El valor 'N', significa que se registro esta anulado, el valor 'Z' significa que esta radiado y en los select siempre pide excluir registros cuyo valor sea 'Z' en el campo Status_Doc. Esto me ha resultado maravilloso y nunca he tenido accidentes de eliminacion de registros.

Angel Dario Rodriguez

unread,
Aug 3, 2024, 9:47:31 AM8/3/24
to publice...@googlegroups.com
La segund norma es tener un sevidor aparte con una copia de la base de datos y ahi hago todas las pruebas necesarias y una vez comprobado que todo esta bien, implemento el procedimiento en la base de datos de produccion.

integral

unread,
Aug 3, 2024, 11:36:34 PM8/3/24
to Comunidad de Visual Foxpro en Español

Amigo Daniel Sánchez

Ya logre Restaurar el Backup a la nueva Base de Datos

RESTAURACION CORRECTA.jpg

Ahora falta crear el Insert que copia los registros a la Tabla que esta vacía.

Atte.,

Integral

integral

unread,
Aug 4, 2024, 12:19:45 AM8/4/24
to Comunidad de Visual Foxpro en Español
Buenas Noches Amigos

Estoy creando el siguiente código en el SQl Server 2019 mediante el INSERT para insertar los registros de la tabla Terminado que esta vacía desde la tabla Termina que contiene
los registros recuperados del Backup

Pero me marca error de sintaxis :

INSERT INTO [dbo].[terminado]
           ([fech_reg]
           ,[registro]
           ,[cod_gene]
           ,[desc_gene]
           ,[prod_name]
           ,[ruta_prod]
           ,[hora_reg]
           ,[dias_trans]
           ,[estado]
           ,[cant_pere]
           ,[precio]
           ,[lote]
           ,[f_produ]
           ,[fecha_vto]
           ,[obs_reg])
     SELECT
           (fech_reg,
           registro,
           cod_gene,
           desc_gene,
           prod_name,
           ruta_prod,
           hora_reg,
           dias_trans,
           estado,
           cant_pere,
           precio,
           lote,
           f_produ,
           fecha_vto,
           obs_reg )
     FROM dbo.termina

Agradezco vuestra ayuda

Atte.

Integral

Gabriel Barreto

unread,
Aug 5, 2024, 11:04:10 AM8/5/24
to publice...@googlegroups.com
El error de sintaxis es que en el SELECT la lista de campos NO va entre paréntesis:

Daniel Sánchez

unread,
Aug 5, 2024, 5:14:19 PM8/5/24
to publice...@googlegroups.com
Disculpa recién he revisado los correos estoy de descanso y no lo revise, si me olvide indicar lo que realizaste para poder recuperar la bd.
Como indicas solo faltaria el insert.

Suerte

Daniel Sánchez

unread,
Aug 5, 2024, 5:23:41 PM8/5/24
to publice...@googlegroups.com
En todo caso prueba así

insert into  terminado  select * from aca_va_el_nombre_de_tu_bd.dbo.terminado

debes estar en la base de datos origen.

integral

unread,
Aug 7, 2024, 12:05:27 AM8/7/24
to Comunidad de Visual Foxpro en Español
Buenos Noches amigos del Foro

Colega Daniel Sánchez encontré un link donde explicaban mas de una forma como solución a mi problema.

Una de las soluciones era utilizar el Asistente del SQL Server 2019

Y efectivamente funciono según lo esperado.

ASISTENTE SQL SERVER.jpg

Hasta la próxima.

Atte.,

Integral

integral

unread,
Aug 7, 2024, 5:11:33 PM8/7/24
to Comunidad de Visual Foxpro en Español
Que tal Amigos :

Respondiendo a la consulta que me hicieron de cuales son las otras formas de Copiar los registros de una tabla a otra

Aquí les dejo el siguiente link que me ayudo con la solución.

https://www.sqlshack.com/es/como-copiar-tablas-de-una-base-de-datos-otra-en-sql-server/

Aprovecho también para responder al colega que me escribió preguntándome como corregir el problema para restaurar la tabla. 

La solución al encontré viendo el siguiente video sobre como Restaurar una Tabla en SQL Server 2019


Con  ello doy por concluido el tema.

Saludos,

Integral
Reply all
Reply to author
Forward
0 new messages