Celdas bloqueadas como Solo Lectura en vistas SQL Server 2005

05/02/2007 - 14:50 por marzak | Informe spam
Hola,

Tengo una BD migrada de SQL Server 2000 a SQL Server 2005 y tengo un
problema al que no encuentro explicación alguna. He de decir que este
problema no ocurría en la versión 2000.

Hago una consulta sencilla de una tabla mostrando todos los campos y
no tengo ningún problema. Pero en cuanto le pongo una tabla auxiliar
con su relación y muestro un campo de ésta, ya la consulta es de sólo
lectura y me impide realizar modificaciones en la tabla principal.
Porqué ocurre esto? En el modo vista del Manager me pone 'Celda de
Sólo Lectura'. Ya digo que este problema no tenía en SQL 2000 ni
tampoco haciendo la consulta desde Access. Estoy muy perdido.
Cualquier ayuda se agradece.

Preguntas similare

Leer las respuestas

#11 Gustavo Larriera (MVP)
06/02/2007 - 17:18 | Informe spam
Hola ,

No es una limitación impuesta por .NET como erróneamente dices. Es una
restricción que tiene fundamentación teórica en el modelo relacional de bases
de datos.

Imagina que tienes Cursos, Alumnos y la asignación de cursos de los alumnos,
representando una asociación de cardinalidad N:N

ALUMNO (idalumno, nombre, otrosdatos)
CURSO (idcurso, titulo, otrosdatos)
ASIGNACION (idalumno, idcurso)

Ahora creas una vista V (nombre, titulo) que es el join de las tablas de
forma tal que muestra el nombre del alumno junto al curso asignado.

Imagina que deseas un INSERT así:

INSERT V (nombre, titulo) VALUES ('juan', 'teoria de bases de datos 1')

Cómo podría el motor relacional resolver esto? Fijate que no es posible
insertar alores adecuados en las 3 tablas puesto que no se proporcionan datos
como idalumno, idcurso, etc.

Una solución es que hagas un strored procediure que acepte en sus argumentos
TODOS LOS DATOS QUE SEAN OBLIGATORIOS y que realice una TRANSACTION para
insertar adecuadamnete en cada tabla.

Como ves, lo que quieres hacer (el INSERT directo sobre la vista paa que
automágicamente sepa lo que hay que hacer en las tablas base) adolece de
información importante que se necesita.

Espero haya servido para aclararte el concepto.


Gustavo Larriera, MVP | Solid Quality Mentors [www.solidq.com]
Este mensaje se proporciona tal como es, sin garantías de ninguna clase



"" wrote:

Hola de nuevo:

He podido ver en un Foro exclusivo de SQL Server que por lo visto esto
ocurre porque sí. Vamos, que SQL Server 2005 no soporta actualización
de datos cuando en una consulta hay varias tablas con INNER JOIN. Dan
pistas para solucionar el problema como trasladar los INNER JOIN al
WHERE, pero a mí no me sirve. Así que de momento he modificado el
código para que el recordset que realiza la modificación solo acceda a
la tabla que quiero modificar. Me parece que es una limitación
impuesta por la tecnología .NET de Microsoft. Nunca me ha gustado esta
tecnología, la verdad.

Un saludo.

On 6 feb, 09:13, wrote:
> Gracias por tu respuesta. Miraré los documentos que facilitas.
>
> Os dejo las Select que he probado y que me dan problemas. Las hago en
> el Management Studio, en la opción Vistas/Views.
>
> La siguiente no me da problema alguno (es muy sencillita):
>
> SELECT Notas_Estructura.* FROM Notas_Estructura
>
> En cambio, la siguiente modificación (también sencillita), ya me
> impide realizar modificaciones en los campos de la tabla anterior:
>
> SELECT Notas_Estructura.*, Alumnos.Apellido1, Alumnos.Apellido2,
> Alumnos.Nombre
> FROM Notas_Estructura INNER JOIN Alumnos ON Notas_Estructura.CodAlumno
> = Alumnos.CodAlumno
>
> Cualquier idea se agradece.



Respuesta Responder a este mensaje
#12 marzak
06/02/2007 - 20:04 | Informe spam
Gracias por vuestras respuestas.

