Probar si registro valido (Insert)

05/02/2008 - 15:34 por Pedro Vidal | Informe spam
Hola a todos nuevamente,

Para una situacion muy especial necesito saber si un registro es valido
antes de insertarlo. Hay alguna manera de hacerlo?
Es decir en mi aplicacion tengo un registro lleno con datos necesito
enviarlo al servidore para que el servidor me lo valide a ver si es
'insertable' es decir si cumple todas sus restricciones. Pero no quiero
insertarlo fisicamente todavia.

Se puede hacer?

Mil gracias a todos.

Preguntas similare

Leer las respuestas

#1 Gux (MVP)
05/02/2008 - 16:26 | Informe spam
Aún si el registro cumple con las condiciones, de todas formas usted NO desea
insertarlo?


Gustavo Larriera, Microsoft MVP
https://mvp.support.microsoft.com/profile/gux
Este mensaje se proporciona tal como es, sin garantías de ninguna clase.



"Pedro Vidal" wrote:

Hola a todos nuevamente,

Para una situacion muy especial necesito saber si un registro es valido
antes de insertarlo. Hay alguna manera de hacerlo?
Es decir en mi aplicacion tengo un registro lleno con datos necesito
enviarlo al servidore para que el servidor me lo valide a ver si es
'insertable' es decir si cumple todas sus restricciones. Pero no quiero
insertarlo fisicamente todavia.

Se puede hacer?

Mil gracias a todos.



Respuesta Responder a este mensaje
#2 Alejandro Mesa
05/02/2008 - 17:43 | Informe spam
Pedro Vidal,

Puedes pasar los valores a un procedimiento almacenado, el cual chequeara la
validez. Si es valido lo inserta y si no returna un error.

Tambien puedes usar un disparador (trigger) tipo INSTEAD OF, el cual
chequeara por errores y si todos las filas son validas, entonces hace el
insert.

Yo recomiendo que uses el procedimiento almacenado.

Ejemplo usando trigger.

USE tempdb
GO

CREATE TABLE dbo.t1 (
c1 INT NOT NULL IDENTITY PRIMARY KEY
)
GO

INSERT INTO dbo.t1 DEFAULT VALUES
GO

CREATE TABLE dbo.t2 (
c1 INT NOT NULL REFERENCES dbo.t1(c1),
c2 INT NOT NULL DEFAULT(0) CHECK(c2 >= 0)
)
GO

CREATE TRIGGER tr_t1_IO_Ins ON dbo.t2
INSTEAD OF INSERT
AS
IF EXISTS (
SELECT *
FROM inserted AS i
WHERE NOT EXISTS (SELECT * FROM dbo.t1 AS a WHERE a.c1 = i.c1)
)
BEGIN
ROLLBACK TRANSACTION
RAISERROR('Error por FK constraint.', 16, 1)
RETURN
END

IF EXISTS (
SELECT *
FROM inserted AS i
WHERE i.c2 < 0
)
BEGIN
ROLLBACK TRANSACTION
RAISERROR('Error por CK constraint.', 16, 1)
RETURN
END

INSERT INTO dbo.t2(c1, c2)
SELECT c1, c2
FROM inserted
GO

INSERT INTO dbo.t2(c1) VALUES(2)
GO

INSERT INTO dbo.t2(c1, c2) VALUES(1, -2)
GO

INSERT INTO dbo.t2(c1, c2) VALUES(1, 1)
GO

SELECT *
FROM dbo.t1
GO

SELECT *
FROM dbo.t2
GO

DROP TABLE dbo.t2, dbo.t1
GO


AMB


"Pedro Vidal" wrote:

Hola a todos nuevamente,

Para una situacion muy especial necesito saber si un registro es valido
antes de insertarlo. Hay alguna manera de hacerlo?
Es decir en mi aplicacion tengo un registro lleno con datos necesito
enviarlo al servidore para que el servidor me lo valide a ver si es
'insertable' es decir si cumple todas sus restricciones. Pero no quiero
insertarlo fisicamente todavia.

Se puede hacer?

Mil gracias a todos.



Respuesta Responder a este mensaje
#3 Pedro Vidal
05/02/2008 - 17:50 | Informe spam
Exactamente Gustavo.

Es como hacer el insert y verificar si el server me lo aceptó (no me generó
error) pero luego borrarlo inmediatamente.

Lo que quiero es saber si hay una forma de que no tenga que insertarlo
fisicamente ya que podría ser muy lento. Pensé en begin transaction...
rollback pero como no conozco mucho del tema no sé de si esto sobrecarga el
server innecesariamente tambien.

En resumen : poder saber si el registro es válido pero sin tener que
insertarlo inmediatamanete.


"Gux (MVP)" escribió en el mensaje
news:
Aún si el registro cumple con las condiciones, de todas formas usted NO
desea
insertarlo?


Gustavo Larriera, Microsoft MVP
https://mvp.support.microsoft.com/profile/gux
Este mensaje se proporciona tal como es, sin garantías de ninguna clase.



"Pedro Vidal" wrote:

Hola a todos nuevamente,

Para una situacion muy especial necesito saber si un registro es valido
antes de insertarlo. Hay alguna manera de hacerlo?
Es decir en mi aplicacion tengo un registro lleno con datos necesito
enviarlo al servidore para que el servidor me lo valide a ver si es
'insertable' es decir si cumple todas sus restricciones. Pero no quiero
insertarlo fisicamente todavia.

