none
Actualizar Vista con referencia a dos tablas! RRS feed

  • Pregunta

  • Hola!

    Mi problema es el siguiente!

    Existe alguna manera o es posible actulizar datos de una vista!? o existe alguna manera de hacer algo parecido!?

    miércoles, 15 de diciembre de 2010 19:38

Respuestas

  • Chequea en los libros en linea por los desencadenadores tipo INSTEAD OF. Este tipo de trigger se dispara antes de la operacion en cuestion, por lo que si lo creas atado a una vista entonces podras enrutar la actualizacion hacia la tabla determinada.

    CREATE TRIGGER (Transact-SQL)

    Desencadenadores INSTEAD OF UPDATE

    Aqui tienes un ejemplo sencillo.

    USE tempdb;
    GO
    CREATE TABLE dbo.T1 (
    c1 int NOT NULL UNIQUE,
    c2 int
    );
    GO
    CREATE TABLE dbo.T2 (
    c1 int NOT NULL UNIQUE,
    c2 int
    );
    GO
    CREATE VIEW dbo.V1
    AS
    SELECT
    	A.c1,
    	A.c2,
    	B.c2 AS c3
    FROM
    	dbo.T1 AS A
    	INNER JOIN
    	dbo.T2 AS B
    	ON A.c1 = B.c1;
    GO
    INSERT INTO dbo.T1 VALUES(1, 10);
    INSERT INTO dbo.T2 VALUES(1, 20);
    GO
    CREATE TRIGGER dbo.tr_V1_io_upd ON dbo.V1
    INSTEAD OF UPDATE
    AS
    IF UPDATE(c3)
      UPDATE A
      SET A.c2 = I.C3
      FROM dbo.T2 AS A INNER JOIN INSERTED AS I ON A.c1 = I.c1;
    GO
    UPDATE dbo.V1
    SET c3 = 30
    WHERE c1 = 1;
    GO
    SELECT * FROM dbo.T1;
    SELECT * FROM dbo.T2;
    SELECT * FROM dbo.V1;
    GO
    DROP VIEW dbo.V1;
    GO
    DROP TABLE dbo.T1, dbo.T2;
    GO
    

     


    AMB

    Some guidelines for posting questions...

    miércoles, 15 de diciembre de 2010 20:23

Todas las respuestas

  • Por actualizar estas diciendo hacer un update sobre el view, teniendo en cuenta que el view hace referencia a dos tablas?
    miércoles, 15 de diciembre de 2010 20:20
  • Chequea en los libros en linea por los desencadenadores tipo INSTEAD OF. Este tipo de trigger se dispara antes de la operacion en cuestion, por lo que si lo creas atado a una vista entonces podras enrutar la actualizacion hacia la tabla determinada.

    CREATE TRIGGER (Transact-SQL)

    Desencadenadores INSTEAD OF UPDATE

    Aqui tienes un ejemplo sencillo.

    USE tempdb;
    GO
    CREATE TABLE dbo.T1 (
    c1 int NOT NULL UNIQUE,
    c2 int
    );
    GO
    CREATE TABLE dbo.T2 (
    c1 int NOT NULL UNIQUE,
    c2 int
    );
    GO
    CREATE VIEW dbo.V1
    AS
    SELECT
    	A.c1,
    	A.c2,
    	B.c2 AS c3
    FROM
    	dbo.T1 AS A
    	INNER JOIN
    	dbo.T2 AS B
    	ON A.c1 = B.c1;
    GO
    INSERT INTO dbo.T1 VALUES(1, 10);
    INSERT INTO dbo.T2 VALUES(1, 20);
    GO
    CREATE TRIGGER dbo.tr_V1_io_upd ON dbo.V1
    INSTEAD OF UPDATE
    AS
    IF UPDATE(c3)
      UPDATE A
      SET A.c2 = I.C3
      FROM dbo.T2 AS A INNER JOIN INSERTED AS I ON A.c1 = I.c1;
    GO
    UPDATE dbo.V1
    SET c3 = 30
    WHERE c1 = 1;
    GO
    SELECT * FROM dbo.T1;
    SELECT * FROM dbo.T2;
    SELECT * FROM dbo.V1;
    GO
    DROP VIEW dbo.V1;
    GO
    DROP TABLE dbo.T1, dbo.T2;
    GO
    

     


    AMB

    Some guidelines for posting questions...

    miércoles, 15 de diciembre de 2010 20:23
  • Sinclair 2068 la respuesta es si! yo hice un VISTA e intente por medio de la propiedad update actulizar pero siendo sincero no sabia que al hacer referencia la VISTA  a dos tablas me iva arrojar una exepción.

    HunchBack gracias tambien por tomarse la molestia y estoy probando tu ejemplo! estaremos en contacto!! es seguro!

    jueves, 16 de diciembre de 2010 16:14
  • Efectivamente no se puede hacer un update de un view que afecte a mas de una tabla. Sigue el ejemplo de Hunchback que es la forma de resolverlo.

     

    jueves, 16 de diciembre de 2010 20:52
  • Holas Muchas gracias! por la ayuda!!

    Efectivamente la respuesta esta en usar desencadenadores INSTEAD OF UPDATE.

    Ya han marcado el comentario de HunchBack como respuesta correcta!!!

    Gracias

    viernes, 17 de diciembre de 2010 19:42