Creo que no nos entendemos bien. En primer lugar, lo que explico en mi
segundo y tercer mensaje se puede hacer y funciona correctamente en
SQL Server 2000 y en consulta de una base de datos Access con las
tablas vinculadas de SQL Server 2005. Lo que pretendo no es hacer un
Insert en la tabla Notas de forma incorrecta (dejando sin introducir
valores 'clave', como decís), sino en base a una Select muy sencilla
que accede a datos ya existentes y totalmente normalizados, utilizando
un Recordset en una página ASP o en un código VBA dentro de una hoja
Excel, recorrer dicho Recordset y modificar un campo concreto, que no
es clave ni nada por el estilo.

Insisto (espero no ser pesado) que en SQL Server 2000 y Access esto
funciona perfectamente. Técnicamente, no veo el problema por ningún
lado, la verdad. He leído atentamente el documento de la Web técnica
de Microsoft, y el mismo no especifica ningún escenario que se dé en
mi caso. Desde mi punto de vista, y después de haber leído un foro
específico de SQL Server, como ahí se señala, esto es una problemática
de la versión 2005. Lo que no alcanzo a saber es el motivo de dicha
limitación. De toda la vida se han podido realizar modificaciones en
campos concretos utilizando sentencias Select más o menos complejas.
Vuelvo a lo mismo... no lo entiendo.

El problema lo tengo resuelto y sabiendo que esa limitación existe, la
tengo en cuenta y punto, asunto resuelto. Sólo espero que Microsoft
solucione esta limitación muy pronto.

On 6 feb, 17:18, Gustavo Larriera (MVP)
wrote:
Hola ,

No es una limitación impuesta por .NET como erróneamente dices. Es una
restricción que tiene fundamentación teórica en el modelo relacional de bases
de datos.

Imagina que tienes Cursos, Alumnos y la asignación de cursos de los alumnos,
representando una asociación de cardinalidad N:N

ALUMNO (idalumno, nombre, otrosdatos)
CURSO (idcurso, titulo, otrosdatos)
ASIGNACION (idalumno, idcurso)

Ahora creas una vista V (nombre, titulo) que es el join de las tablas de
forma tal que muestra el nombre del alumno junto al curso asignado.

Imagina que deseas un INSERT así:

INSERT V (nombre, titulo) VALUES ('juan', 'teoria de bases de datos 1')

Cómo podría el motor relacional resolver esto? Fijate que no es posible
insertar alores adecuados en las 3 tablas puesto que no se proporcionan datos
como idalumno, idcurso, etc.

Una solución es que hagas un strored procediure que acepte en sus argumentos
TODOS LOS DATOS QUE SEAN OBLIGATORIOS y que realice una TRANSACTION para
insertar adecuadamnete en cada tabla.

Como ves, lo que quieres hacer (el INSERT directo sobre la vista paa que
automágicamente sepa lo que hay que hacer en las tablas base) adolece de
información importante que se necesita.

Espero haya servido para aclararte el concepto.

Gustavo Larriera, MVP | Solid Quality Mentors [www.solidq.com]
Respuesta Responder a este mensaje
#13 Gustavo Larriera (MVP)
06/02/2007 - 21:48 | Informe spam
Puedes compartirnos el link al mensaje del foro donde has leido del problema?


Gustavo Larriera, MVP | Solid Quality Mentors [www.solidq.com]
Este mensaje se proporciona tal como es, sin garantías de ninguna clase



"" wrote:

Gracias por vuestras respuestas.

Creo que no nos entendemos bien. En primer lugar, lo que explico en mi
segundo y tercer mensaje se puede hacer y funciona correctamente en
SQL Server 2000 y en consulta de una base de datos Access con las
tablas vinculadas de SQL Server 2005. Lo que pretendo no es hacer un
Insert en la tabla Notas de forma incorrecta (dejando sin introducir
valores 'clave', como decís), sino en base a una Select muy sencilla
que accede a datos ya existentes y totalmente normalizados, utilizando
un Recordset en una página ASP o en un código VBA dentro de una hoja
Excel, recorrer dicho Recordset y modificar un campo concreto, que no
es clave ni nada por el estilo.

