Bom dia a todos e desde já muito obrigado por sua atenção.
Estou precisando que as alterações efetuadas na estrutura da tabela TBFUNC sejam replicadas na tabela LOG_FUNC.
Exemplo o DBA por algum motivo alterou na tabela TBFUNC o tamanho da coluna NOME de varchar(50) para varchar(100) a idéia do gatilho é que essa alteração seja replicada na tabela LOG_FUNC que possui uma coluna com o mesmo nome e tem que ter obrigatoriamente o mesmo tipo de dados e tamanho.
Acredito que deva haver um meio de se fazer isso e na verdade criei este gatilho utilizando essas duas tabela como exemplo mas a ideia é que isso funcione para todas as tabelas de log que tenho no BD do sistema que estou desenvolvendo.
Agradeço mais uma vez sua colaboração e conto com sua ajuda, grande abraço e obrigado.
Segue abaixo o código do gatilho.
Atenciosamente,
Tadeu.
CREATE TRIGGER LOG_ALT_TBFUNC ON DATABASE FOR ALTER_TABLE
AS
-- Variáveis Gerais
DECLARE @V_COLID INT
-- Variáveis da Tabela de Dados
DECLARE @T_COLID VARCHAR(5)
DECLARE @T_COLUNA VARCHAR(100)
DECLARE @T_TIPO VARCHAR(100)
DECLARE @T_TAMANHO VARCHAR(10)
DECLARE @T_PREC VARCHAR(10)
DECLARE @T_ISNULLABLE CHAR(1)
-- Declarando Cursor
DECLARE LINHA CURSOR FOR
SELECT col.colid
, col.name AS Coluna
, tip.name AS Tipo
, col.length as Tamanho
, col.prec
, col.isnullable
FROM syscolumns col
INNER JOIN sysobjects tab ON tab.id = col.id
INNER JOIN systypes tip ON tip.xtype = col.xtype
WHERE tab.xtype
= 'U'
AND tab.name
= 'TBFUNC'
ORDER BY col.id
OPEN LINHA
FETCH NEXT FROM LINHA INTO @T_COLID, @T_COLUNA, @T_TIPO, @T_TAMANHO, @T_PREC, @T_ISNULLABLE
WHILE @@FETCH_STATUS = 0
BEGIN
SET @V_COLID = CAST(@T_COLID AS INTEGER) + 7
IF EXISTS(
SELECT col.colid
, col.name AS Coluna
FROM syscolumns col
INNER JOIN sysobjects tab ON tab.id = col.id
INNER JOIN systypes tip ON tip.xtype = col.xtype
WHERE tab.xtype
= 'U'
AND tab.name
= 'LOG_TBFUNC'
AND col.id
= LTRIM(RTRIM(CAST(@V_COLID AS VARCHAR(5))))
)
BEGIN
IF @T_TIPO IN ('CHAR', 'VARCHAR')
BEGIN --
ALTER TABLE LOG_FUNC ALTER COLUMN @T_COLUNA @T_TIPO + '(' + @T_TAMANHO + ')'; -- SEI QUE A SINTAXE DO COMANDO ALTER NÃO ACEITA ISSO MAS...
END
END
END
Pergunta
Oliveira.
Bom dia a todos e desde já muito obrigado por sua atenção.
Estou precisando que as alterações efetuadas na estrutura da tabela TBFUNC sejam replicadas na tabela LOG_FUNC.
Exemplo o DBA por algum motivo alterou na tabela TBFUNC o tamanho da coluna NOME de varchar(50) para varchar(100) a idéia do gatilho é que essa alteração seja replicada na tabela LOG_FUNC que possui uma coluna com o mesmo nome e tem que ter obrigatoriamente o mesmo tipo de dados e tamanho.
Acredito que deva haver um meio de se fazer isso e na verdade criei este gatilho utilizando essas duas tabela como exemplo mas a ideia é que isso funcione para todas as tabelas de log que tenho no BD do sistema que estou desenvolvendo.
Agradeço mais uma vez sua colaboração e conto com sua ajuda, grande abraço e obrigado.
Segue abaixo o código do gatilho.
Atenciosamente,
Tadeu.
CREATE TRIGGER LOG_ALT_TBFUNC ON DATABASE FOR ALTER_TABLE
AS
-- Variáveis Gerais
DECLARE @V_COLID INT
-- Variáveis da Tabela de Dados
DECLARE @T_COLID VARCHAR(5)
DECLARE @T_COLUNA VARCHAR(100)
DECLARE @T_TIPO VARCHAR(100)
DECLARE @T_TAMANHO VARCHAR(10)
DECLARE @T_PREC VARCHAR(10)
DECLARE @T_ISNULLABLE CHAR(1)
-- Declarando Cursor
DECLARE LINHA CURSOR FOR
SELECT col.colid
, col.name AS Coluna
, tip.name AS Tipo
, col.length as Tamanho
, col.prec
, col.isnullable
FROM syscolumns col
INNER JOIN sysobjects tab ON tab.id = col.id
INNER JOIN systypes tip ON tip.xtype = col.xtype
WHERE tab.xtype
= 'U'
AND tab.name
= 'TBFUNC'
ORDER BY col.id
OPEN LINHA
FETCH NEXT FROM LINHA INTO @T_COLID, @T_COLUNA, @T_TIPO, @T_TAMANHO, @T_PREC, @T_ISNULLABLE
WHILE @@FETCH_STATUS = 0
BEGIN
SET @V_COLID = CAST(@T_COLID AS INTEGER) + 7
IF EXISTS(
SELECT col.colid
, col.name AS Coluna
FROM syscolumns col
INNER JOIN sysobjects tab ON tab.id = col.id
INNER JOIN systypes tip ON tip.xtype = col.xtype
WHERE tab.xtype
= 'U'
AND tab.name
= 'LOG_TBFUNC'
AND col.id
= LTRIM(RTRIM(CAST(@V_COLID AS VARCHAR(5))))
)
BEGIN
IF @T_TIPO IN ('CHAR', 'VARCHAR')
BEGIN --
ALTER TABLE LOG_FUNC ALTER COLUMN @T_COLUNA @T_TIPO + '(' + @T_TAMANHO + ')'; -- SEI QUE A SINTAXE DO COMANDO ALTER NÃO ACEITA ISSO MAS...
END
END
END
Link para o comentário
Compartilhar em outros sites
0 respostass a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.