Hacer INSERT a traves de una VIEW

03/09/2007 - 12:40 por Keyhelp | Informe spam
Hola a todos:

Tengo entendido que se puede hacer Insert a traves de una vista (view) pero
tiene sus restricciones.

Tenemos una tabla que uno de sus campos es un sumatorio de unos valores de
otra tabla. Vamos a sustituir esta tabla por una vista que apunte a una
segunda tabla, pero el campo de sumatorio será una función que hace la suma.
Para no cambiar en muchos sitios donde se graba este tabla en nuestra
aplicación, habiamos pensado en hacer una vista con el mismo nombre de la
tabla que tenia antes pero que el campo que era el sumatorio sea una llamada
a la funcion.

TABLA_ANTERIOR
campo1
campo2
campo3 > este es un valor que calculamos antes

TABLA_NUEVA
campo1
campo2

VISTA = TABLA_ANTERIOR
campo1
campo2
fn_suma_campo3 as campo3

Si hago un INSERT sobre TABLA_ANTERIOR me dá un error diciendo que no puede
hacer un insert pues tiene un campo constante.

¿Existe alguna forma de poder hacerlo? ¿Hay que definir la vista de alguna
forma?
Siempre será sobre una sola tabla

Gracias por adelantado.

Francisco López
Dpt. Desarrollo
Keyhelp, S.L.

http://www.keyhelp.net

Preguntas similare

Leer las respuestas

#1 Miguel Egea
03/09/2007 - 14:17 | Informe spam
¿por que no nos pasas la definición de las tablas y la vista tal y como la
tienes, así te damos la solución exacta.

"Keyhelp" wrote in message
news:
Hola a todos:

Tengo entendido que se puede hacer Insert a traves de una vista (view)
pero tiene sus restricciones.

Tenemos una tabla que uno de sus campos es un sumatorio de unos valores de
otra tabla. Vamos a sustituir esta tabla por una vista que apunte a una
segunda tabla, pero el campo de sumatorio será una función que hace la
suma.
Para no cambiar en muchos sitios donde se graba este tabla en nuestra
aplicación, habiamos pensado en hacer una vista con el mismo nombre de la
tabla que tenia antes pero que el campo que era el sumatorio sea una
llamada a la funcion.

TABLA_ANTERIOR
campo1
campo2
campo3 > este es un valor que calculamos antes

TABLA_NUEVA
campo1
campo2

VISTA = TABLA_ANTERIOR
campo1
campo2
fn_suma_campo3 as campo3

Si hago un INSERT sobre TABLA_ANTERIOR me dá un error diciendo que no
puede hacer un insert pues tiene un campo constante.

¿Existe alguna forma de poder hacerlo? ¿Hay que definir la vista de alguna
forma?
Siempre será sobre una sola tabla

Gracias por adelantado.

Francisco López
Dpt. Desarrollo
Keyhelp, S.L.

http://www.keyhelp.net

Respuesta Responder a este mensaje
#2 Keyhelp
04/09/2007 - 08:17 | Informe spam
drop table kurro_prueba_tabla
go
create table kurro_prueba_tabla(
campo1 varchar(4) not null default(space(1)),
campo2 numeric(10) null default(0),
campo3 datetime null default (1/1/1900),
constraint pk_kurro_prueba_tabla primary key(campo1))
go

drop function fn_kurro_dato
go
create function fn_kurro_dato(@numero numeric(10))
returns varchar(15)
as
begin
declare @retorno varchar(15)

select @retorno = case @numero
when 0 then 'Es cero'
when 1 then 'Es un uno'
else 'Otro número'
end

return @retorno
end
go

drop view kurro_prueba
go
create view kurro_prueba(campo1, campo2, campo3, texto)
as select campo1, campo2, campo3, dbo.fn_kurro_dato(campo2) from
kurro_prueba_tabla
go

Este es el script de pruebas que he realizado. El mensaje de error que me
devuelve cuando ejecuta la sentencia de insert en la view

insert into kurro_prueba values('aaa',2,'2007-04-05','')