Insisto (espero no ser pesado) que en SQL Server 2000 y Access esto
funciona perfectamente. Técnicamente, no veo el problema por ningún
lado, la verdad. He leído atentamente el documento de la Web técnica
de Microsoft, y el mismo no especifica ningún escenario que se dé en
mi caso. Desde mi punto de vista, y después de haber leído un foro
específico de SQL Server, como ahí se señala, esto es una problemática
de la versión 2005. Lo que no alcanzo a saber es el motivo de dicha
limitación. De toda la vida se han podido realizar modificaciones en
campos concretos utilizando sentencias Select más o menos complejas.
Vuelvo a lo mismo... no lo entiendo.

El problema lo tengo resuelto y sabiendo que esa limitación existe, la
tengo en cuenta y punto, asunto resuelto. Sólo espero que Microsoft
solucione esta limitación muy pronto.

On 6 feb, 17:18, Gustavo Larriera (MVP)
wrote:
> Hola ,
>
> No es una limitación impuesta por .NET como erróneamente dices. Es una
> restricción que tiene fundamentación teórica en el modelo relacional de bases
> de datos.
>
> Imagina que tienes Cursos, Alumnos y la asignación de cursos de los alumnos,
> representando una asociación de cardinalidad N:N
>
> ALUMNO (idalumno, nombre, otrosdatos)
> CURSO (idcurso, titulo, otrosdatos)
> ASIGNACION (idalumno, idcurso)
>
> Ahora creas una vista V (nombre, titulo) que es el join de las tablas de
> forma tal que muestra el nombre del alumno junto al curso asignado.
>
> Imagina que deseas un INSERT así:
>
> INSERT V (nombre, titulo) VALUES ('juan', 'teoria de bases de datos 1')
>
> Cómo podría el motor relacional resolver esto? Fijate que no es posible
> insertar alores adecuados en las 3 tablas puesto que no se proporcionan datos
> como idalumno, idcurso, etc.
>
> Una solución es que hagas un strored procediure que acepte en sus argumentos
> TODOS LOS DATOS QUE SEAN OBLIGATORIOS y que realice una TRANSACTION para
> insertar adecuadamnete en cada tabla.
>
> Como ves, lo que quieres hacer (el INSERT directo sobre la vista paa que
> automágicamente sepa lo que hay que hacer en las tablas base) adolece de
> información importante que se necesita.
>
> Espero haya servido para aclararte el concepto.
>
> Gustavo Larriera, MVP | Solid Quality Mentors [www.solidq.com]


Respuesta Responder a este mensaje
#14 marzak
07/02/2007 - 09:53 | Informe spam
Perdonar, es verdad, tendría que haberlo puesto desde un principio:

http://www.sqlservercentral.com/for...px?forumid9&messageid&9971

Creo que hay que registrarse para poder leerlo.

Gracias y un saludo.

On 6 feb, 22:48, Gustavo Larriera (MVP)
wrote:
Puedes compartirnos el link al mensaje del foro donde has leido del problema?

Gustavo Larriera, MVP | Solid Quality Mentors [www.solidq.com]
Respuesta Responder a este mensaje
#15 Gustavo Larriera (MVP)
07/02/2007 - 19:50 | Informe spam
Gracias por el link, lo he leido.

En SQL Server no es posible actualizar una consulta que involucre a más de
una tabla base. Es decir, los datos de una consulta (o una vista) que haga
joins de varias tablas no puede ser actualizado.

Es lo que ya he explicado en mensaje anterior.

Gustavo Larriera, MVP | Solid Quality Mentors [www.solidq.com]
Este mensaje se proporciona tal como es, sin garantías de ninguna clase



"" wrote:

Perdonar, es verdad, tendría que haberlo puesto desde un principio:

http://www.sqlservercentral.com/for...px?forumid9&messageid&9971

Creo que hay que registrarse para poder leerlo.

Gracias y un saludo.

On 6 feb, 22:48, Gustavo Larriera (MVP)
wrote:
> Puedes compartirnos el link al mensaje del foro donde has leido del problema?
>
> Gustavo Larriera, MVP | Solid Quality Mentors [www.solidq.com]


Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida