Usuário com melhor resposta
Stored Procedure retornando erro.

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
GOObrigado.
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
- :)
- Editado Renato Siqueira sexta-feira, 6 de setembro de 2013 03:38
- Marcado como Resposta Heitor Arantes sexta-feira, 6 de setembro de 2013 14:35
-
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
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
- :)
- Editado Renato Siqueira sexta-feira, 6 de setembro de 2013 03:38
- Marcado como Resposta Heitor Arantes sexta-feira, 6 de setembro de 2013 14:35
-
-
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