Server: Msg 4406, Level 16, State 1, Line 1
Update or insert of view or function 'kurro_prueba' failed because it
contains a derived or constant field.

Tambien he probado pasando null al último argumento de insert, que es el que
corresponde a la función.

"Miguel Egea" escribió en el mensaje
news:
¿por que no nos pasas la definición de las tablas y la vista tal y como la
tienes, así te damos la solución exacta.

"Keyhelp" wrote in message
news:
Hola a todos:

Tengo entendido que se puede hacer Insert a traves de una vista (view)
pero tiene sus restricciones.

Tenemos una tabla que uno de sus campos es un sumatorio de unos valores
de otra tabla. Vamos a sustituir esta tabla por una vista que apunte a
una segunda tabla, pero el campo de sumatorio será una función que hace
la suma.
Para no cambiar en muchos sitios donde se graba este tabla en nuestra
aplicación, habiamos pensado en hacer una vista con el mismo nombre de la
tabla que tenia antes pero que el campo que era el sumatorio sea una
llamada a la funcion.

TABLA_ANTERIOR
campo1
campo2
campo3 > este es un valor que calculamos antes

TABLA_NUEVA
campo1
campo2

VISTA = TABLA_ANTERIOR
campo1
campo2
fn_suma_campo3 as campo3

Si hago un INSERT sobre TABLA_ANTERIOR me dá un error diciendo que no
puede hacer un insert pues tiene un campo constante.

¿Existe alguna forma de poder hacerlo? ¿Hay que definir la vista de
alguna forma?
Siempre será sobre una sola tabla

Gracias por adelantado.

Francisco López
Dpt. Desarrollo
Keyhelp, S.L.

http://www.keyhelp.net




Respuesta Responder a este mensaje
#3 Carlos Sacristan
04/09/2007 - 10:31 | Informe spam
Es que no puedes asignarle un valor al campo "texto" de la vista porque
es calculado, y sin embargo tú le estás pasando un blanco.

Prueba esto

insert into kurro_prueba (campo1, campo2, campo3)
values('aaa',2,'2007-04-05')

select * from kurro_prueba

Verás como te devuelve el valor correcto



"Keyhelp" escribió en el mensaje
news:%23Okb%
drop table kurro_prueba_tabla
go
create table kurro_prueba_tabla(
campo1 varchar(4) not null default(space(1)),
campo2 numeric(10) null default(0),
campo3 datetime null default (1/1/1900),
constraint pk_kurro_prueba_tabla primary key(campo1))
go

drop function fn_kurro_dato
go
create function fn_kurro_dato(@numero numeric(10))
returns varchar(15)
as
begin
declare @retorno varchar(15)

select @retorno = case @numero
when 0 then 'Es cero'
when 1 then 'Es un uno'
else 'Otro número'
end

return @retorno
end
go

drop view kurro_prueba
go
create view kurro_prueba(campo1, campo2, campo3, texto)
as select campo1, campo2, campo3, dbo.fn_kurro_dato(campo2) from
kurro_prueba_tabla
go

Este es el script de pruebas que he realizado. El mensaje de error que me
devuelve cuando ejecuta la sentencia de insert en la view

insert into kurro_prueba values('aaa',2,'2007-04-05','')

Server: Msg 4406, Level 16, State 1, Line 1
Update or insert of view or function 'kurro_prueba' failed because it
contains a derived or constant field.

Tambien he probado pasando null al último argumento de insert, que es el
que corresponde a la función.

"Miguel Egea" escribió en el mensaje
news:
¿por que no nos pasas la definición de las tablas y la vista tal y como
la tienes, así te damos la solución exacta.

"Keyhelp" wrote in message
news:
Hola a todos:

Tengo entendido que se puede hacer Insert a traves de una vista (view)
pero tiene sus restricciones.

Tenemos una tabla que uno de sus campos es un sumatorio de unos valores
de otra tabla. Vamos a sustituir esta tabla por una vista que apunte a
una segunda tabla, pero el campo de sumatorio será una función que hace
la suma.
Para no cambiar en muchos sitios donde se graba este tabla en nuestra
aplicación, habiamos pensado en hacer una vista con el mismo nombre de
la tabla que tenia antes pero que el campo que era el sumatorio sea una
llamada a la funcion.

TABLA_ANTERIOR
campo1
campo2
campo3 > este es un valor que calculamos antes

TABLA_NUEVA
campo1
campo2

VISTA = TABLA_ANTERIOR
campo1
campo2
fn_suma_campo3 as campo3

Si hago un INSERT sobre TABLA_ANTERIOR me dá un error diciendo que no
puede hacer un insert pues tiene un campo constante.

¿Existe alguna forma de poder hacerlo? ¿Hay que definir la vista de
alguna forma?
Siempre será sobre una sola tabla

Gracias por adelantado.

Francisco López
Dpt. Desarrollo
Keyhelp, S.L.

http://www.keyhelp.net








Respuesta Responder a este mensaje
#4 Miguel Egea
04/09/2007 - 10:55 | Informe spam
Exactamente ni los cmapos calculados ni las funciones has de especificarlas
en el comando insert.

Saludos

"Carlos Sacristan" <nomail> wrote in message
news:%23%23%
Es que no puedes asignarle un valor al campo "texto" de la vista porque
es calculado, y sin embargo tú le estás pasando un blanco.

Prueba esto

insert into kurro_prueba (campo1, campo2, campo3)
values('aaa',2,'2007-04-05')

select * from kurro_prueba

Verás como te devuelve el valor correcto



"Keyhelp" escribió en el mensaje
news:%23Okb%
drop table kurro_prueba_tabla
go
create table kurro_prueba_tabla(
campo1 varchar(4) not null default(space(1)),
campo2 numeric(10) null default(0),
campo3 datetime null default (1/1/1900),
constraint pk_kurro_prueba_tabla primary key(campo1))
go

drop function fn_kurro_dato
go
create function fn_kurro_dato(@numero numeric(10))
returns varchar(15)
as
begin
declare @retorno varchar(15)

select @retorno = case @numero
when 0 then 'Es cero'
when 1 then 'Es un uno'
else 'Otro número'
end

return @retorno
end
go

drop view kurro_prueba
go
create view kurro_prueba(campo1, campo2, campo3, texto)
as select campo1, campo2, campo3, dbo.fn_kurro_dato(campo2) from
kurro_prueba_tabla
go

Este es el script de pruebas que he realizado. El mensaje de error que me
devuelve cuando ejecuta la sentencia de insert en la view

insert into kurro_prueba values('aaa',2,'2007-04-05','')

Server: Msg 4406, Level 16, State 1, Line 1
Update or insert of view or function 'kurro_prueba' failed because it
contains a derived or constant field.

Tambien he probado pasando null al último argumento de insert, que es el
que corresponde a la función.

"Miguel Egea" escribió en el mensaje
news:
¿por que no nos pasas la definición de las tablas y la vista tal y como
la tienes, así te damos la solución exacta.

"Keyhelp" wrote in message
news:
Hola a todos:

Tengo entendido que se puede hacer Insert a traves de una vista (view)
pero tiene sus restricciones.

Tenemos una tabla que uno de sus campos es un sumatorio de unos valores
de otra tabla. Vamos a sustituir esta tabla por una vista que apunte a
una segunda tabla, pero el campo de sumatorio será una función que hace
la suma.
Para no cambiar en muchos sitios donde se graba este tabla en nuestra
aplicación, habiamos pensado en hacer una vista con el mismo nombre de
la tabla que tenia antes pero que el campo que era el sumatorio sea una
llamada a la funcion.

TABLA_ANTERIOR
campo1
campo2
campo3 > este es un valor que calculamos antes

TABLA_NUEVA
campo1
campo2

VISTA = TABLA_ANTERIOR
campo1
campo2
fn_suma_campo3 as campo3

Si hago un INSERT sobre TABLA_ANTERIOR me dá un error diciendo que no
puede hacer un insert pues tiene un campo constante.

¿Existe alguna forma de poder hacerlo? ¿Hay que definir la vista de
alguna forma?
Siempre será sobre una sola tabla

Gracias por adelantado.

