none
INSERT INTO EM VIEW - É possível? RRS feed

  • Pergunta

  • Bom dia,

    Preciso fazer um insert em uma view, é possível?

    Ou apenas copiar um registro inteiro da view e depois atualizar apenas um campo...

     

    insert into view_clip

    (codma, codac, codp, codag, codm, codper, codr, codpais, est, codabr, coded, datamat,
                chamada, subt, titulo, texto, ordem, public, tam, coddest, datah, codimport, codpos, vid,
                som, imagem, codim_ag, hora, codred, vis, criador, unim1, orig, codaut, numpag, ord, urlk)
    select codma, codac, codp, codag, codm, codper, codr, codpais, est, codabr, coded, datamat,
                chamada, subt, titulo, texto, ordem, public, tam, coddest, datah, codimport, codpos, vid,
                som, imagem, codim_ag, hora, codred, vis, criador, unim1, orig, codaut, numpag, ord, urlk
    from vw_clip where codma = '123456' AND codp = 'BRASIL'   

     

    Estou fazendo o insert acima em uma view e da o seguinte erro:

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

     

    alguém sabe o que pode ser?

    Obrigado!
    • Editado CarlosHB segunda-feira, 20 de dezembro de 2010 13:50
    segunda-feira, 20 de dezembro de 2010 13:35

Respostas

  • Boa Noite,

    O SQL Server assim como outros SGBDs permite o uso de comandos DML (INS, DEL e UPD) contra views. A questão é que não é qualquer view que pode ser influenciada por esses comandos. Algumas regras precisam ser impostas para tornar isso possível:

    - Apenas uma tabela por vez pode ser atualizada (se a view referencia várias tabelas é possível atualizar, mas apenas uma por vez)
    - Colunas calculadas não podem ser atualizadas
    - A view não pode conter operadores especiais como DISTINCT e (ou) subqueries

    Há outras restrições conforme o Books OnLine (procure o comando CREATE VIEW no tópico Updatable Views) e receio que sua view contenha construções proibidas. É possível retirar todas as restrições com o uso de triggers Instead Of, mas aí... Bem algo que eu não recomendaria.

    O SQL Server, o DB2 e o ORACLE possuem visões materializadas diferindo apenas no nome:

    SQL Server - Indexed Views
    DB2 - Materialized Query Table
    Oracle - Materialized View

    Há algumas restrições na construção e atualização de views materializadas do SQL Server em relação ao Oracle, mas no conceito em sua essência, não há divergências. O objetivo é materializar os dados para que as consultas sejam mais rápidas. Todos os três o fazem.

    [ ]s,

    Gustavo Maia Aguiar
    http://gustavomaiaaguiar.spaces.live.com

    Compêndio de XML – Preparação para o exame 70-433 - MCTS Microsoft SQL Server 2008 - Database Development
    http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!1161.entry


    Classifique as respostas. O seu feedback é imprescindível
    • Sugerido como Resposta Gustavo Maia Aguiar segunda-feira, 27 de dezembro de 2010 04:55
    • Marcado como Resposta Eder Costa segunda-feira, 3 de janeiro de 2011 16:59
    segunda-feira, 27 de dezembro de 2010 04:55
  • Bom, resolvi atualizar as tabelas mesmo e deixar a view de lado, pois na view eu particularmente não consegui fazer insert nem o update...

     

    No sql server 2008 tem views materializadas?

    • Marcado como Resposta CarlosHB quinta-feira, 3 de março de 2011 20:18
    quinta-feira, 23 de dezembro de 2010 18:29

