none
Stored Procedure retornando erro. RRS feed

  • Pergunta

  • Boa Noite, Pessoal !

       Estou rodando uma procedure no banco de dados AdventureWorks2008R2, e esta dando o seguinte erro: 

       Msg 208, Level 16, State 1, Procedure log, Line 7
       Invalid object name 'ddl_log'.

       Script abaixo:

       use AdventureWorks2008R2 
       GO

    create procedure dbo.asp_reindex @database SYSNAME, @fragpercent INT
    AS 
    Declare @cmd    nvarchar(max),
            @table  SYSNAME,
            @schema SYSNAME
    --usando um cursor para propositos de demonstração
    --Também poderia fazer isso com uma variavel de tabela e um loop while        
    DECLARE curtable CURSOR FOR
      select distinct OBJECT_SCHEMA_NAME(object_id,database_id)
    SchemaName, 
       OBJECT_NAME(OBJECT_ID,database_id) TableName
       from sys.dm_db_index_physical_stats (DB_ID(@database),null,null,null,'sampled')
       where avg_fragmentation_in_percent >= @fragpercent 
       for read only

       open curtable
       fetch curtable into @schema, @table  

       WHILE @@FETCH_STATUS = 0

       BEGIN
         set @cmd = 'alter index all on' + @database + '.' + @schema + '.' + @table + 'REBUILD WITH (ONLINE = ON)'
       --tenta construção ONLINE primeiro, se falhar,muda para construção OFFLINE

       BEGIN TRY
          exec sp_executesql @cmd 
       END TRY
       BEGIN CATCH
         BEGIN 
           SET @cmd = 'alter index all ON' + @database + '.' + @schema + '.' + @table + 'REBUILD WITH (ONLINE = OFF)'
           EXEC sp_executesql @cmd
         END
         END CATCH
         FETCH curtable INTO @schema, @table
       END

       close curtable
       DEALLOCATE curtable
       GO

       Obrigado.

                   
    sexta-feira, 6 de setembro de 2013 02:54

Respostas

  • Boa noite Heitor,

    Mas que diabos é o tal 'ddl_log' que não existe, já que nem mencionado no corpo da procedure ele está?

    Bem, eu tenho um forte palpite: tem uma trigger no seu banco de dados ou instância que "loga" qualquer comando DDL que você fizer.

    Você está tentando criar uma procedure.  Essa Trigger identificou o seu CREATE (ou o ALTER INDEX) e de alguma forma tenta registrar isso em uma tabela (a ddl_log) que provavelmente não existe. Recomendo, então, que você ou apague essa trigger (se ela não for necessária e isso for possível) ou gere um script da mesma (se ela não tiver encriptada) e verifique o que ela faz e quais são os campos recebe, pra tentar criar essa tabela e então seguir adiante com o que você deseja.

    Agora, sinceramente, não sei se essa trigger é de tabela, servidor, tabela...

    Pode verificar pra gente?

    Procurar no servidor:

    select * from sys.server_triggers

    Procurar no banco

    select * from AdventureWorks2008R2.sys.triggers

    Ou use a interface do SSMS se preferir.

    Att


    - :)



    sexta-feira, 6 de setembro de 2013 03:31
  • Show de bola. Quem bom que pode resolver seu problema! Disponha.

    []'s


    - :)

    • Marcado como Resposta Heitor Arantes sábado, 7 de setembro de 2013 16:55
    sábado, 7 de setembro de 2013 04:07

Todas as Respostas

  • Boa noite Heitor,

    Mas que diabos é o tal 'ddl_log' que não existe, já que nem mencionado no corpo da procedure ele está?

    Bem, eu tenho um forte palpite: tem uma trigger no seu banco de dados ou instância que "loga" qualquer comando DDL que você fizer.

    Você está tentando criar uma procedure.  Essa Trigger identificou o seu CREATE (ou o ALTER INDEX) e de alguma forma tenta registrar isso em uma tabela (a ddl_log) que provavelmente não existe. Recomendo, então, que você ou apague essa trigger (se ela não for necessária e isso for possível) ou gere um script da mesma (se ela não tiver encriptada) e verifique o que ela faz e quais são os campos recebe, pra tentar criar essa tabela e então seguir adiante com o que você deseja.

    Agora, sinceramente, não sei se essa trigger é de tabela, servidor, tabela...

    Pode verificar pra gente?

    Procurar no servidor:

    select * from sys.server_triggers

    Procurar no banco

    select * from AdventureWorks2008R2.sys.triggers

    Ou use a interface do SSMS se preferir.

    Att


    - :)



    sexta-feira, 6 de setembro de 2013 03:31
  • Renato, eu verifiquei e a Trigger Log, no banco de dados AdventureWorks2008R2, eu deletei esse comando e a stored procedure rodou normalmente

    Obrigado.

    sábado, 7 de setembro de 2013 01:02
  • Show de bola. Quem bom que pode resolver seu problema! Disponha.

    []'s


    - :)

    • Marcado como Resposta Heitor Arantes sábado, 7 de setembro de 2013 16:55
    sábado, 7 de setembro de 2013 04:07