Francisco López
Dpt. Desarrollo
Keyhelp, S.L.

http://www.keyhelp.net












Respuesta Responder a este mensaje
#5 Keyhelp
04/09/2007 - 13:24 | Informe spam
Ya habia probado a pasarle solo los campos que se pueden actualizar, pero me
devuelve el mismo error
insert into kurro_prueba (campo1, campo2, campo3)
values('aaa',2,'2007-04-05')

Server: Msg 4406, Level 16, State 1, Line 1
Update or insert of view or function 'kurro_prueba' failed because it
contains a derived or constant field.

¿Habrá que especificar algo en la creación del view? ¿Algún parámetro en el
servidor de SQL ?
Usamos SQL Server 2000 SP4 en un W2K Server

"Miguel Egea" escribió en el mensaje
news:
Exactamente ni los cmapos calculados ni las funciones has de
especificarlas en el comando insert.

Saludos

"Carlos Sacristan" <nomail> wrote in message
news:%23%23%
Es que no puedes asignarle un valor al campo "texto" de la vista
porque es calculado, y sin embargo tú le estás pasando un blanco.

Prueba esto

insert into kurro_prueba (campo1, campo2, campo3)
values('aaa',2,'2007-04-05')

select * from kurro_prueba

Verás como te devuelve el valor correcto



"Keyhelp" escribió en el mensaje
news:%23Okb%
drop table kurro_prueba_tabla
go
create table kurro_prueba_tabla(
campo1 varchar(4) not null default(space(1)),
campo2 numeric(10) null default(0),
campo3 datetime null default (1/1/1900),
constraint pk_kurro_prueba_tabla primary key(campo1))
go

drop function fn_kurro_dato
go
create function fn_kurro_dato(@numero numeric(10))
returns varchar(15)
as
begin
declare @retorno varchar(15)

select @retorno = case @numero
when 0 then 'Es cero'
when 1 then 'Es un uno'
else 'Otro número'
end

return @retorno
end
go

drop view kurro_prueba
go
create view kurro_prueba(campo1, campo2, campo3, texto)
as select campo1, campo2, campo3, dbo.fn_kurro_dato(campo2) from
kurro_prueba_tabla
go

Este es el script de pruebas que he realizado. El mensaje de error que
me devuelve cuando ejecuta la sentencia de insert en la view

insert into kurro_prueba values('aaa',2,'2007-04-05','')

Server: Msg 4406, Level 16, State 1, Line 1
Update or insert of view or function 'kurro_prueba' failed because it
contains a derived or constant field.

Tambien he probado pasando null al último argumento de insert, que es el
que corresponde a la función.

"Miguel Egea" escribió en el mensaje
news:
¿por que no nos pasas la definición de las tablas y la vista tal y como
la tienes, así te damos la solución exacta.

"Keyhelp" wrote in message
news:
Hola a todos:

Tengo entendido que se puede hacer Insert a traves de una vista (view)
pero tiene sus restricciones.

Tenemos una tabla que uno de sus campos es un sumatorio de unos
valores de otra tabla. Vamos a sustituir esta tabla por una vista que
apunte a una segunda tabla, pero el campo de sumatorio será una
función que hace la suma.
Para no cambiar en muchos sitios donde se graba este tabla en nuestra
aplicación, habiamos pensado en hacer una vista con el mismo nombre de
la tabla que tenia antes pero que el campo que era el sumatorio sea
una llamada a la funcion.

TABLA_ANTERIOR
campo1
campo2
campo3 > este es un valor que calculamos antes

TABLA_NUEVA
campo1
campo2

VISTA = TABLA_ANTERIOR
campo1
campo2
fn_suma_campo3 as campo3

Si hago un INSERT sobre TABLA_ANTERIOR me dá un error diciendo que no
puede hacer un insert pues tiene un campo constante.

¿Existe alguna forma de poder hacerlo? ¿Hay que definir la vista de
alguna forma?
Siempre será sobre una sola tabla

Gracias por adelantado.

Francisco López
Dpt. Desarrollo
Keyhelp, S.L.

http://www.keyhelp.net















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