Todas as Respostas

  • Sim, é possível fazer insert em view.

    O erro gerado, é algum campo da tabela vw_clipping_mm_stf, não está permitindo a inserção.

    segunda-feira, 20 de dezembro de 2010 13:46
  • E Update em view será que é possível? Pelo que pesquisei me parece que sim...mais alguém já usou tal recurso?

    segunda-feira, 20 de dezembro de 2010 14:00
  • Sim, tb é possível fazer update em view.

    A sintaxe, é a mesma de um update normal:

    update view set campo = 1

    segunda-feira, 20 de dezembro de 2010 14:04
  • UPDATE vw_clip
        SET vw_clip.codpas = 'EDITORIAIS'
        WHERE (SELECT DISTINCT aclip.codmat, vw.titulo, aclip.codac, mat.codag, aclip.codpas, vw.coded, aclip.datah
        FROM mate mat, acomp aclip, vw_clip vw
        WHERE vw.public = 1
        AND vw.codmat = aclip.codmat
        AND aclip.codmat = mat.codmat
        AND vw.codag = mat.codag
        AND vw.codac = aclip.codac
        AND vw.codpas = aclip.codpas
        AND vw.coded = mat.coded
        AND vw.titulo = mat.titulo
        AND vw.coded = mat.coded
        AND vw.codmat = '1500100'
        AND aclip.codac = 'DENSO'
        AND vw.codmat IN (SELECT codmat FROM vw_clip WHERE public = 1)
        AND vw.datamat > '2010-11-20 05:00:00.000'
        AND mat.codag IN ('CORREIO', 'FOLHA', 'ESTADO SP', 'GLOBO')
        AND vw.coded IN ('EDITORIAL', 'OPINIÃO'));

    Estou tentando fazer update na view no campo 'codpas' porém da erro....tem algo de errado na minha sintaxe?
    segunda-feira, 20 de dezembro de 2010 14:13
  • Tá faltando o campo do where.
    segunda-feira, 20 de dezembro de 2010 14:17
  • Sua tabela do SELECT, não possui um ID? Se tiver, tente assim:

    UPDATE vw_clip
    SET 
     vw_clip.codpas = 'EDITORIAIS' 
    WHERE
     id in (select id from...)
    

    segunda-feira, 20 de dezembro de 2010 14:21
  • Pior que não tenho um id nas views....tentei algo assim tb para atualizar apenas o campo codpas da view, porém tb da erro...

     

    UPDATE vw_clip

    SET vw_clip.codpas = 'EDITORIAIS'

    WHERE vw_clip.codpasta in (SELECT aclip.codpasta FROM mate mat, acomp aclip, vw_clip vw

    WHERE vw.public = 1

    AND vw.codmat = aclip.codmat

    AND vw.codac = aclip.codac

    AND vw.coded = mat.coded

    AND vw.titulo = mat.titulo

    AND vw.coded = mat.coded

    AND vw.codmat = '1500100'

    AND aclip.codac = 'DENSO'

    AND vw.codmat IN (SELECT codmat FROM vw_clip WHERE public = 1)

    AND vw.datamat > '2010-11-20 05:00:00.000'

    AND mat.codag IN ('CORREIO', 'FOLHA', 'ESTADO SP', 'GLOBO')

    AND vw.coded IN ('EDITORIAL', 'OPINIÃO'));


    Server: Msg 4421, Level 16, State 1, Line 1
    Derived table 'P' is not updatable because a column of the derived table is derived or constant.

     

    segunda-feira, 20 de dezembro de 2010 14:33
  • Faça um teste, rode apenas esse select:

     

    SELECT aclip.codpasta FROM mate mat, acomp aclip, vw_clip vw
    
    WHERE vw.public = 1
    
    AND vw.codmat = aclip.codmat
    
    AND vw.codac = aclip.codac
    AND vw.coded = mat.coded
    
    AND vw.titulo = mat.titulo
    
    AND vw.coded = mat.coded
    
    AND vw.codmat = '1500100'
    
    AND aclip.codac = 'DENSO'
    
    AND vw.codmat IN (SELECT codmat FROM vw_clip WHERE public = 1)
    
    AND vw.datamat > '2010-11-20 05:00:00.000'
    
    AND mat.codag IN ('CORREIO', 'FOLHA', 'ESTADO SP', 'GLOBO')
    
    AND vw.coded IN ('EDITORIAL', 'OPINIÃO')
    

     

     

    .. e veja o que retorna.

     

    segunda-feira, 20 de dezembro de 2010 14:40
  • Faça um teste, rode apenas esse select:

     

    SELECT
    
    
     aclip.codpasta FROM
    
    
    mate mat, acomp aclip, vw_clip vw
    WHERE 
    
    
    vw.public = 1
    AND 
    
    
    vw.codmat = aclip.codmat
    AND 
    
    
    vw.codac = aclip.codac
    AND 
    
    
    vw.coded = mat.coded
    AND
    
    vw.titulo = mat.titulo
    AND 
    
    vw.coded = mat.coded
    AND 
    
    vw.codmat = '1500100'
    
    
    AND 
    
    
    aclip.codac = 'DENSO'
    
    
    AND 
    
    
    vw.codmat IN
    
    
    (SELECT
    
    
    codmat FROM
    
    
    vw_clip WHERE
    
    
        public 
    
    = 1)
    AND
    
    
    vw.datamat > '2010-11-20 05:00:00.000'
    
    
    AND 
    
    
    mat.codag IN
    
    
    ('CORREIO', 'FOLHA', 'ESTADO SP', 'GLOBO')
    
    
    AND
    
    
    vw.coded IN
    
    
    ('EDITORIAL'
    
    
    , 'OPINIÃO'
    
    
    )
    

    .. e veja o que retorna.

     


    Sim, me retorna dois registros....nestes dois registros só quero atualizar o campo codpas, porém ainda não deu certo.

                                                                                     CODPAS

    1519    Exames da OAB     CLIENTE    FOLHA DE SP       PODER JUDICIÁRIO    OPINIÃO     2010-10-20 04:10:35.067
    1517    Identidade atual     CLIENTE    O GLOBO            ASSOCIAÇÕES            OPINIÃO     2010-10-20 04:20:20.100

     

    O campo em negrito que preciso duplicar e atualizar para EDITORIAIS.
    lembrando que a query esta rodando em cima de view.

    segunda-feira, 20 de dezembro de 2010 17:28
  • Poderia postar o código, da view "vw_clip"?
    segunda-feira, 20 de dezembro de 2010 17:49
  • sim, o código da view abaixo:

    Nesta view é utilizada mais de 5 tabelas se não me engano, todas em joins....para as queries serem feitas em cima das views...

    SELECT P.codmat, P.codac, P.codpas, P.codag, P.codme, P.codper, P.codreg, P.codpais, P.estado, P.codabr, P.coded, P.datamateri, P.chamada, P.sutit, P.titulo, P.texto, P.ordemmat, P.publica, P.tammat, P.coddestaq, P.datah, P.codimport, P.codpos, P.video, P.som, (CASE WHEN ISNULL(Q.codmat, 0) > 0 THEN 1 ELSE 0 END) AS imagem, P.codimport_ag, P.hora, P.codred, P.visible, P.criado, P.unim, P.origem,  P.codaut, P.numpag, P.ordemm, P.urlk, P.especial
    FROM  (SELECT     Z.codmat, Z.codac, Z.codpas, Z.codag, Z.codme, Z.codper, Z.codreg, Z.codpais, Z.estado, Z.codabr, Z.coded,
               Z.datamateri, Z.chamada, Z.sutit, Z.titulo, Z.texto, Z.ordemmat, Z.publica, Z.tammat, Z.coddestaq, Z.datah, Z.codimport,
               Z.codpos, Z.video, (CASE WHEN ISNULL(W.codmat, 0) > 0 THEN 1 ELSE 0 END) AS som, Z.codimport_ag, Z.hora, Z.codred, Z.visible,
               Z.criado, Z.unim, Z.origem, Z.codaut, Z.numpag, Z.ordemm, Z.urlk, Z.especial
    FROM  (SELECT     X.codmat, X.codac, X.codpas, X.codag, X.codme, X.codper, X.codreg, X.codpais, X.estado, X.codabr, X.coded,
               X.datamateri, X.chamada, X.sutit, X.titulo, X.texto, X.ordemmat, X.publica, X.tammat, X.coddestaq, X.datah,
               X.codimport, X.codpos, (CASE WHEN ISNULL(Y.codmat, 0) > 0 THEN 1 ELSE 0 END) AS video, X.codimport_ag, X.hora,
               X.codred, X.visible, X.criado, X.unim, X.origem, X.codaut, X.numpag, X.ordemm, X.urlk, X.especial
    FROM  (SELECT     AAAA.codmat, AAAA.codac, AAAA.codpas, AAAA.codag, AAAA.codme, AAAA.codper, AAAA.codreg,
               AAAA.codpais, AAAA.estado, AAAA.codabr, AAAA.coded, AAAA.datamateri, AAAA.chamada, AAAA.sutit, AAAA.titulo,
               AAAA.texto, AAAA.ordemmat, AAAA.publica, AAAA.tammat, AAAA.coddestaq, AAAA.datah, AAAA.codimport,
               AAAA.codpos, AAAA.codimport_ag, AAAA.hora, AAAA.codred, AAAA.visible, AAAA.criado, AAAA.unim, AAAA.origem,
               AAAA.codaut, AAAA.numpag, AAAA.ordemm, AAAA.urlk, AAAA.especial
    FROM  (SELECT     AAA1.codmat, AAA1.codac, AAA1.codpas, AAA1.codag, AAA1.estado, AAA1.codabr, AAA1.codme,
               AAA1.codper, AAA1.codreg, AAA1.codpais, AAA1.coded, AAA1.datamateri, AAA1.chamada, AAA1.sutit,
               AAA1.titulo, AAA1.texto, AAA1.ordemmat, AAA1.publica, AAA1.tammat, AAA1.coddestaq, AAA1.datah,
               AAA1.codimport, AAA1.codpos, ISNULL(BBB1_1.codimport, 999) AS codimport_ag, AAA1.hora,
               AAA1.codred, AAA1.visible, AAA1.criado, AAA1.unim, AAA1.origem, AAA1.codaut, AAA1.numpag, AAA1.ordemm,
    FROM  (SELECT     AAA.codmat, BBB.codac, BBB.codpas, AAA.codag, AAA.estado, AAA.codabr,
               AAA.codme, AAA.codper, AAA.codreg, AAA.codpais, AAA.coded, AAA.datamateri, AAA.chamada,
               AAA.sutit, AAA.titulo, AAA.texto, AAA.ordemmat, AAA.publica, AAA.tammat,
               AAA.coddestaq, AAA.datah, AAA.codimport, AAA.codpos, AAA.hora, AAA.codred, BBB.visible,
               AAA.criado, AAA.unim, AAA.origem, AAA.codaut, AAA.numpag, BBB.ordemm, AAA.urlk,
               AAA.especial
    FROM   (SELECT     AA.codmat, AA.codag, BB.estado, AA.codabr, AA.codme, AA.codper,
               BB.codreg, BB.codpais, AA.coded, AA.datamateri, AA.chamada, AA.sutit, AA.titulo,
               AA.texto, AA.ordemmat, AA.publica, AA.tammat, AA.coddestaq, AA.datah,
               AA.codimport, AA.codpos, AA.hora, AA.codred, AA.criado, AA.unim, AA.origem,
               AA.codaut, AA.numpag, AA.urlk, AA.especial
    FROM   (SELECT     A.codmat, A.codag, B.codlocal, B.codabr, B.codme, B.codper,
                A.coded, A.datamateri, A.chamada, A.sutit, A.titulo, A.texto,
                A.ordemmat, A.publica, A.tammat, A.coddestaq, A.datah, B.codimport,
                A.codpos, A.hora, B.codred, A.criado, A.unim, A.origem, A.codaut,
                A.numpag, A.urlk, B.especial
    FROM          (SELECT     codmat, codag, coded, datamateri, chamada, sutit,
                titulo, texto, ordemmat, publica, tammat, coddestaq,
                datah, codpos, hora, criado, unim, origem, codaut, numpag, urlk
    FROM          dbo.mat WITH (NOLOCK)
                WHERE      (publica = 1)) AS A LEFT OUTER JOIN
                (SELECT     codag, codlocal, codabr, codme, codper, codimport, codred, especial
                FROM          dbo.agtemid WITH (NOLOCK)) AS B ON A.codag = B.codag) AS AA LEFT OUTER JOIN
                (SELECT     codlocal, estado, codreg, codpais
                FROM          dbo.local WITH (NOLOCK)) AS BB ON AA.codlocal = BB.codlocal) AS AAA LEFT OUTER JOIN
                (SELECT DISTINCT BBB1.codmat, BBB1.codac, BBB1.codpas, BBB2.bd, BBB2.visible, BBB2.ordemm
    FROM    (SELECT     codmat, codac, codpas

    FROM    dbo.aclip WITH (NOLOCK)) AS BBB1 LEFT OUTER JOIN  (SELECT     codpas, bd, visible, ordemm, codac
    FROM          dbo.ap6 WITH (NOLOCK)) AS BBB2 ON BBB1.codpas = BBB2.codpas

    AND (BBB2.bd IS NULL OR BBB2.bd = 0) AND BBB1.codac = BBB2.codac) AS BBB ON
    AAA.codmat = BBB.codmat) AS AAA1 LEFT OUTER JOIN
    (SELECT     codag, codac, codimport
    FROM          dbo.agtemid_import WITH (NOLOCK)) AS BBB1_1 ON AAA1.codag = BBB1_1.codag AND
    AAA1.codac = BBB1_1.codac) AS AAAA LEFT OUTER JOIN
    (SELECT     codac, codcontrat
    FROM          dbo.acmats WITH (NOLOCK)) AS BBBB ON AAAA.codac = BBBB.codac) AS X LEFT OUTER JOIN
    (SELECT DISTINCT codmat
    FROM          dbo.matvid WITH (NOLOCK)) AS Y ON X.codmat = Y.codmat) AS Z LEFT OUTER JOIN
    (SELECT DISTINCT codmat
    FROM          dbo.matsom WITH (NOLOCK)) AS W ON Z.codmat = W.codmat) AS P LEFT OUTER JOIN
    (SELECT DISTINCT codmat
    FROM          dbo.matimg WITH (NOLOCK)) AS Q ON P.codmat = Q.codmat
    WHERE     (P.codac IS NOT NULL)
    GO

    segunda-feira, 20 de dezembro de 2010 18:35
  • Ao meu ver, o problema é:

    "P" não é uma tabela física. É derivada.

    Ou seja, isso:

    (SELECT   Z.codmat, Z.codac, Z.codpas, Z.codag, Z.codme, Z.codper, Z.codreg, Z.codpais, Z.estado, Z.codabr, Z.coded, 
          Z.datamateri, Z.chamada, Z.sutit, Z.titulo, Z.texto, Z.ordemmat, Z.publica, Z.tammat, Z.coddestaq, Z.datah, Z.codimport, 
          Z.codpos, Z.video, (CASE WHEN ISNULL(W.codmat, 0) > 0 THEN 1 ELSE 0 END) AS som, Z.codimport_ag, Z.hora, Z.codred, Z.visible, 
          Z.criado, Z.unim, Z.origem, Z.codaut, Z.numpag, Z.ordemm, Z.urlk, Z.especial
    FROM (SELECT   X.codmat, X.codac, X.codpas, X.codag, X.codme, X.codper, X.codreg, X.codpais, X.estado, X.codabr, X.coded,
          X.datamateri, X.chamada, X.sutit, X.titulo, X.texto, X.ordemmat, X.publica, X.tammat, X.coddestaq, X.datah, 
          X.codimport, X.codpos, (CASE WHEN ISNULL(Y.codmat, 0) > 0 THEN 1 ELSE 0 END) AS video, X.codimport_ag, X.hora, 
          X.codred, X.visible, X.criado, X.unim, X.origem, X.codaut, X.numpag, X.ordemm, X.urlk, X.especial
    FROM (SELECT   AAAA.codmat, AAAA.codac, AAAA.codpas, AAAA.codag, AAAA.codme, AAAA.codper, AAAA.codreg, 
          AAAA.codpais, AAAA.estado, AAAA.codabr, AAAA.coded, AAAA.datamateri, AAAA.chamada, AAAA.sutit, AAAA.titulo, 
          AAAA.texto, AAAA.ordemmat, AAAA.publica, AAAA.tammat, AAAA.coddestaq, AAAA.datah, AAAA.codimport, 
          AAAA.codpos, AAAA.codimport_ag, AAAA.hora, AAAA.codred, AAAA.visible, AAAA.criado, AAAA.unim, AAAA.origem, 
          AAAA.codaut, AAAA.numpag, AAAA.ordemm, AAAA.urlk, AAAA.especial
    FROM (SELECT   AAA1.codmat, AAA1.codac, AAA1.codpas, AAA1.codag, AAA1.estado, AAA1.codabr, AAA1.codme, 
          AAA1.codper, AAA1.codreg, AAA1.codpais, AAA1.coded, AAA1.datamateri, AAA1.chamada, AAA1.sutit, 
          AAA1.titulo, AAA1.texto, AAA1.ordemmat, AAA1.publica, AAA1.tammat, AAA1.coddestaq, AAA1.datah, 
          AAA1.codimport, AAA1.codpos, ISNULL(BBB1_1.codimport, 999) AS codimport_ag, AAA1.hora, 
          AAA1.codred, AAA1.visible, AAA1.criado, AAA1.unim, AAA1.origem, AAA1.codaut, AAA1.numpag, AAA1.ordemm, 
    FROM (SELECT   AAA.codmat, BBB.codac, BBB.codpas, AAA.codag, AAA.estado, AAA.codabr, 
          AAA.codme, AAA.codper, AAA.codreg, AAA.codpais, AAA.coded, AAA.datamateri, AAA.chamada, 
          AAA.sutit, AAA.titulo, AAA.texto, AAA.ordemmat, AAA.publica, AAA.tammat, 
          AAA.coddestaq, AAA.datah, AAA.codimport, AAA.codpos, AAA.hora, AAA.codred, BBB.visible, 
          AAA.criado, AAA.unim, AAA.origem, AAA.codaut, AAA.numpag, BBB.ordemm, AAA.urlk, 
          AAA.especial
    FROM  (SELECT   AA.codmat, AA.codag, BB.estado, AA.codabr, AA.codme, AA.codper, 
          BB.codreg, BB.codpais, AA.coded, AA.datamateri, AA.chamada, AA.sutit, AA.titulo, 
          AA.texto, AA.ordemmat, AA.publica, AA.tammat, AA.coddestaq, AA.datah, 
          AA.codimport, AA.codpos, AA.hora, AA.codred, AA.criado, AA.unim, AA.origem, 
          AA.codaut, AA.numpag, AA.urlk, AA.especial
    FROM  (SELECT   A.codmat, A.codag, B.codlocal, B.codabr, B.codme, B.codper, 
          A.coded, A.datamateri, A.chamada, A.sutit, A.titulo, A.texto, 
          A.ordemmat, A.publica, A.tammat, A.coddestaq, A.datah, B.codimport, 
          A.codpos, A.hora, B.codred, A.criado, A.unim, A.origem, A.codaut, 
          A.numpag, A.urlk, B.especial
    FROM     (SELECT   codmat, codag, coded, datamateri, chamada, sutit, 
          titulo, texto, ordemmat, publica, tammat, coddestaq, 
          datah, codpos, hora, criado, unim, origem, codaut, numpag, urlk
    FROM     dbo.mat WITH (NOLOCK)
          WHERE   (publica = 1)) AS A LEFT OUTER JOIN
    (SELECT   codag, codlocal, codabr, codme, codper, codimport, codred, especial
    FROM     dbo.agtemid WITH (NOLOCK)) AS B ON A.codag = B.codag) AS AA LEFT OUTER JOIN
    (SELECT   codlocal, estado, codreg, codpais 
    FROM     dbo.local WITH (NOLOCK)) AS BB ON AA.codlocal = BB.codlocal) AS AAA LEFT OUTER JOIN
    (SELECT DISTINCT 
    BBB1.codmat, BBB1.codac, BBB1.codpas, BBB2.bd, BBB2.visible, 
    BBB2.ordemm
    FROM     (SELECT   codmat, codac, codpas
    FROM     dbo.aclip WITH (NOLOCK)) AS BBB1 LEFT OUTER JOIN 
    
    (SELECT   codpas, bd, visible, ordemm, codac
    FROM     dbo.ap6 WITH (NOLOCK)) AS BBB2 ON BBB1.codpas = BBB2.codpas AND
    (BBB2.bd IS NULL OR BBB2.bd = 0) AND BBB1.codac = BBB2.codac) AS BBB ON 
    AAA.codmat = BBB.codmat) AS AAA1 LEFT OUTER JOIN
    (SELECT   codag, codac, codimport
    FROM     dbo.agtemid_import WITH (NOLOCK)) AS BBB1_1 ON AAA1.codag = BBB1_1.codag AND
    AAA1.codac = BBB1_1.codac) AS AAAA LEFT OUTER JOIN
    (SELECT   codac, codcontrat
    FROM     dbo.acmats WITH (NOLOCK)) AS BBBB ON AAAA.codac = BBBB.codac) AS X LEFT OUTER JOIN
    (SELECT DISTINCT codmat
    FROM     dbo.matvid WITH (NOLOCK)) AS Y ON X.codmat = Y.codmat) AS Z LEFT OUTER JOIN
    (SELECT DISTINCT codmat
    FROM     dbo.matsom WITH (NOLOCK)) AS W ON Z.codmat = W.codmat) AS P
    

     

    .. vc chamou de tabela "P". 

    Quando vc faz um update ou insert na view, ele tenta atualizar "P", sendo que ela não existe.

    • Sugerido como Resposta Eder Costa segunda-feira, 3 de janeiro de 2011 17:00
    segunda-feira, 20 de dezembro de 2010 18:58
  • Ao meu ver, o problema é:

    "P" não é uma tabela física. É derivada.

    Ou seja, isso:

     

    (SELECT
    
    
     .......
    
     P
    

     

    .. vc chamou de tabela "P". 

    Quando vc faz um update ou insert na view, ele tenta atualizar "P", sendo que ela não existe.

    Peço desculpas, mais acho que quando eu colei esta view não veio esta parte de cima, justamente o "P"

     

    (SELECT
    
    
     P.codmat, P.codac, P.codpas, P.codag, P.codme, P.codper, P.codreg, P.codpais, P.estado, P.codabr, P.coded, 
    P.datamateri, P.chamada, P.sutit, P.titulo, P.texto, P.ordemmat, P.publica, P.tammat, P.coddestaq, P.datah, P.codimport,
    P.codpos, P.video, (CASE WHEN ISNULL (W.codmat, 0) > 0 THEN 1 ELSE 0 END ) AS som, P.codimport_ag, P.hora, P.codred, P.visible,
    P.criado, P.unim, P.origem, P.codaut, P.numpag, P.ordemm, P.urlk, P.especial
    terça-feira, 21 de dezembro de 2010 11:31
  • Vc não entendeu.

    Veja meu post anterior. Tudo aquilo que eu colei, é apenas uma parte da sua view. E essa parte que eu colei, vc chama de tabela "P". Ou seja, tem um "as P" no final. 

    Tudo aquilo que colei no meu post anteior, vc chama de tabela "P" dentro da sua view. Entendeu? E como a tabela "P" não existe, é uma tabela derivada, ele gera o erro que vc está tendo. 

    Nesse caso, ao meu ver, não será possível o update em cima da view,

    terça-feira, 21 de dezembro de 2010 12:46
  • Ok...então o jeito será atualizar na mão as duas tabelas mesmo....

    Valeu pela sua ajuda!

    terça-feira, 21 de dezembro de 2010 13:57
  • Oh seu insert está dando errado porque está faltando o AS.

    Tente novamente e veja se obtém exito:

    ---

    insert into view_clip
        (codma, codac, codp, codag, codm, codper, codr, codpais, est, codabr, coded, datamat,
        chamada, subt, titulo, texto, ordem, public, tam, coddest, datah, codimport, codpos, vid,
        som, imagem, codim_ag, hora, codred, vis, criador, unim1, orig, codaut, numpag, ord, urlk)
    AS
        (SELECT
    codma, codac, codp, codag, codm, codper, codr, codpais, est, codabr, coded, datamat,
    chamada, subt, titulo, texto, ordem, public, tam, coddest, datah, codimport, codpos, vid,
    som, imagem, codim_ag, hora, codred, vis, criador, unim1, orig, codaut, numpag, ord, urlk
        FROM vw_clip
    where
        codma = '123456' AND codp = 'BRASIL' )

    terça-feira, 21 de dezembro de 2010 22:32
  • Agora veja se seu update funciona:
    UPDATE vw_clip
    SET vw_clip.codpas = 'EDITORIAIS'
    WHERE vw_clip.codpasta in (SELECT aclip.codpasta FROM mate mat, acomp aclip, vw_clip vw
    WHERE vw.[public] = 1
    AND vw.codmat = aclip.codmat
    AND vw.codac = aclip.codac
    AND vw.coded = mat.coded
    AND vw.titulo = mat.titulo
    AND vw.coded = mat.coded
    AND vw.codmat = '1500100'
    AND aclip.codac = 'DENSO'
    AND vw.codmat IN (SELECT vw.codmat FROM vw_clip vw WHERE VW.[public] = 1)
    AND vw.datamat > '2010-11-20 05:00:00.000'
    AND mat.codag IN ('CORREIO', 'FOLHA', 'ESTADO SP', 'GLOBO')
    AND vw.coded IN ('EDITORIAL', 'OPINIÃO'));

    ---

    Qualquer dúvida continue postando!

    @lucas_matos1

    terça-feira, 21 de dezembro de 2010 22:38
  • Agora veja se seu update funciona:
    UPDATE vw_clip
    SET vw_clip.codpas = 'EDITORIAIS'
    WHERE vw_clip.codpasta in (SELECT aclip.codpasta FROM mate mat, acomp aclip, vw_clip vw
    WHERE vw.[public] = 1
    AND vw.codmat = aclip.codmat
    AND vw.codac = aclip.codac
    AND vw.coded = mat.coded
    AND vw.titulo = mat.titulo
    AND vw.coded = mat.coded
    AND vw.codmat = '1500100'
    AND aclip.codac = 'DENSO'
    AND vw.codmat IN (SELECT vw.codmat FROM vw_clip vw WHERE VW.[public] = 1)
    AND vw.datamat > '2010-11-20 05:00:00.000'
    AND mat.codag IN ('CORREIO', 'FOLHA', 'ESTADO SP', 'GLOBO')

    AND vw.coded IN ('EDITORIAL', 'OPINIÃO')

    GROUP BY aclip.codpasta);

    ---

    Qualquer dúvida continue postando!

    @lucas_matos1

    Tentei fazer o update mais ele não permite....

     

    Msg 4403, Level 16, State 1, Line 1
    Cannot update the view or function 'vw_clip' because it contains aggregates, or a DISTINCT or GROUP BY clause, or PIVOT or UNPIVOT operator.

    quarta-feira, 22 de dezembro de 2010 11:49
  • Segue:
    UPDATE vw_clip
        SET vw_clip.codpas = 'EDITORIAIS'
    FROM
        VW_CLIP
    INNER JOIN acomp
        ON
    vw_clip.codpasta = acomp.codpasta
        AND
    vw_clip.codmat = acomp.codmat
        AND
    vw_clip.codac = acomp.codac
        AND
    acomp.codac = 'DENSO'
        AND
    vw_clip.codmat = '1500100'
    INNER JOIN mate
        ON
    vw_clip.coded = mate.coded
        AND
    vw_clip.titulo = mate.titulo
        AND
    vw_clip.coded = mate.coded
        AND
    vw_clip.[public] = 1
        AND
    vw_clip.datamat > '2010-11-20 05:00:00.000'
        AND
    mate.codag IN ('CORREIO', 'FOLHA', 'ESTADO SP', 'GLOBO')
        AND
    vw_clip.coded IN ('EDITORIAL', 'OPINIÃO')

    • Sugerido como Resposta Eder Costa segunda-feira, 3 de janeiro de 2011 16:59
    quarta-feira, 22 de dezembro de 2010 14:49
  • Tentei o update conforme vc passou, porém dá erro tb por ser em campo PK.

    Msg 2627, Level 14, State 1, Line 1
    Violation of PRIMARY KEY constraint 'PK_acomp'. Cannot insert duplicate key in object 'dbo.acomp'.
    The statement has been terminated.

    Eu acho que será meio complicado esse update por ser uma primary key.

    Estive pesquisando terá que ser algo tipo um update em cascade, correto?


    quarta-feira, 22 de dezembro de 2010 17:27
  • Deu esse erro porque tentou duplicar a chave primária ACOMP.

    Tire hum ou outro campo e veja se a querie roda, caso sim, va implementando aos poucos, assim ficará mais fácil de encontrar o erro.

     

     

    Skype: lucas.matos01

    quarta-feira, 22 de dezembro de 2010 17:34
  • Bom, resolvi atualizar as tabelas mesmo e deixar a view de lado, pois na view eu particularmente não consegui fazer insert nem o update...

     

    No sql server 2008 tem views materializadas?

    • Marcado como Resposta CarlosHB quinta-feira, 3 de março de 2011 20:18
    quinta-feira, 23 de dezembro de 2010 18:29
  • Bom, no 2000 tem, no 2008 provavelmente terá.

    Segue hum linl:

    http://www.akadia.com/services/sqlsrv_matviews.html

     

     

    Skype: lucas.matos01

    quinta-feira, 23 de dezembro de 2010 18:34
  • Soh relembrando.... o SQL Server não possui View Materializada (Oracle). O que ele tem, é a view indexada , que é "similar" às views materializada do oracle. O sql server 2008 suporta view indexada...

    Rafael Melo

    quinta-feira, 23 de dezembro de 2010 19:23
  • Boa Noite,

    O SQL Server assim como outros SGBDs permite o uso de comandos DML (INS, DEL e UPD) contra views. A questão é que não é qualquer view que pode ser influenciada por esses comandos. Algumas regras precisam ser impostas para tornar isso possível:

    - Apenas uma tabela por vez pode ser atualizada (se a view referencia várias tabelas é possível atualizar, mas apenas uma por vez)
    - Colunas calculadas não podem ser atualizadas
    - A view não pode conter operadores especiais como DISTINCT e (ou) subqueries

    Há outras restrições conforme o Books OnLine (procure o comando CREATE VIEW no tópico Updatable Views) e receio que sua view contenha construções proibidas. É possível retirar todas as restrições com o uso de triggers Instead Of, mas aí... Bem algo que eu não recomendaria.

    O SQL Server, o DB2 e o ORACLE possuem visões materializadas diferindo apenas no nome:

    SQL Server - Indexed Views
    DB2 - Materialized Query Table
    Oracle - Materialized View

    Há algumas restrições na construção e atualização de views materializadas do SQL Server em relação ao Oracle, mas no conceito em sua essência, não há divergências. O objetivo é materializar os dados para que as consultas sejam mais rápidas. Todos os três o fazem.

    [ ]s,

    Gustavo Maia Aguiar
    http://gustavomaiaaguiar.spaces.live.com

    Compêndio de XML – Preparação para o exame 70-433 - MCTS Microsoft SQL Server 2008 - Database Development
    http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!1161.entry


    Classifique as respostas. O seu feedback é imprescindível
    • Sugerido como Resposta Gustavo Maia Aguiar segunda-feira, 27 de dezembro de 2010 04:55
    • Marcado como Resposta Eder Costa segunda-feira, 3 de janeiro de 2011 16:59
    segunda-feira, 27 de dezembro de 2010 04:55
  • Soh relembrando.... o SQL Server não possui View Materializada (Oracle). O que ele tem, é a view indexada , que é "similar" às views materializada do oracle. O sql server 2008 suporta view indexada...

    Rafael Melo

    Bem lembrado Rafael, é que estou estudando Oracle também e acabei misturando....ahhahehe

    Valeu!

    quarta-feira, 29 de dezembro de 2010 12:27