Se puede hacer?

Mil gracias a todos.



Respuesta Responder a este mensaje
#4 Gux (MVP)
05/02/2008 - 18:40 | Informe spam
Lo que usted puede hacer es como dice: Iniciar una transacción, hacer el
INSERT, verificar el status @@ERROR y finalmente hacer un ROLLBACK para
anular la inserción (y terminar la transacción).

Seré curioso, por qué desea hacer usted eso?

Gustavo Larriera, Microsoft MVP
https://mvp.support.microsoft.com/profile/gux
Este mensaje se proporciona tal como es, sin garantías de ninguna clase.



"Pedro Vidal" wrote:

Exactamente Gustavo.

Es como hacer el insert y verificar si el server me lo aceptó (no me generó
error) pero luego borrarlo inmediatamente.

Lo que quiero es saber si hay una forma de que no tenga que insertarlo
fisicamente ya que podría ser muy lento. Pensé en begin transaction...
rollback pero como no conozco mucho del tema no sé de si esto sobrecarga el
server innecesariamente tambien.

En resumen : poder saber si el registro es válido pero sin tener que
insertarlo inmediatamanete.


"Gux (MVP)" escribió en el mensaje
news:
> Aún si el registro cumple con las condiciones, de todas formas usted NO
> desea
> insertarlo?
>
>
> Gustavo Larriera, Microsoft MVP
> https://mvp.support.microsoft.com/profile/gux
> Este mensaje se proporciona tal como es, sin garantías de ninguna clase.
>
>
>
> "Pedro Vidal" wrote:
>
>> Hola a todos nuevamente,
>>
>> Para una situacion muy especial necesito saber si un registro es valido
>> antes de insertarlo. Hay alguna manera de hacerlo?
>> Es decir en mi aplicacion tengo un registro lleno con datos necesito
>> enviarlo al servidore para que el servidor me lo valide a ver si es
>> 'insertable' es decir si cumple todas sus restricciones. Pero no quiero
>> insertarlo fisicamente todavia.
>>
>> Se puede hacer?
>>
>> Mil gracias a todos.
>>
>>
>>



Respuesta Responder a este mensaje
#5 Pedro Vidal
05/02/2008 - 19:48 | Informe spam

Seré curioso, por qué desea hacer usted eso?




En terminos generales es un modelo conectado en una aplicacion Windows. El
caso de una tabla con muchos campos y muchas restricciones check con
condiciones que envuelven multiples campos mas unas cuantas restricciones
foraneas. Estas condiciones pueden ser cambiadas eventualmente y sin aviso
por el DBA. El registro se llena desde un formulario tambien bastante
grande en una aplicacion cliente pero me exigen que las validaciones
muestren los errores en la aplicacion a medida que se van llenando los
campos uno por uno en unos casos, y en bloques de campos en otros de acuerdo
a la consistencia que tengan entre si. Claro que podria repetir todas las
restricciones en la aplicacion cliente a nivel de codigo pero eso es lo que
se quiere evitar para prevenir las inconsistencias y sobre todo porque el
DBA las puede cambiar sin aviso, es decir se quiere que sea el server que se
encargue de reportar los errores pero no solo al final sino a medida que se
esta digitando. Es como una prevalidación on-line. Los campos se colocarán
en el form en el orden apropiado para que coincida con la precedencia de los
errores que reportare el servidor.
Salvo otros detalles, eso es lo que estamos tratando de hacer, tratando a
ver si es que se puede antes de decirle que no a nuestro cliente.. ya que si
fuera una decision personal nuestra no hicieramos eso asi.

Gracias por su ayuda.


Gustavo Larriera, Microsoft MVP
https://mvp.support.microsoft.com/profile/gux
Este mensaje se proporciona tal como es, sin garantías de ninguna clase.



"Pedro Vidal" wrote:

Exactamente Gustavo.

Es como hacer el insert y verificar si el server me lo aceptó (no me
generó
error) pero luego borrarlo inmediatamente.

Lo que quiero es saber si hay una forma de que no tenga que insertarlo
fisicamente ya que podría ser muy lento. Pensé en begin transaction...
rollback pero como no conozco mucho del tema no sé de si esto sobrecarga
el
server innecesariamente tambien.

En resumen : poder saber si el registro es válido pero sin tener que
insertarlo inmediatamanete.


"Gux (MVP)" escribió en el mensaje
news:
> Aún si el registro cumple con las condiciones, de todas formas usted NO
> desea
> insertarlo?
>
>
> Gustavo Larriera, Microsoft MVP
> https://mvp.support.microsoft.com/profile/gux
> Este mensaje se proporciona tal como es, sin garantías de ninguna
> clase.
>
>
>
> "Pedro Vidal" wrote:
>
>> Hola a todos nuevamente,
>>
>> Para una situacion muy especial necesito saber si un registro es
>> valido
>> antes de insertarlo. Hay alguna manera de hacerlo?
>> Es decir en mi aplicacion tengo un registro lleno con datos necesito
>> enviarlo al servidore para que el servidor me lo valide a ver si es
>> 'insertable' es decir si cumple todas sus restricciones. Pero no
>> quiero
>> insertarlo fisicamente todavia.
>>
>> Se puede hacer?
>>
>> Mil gracias a todos.
>>
>>
>>



email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida