Ir para conteúdo
Fórum Script Brasil
  • 0

Criar Trigger dentro de um Stored Procedure


moliveira

Pergunta

Olá,

Estou a implementar um sistema de histórico para uma aplicação parametrizável ao nível do utilizador. O que pretendo fazer é uma tabela que armazena os campos que se pretende auditar que contem os seguintes campos:

- TableField

- TableName

- DescriptionToShow

ao inserir ou eliminar um campo para histórico é executado um trigger que invoca um procedimento e caso seja um insert irá criar/actualizar um tabela 'TableName'_History e criar um trigger para 'vigiar' as alterações naquele campo.

Isto no final é um bocado mais complexo, mas agora estou com o seguinte problema:

Este stored procedure é só para testes,

ALTER PROCEDURE [dbo].[create_track_changes_field]

@TableName varchar(50) = '',

@FieldName varchar(50) = ''

AS

Declare @SQLCreateOrUpdateTrigger nvarchar(500)

Declare @SQLCreateTable nvarchar(500)

Select @SQLCreateTable = N'

CREATE TABLE [dbo].['+@TableName+'_History](

[id] [int] IDENTITY(1,1) NOT NULL,

[OldField] [nvarchar](50) NULL,

[NewField] [nvarchar](50) NULL,

[LineId] [int] NOT NULL,

[userId] [int] NOT NULL,

[FieldDescription] [nvarchar](50) NULL,

CONSTRAINT [PK_'+@TableName+'_History] PRIMARY KEY CLUSTERED

(

[id] ASC

)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]

) ON [PRIMARY]'

Select @SQLCreateOrUpdateTrigger = N'

CREATE TRIGGER '+@TableName+@FieldName+' ON dbo.'+@TableName+'

AFTER UPDATE, INSERT, DELETE

AS

DECLARE @OldValue varchar(150)

DECLARE @NewValue varchar(150)

DECLARE @LineId int

DECLARE @UserId int

DECLARE @Description nvarchar(100)

SELECT @OldValue = Name FROM DELETED;

SELECT @NewValue = Name FROM INSERTED;

SELECT @LineId = Id FROM INSERTED;

SELECT @UserId = UpdatedBy FROM INSERTED;

SET @Description =(SELECT [DescriptionToShow] FROM [dbo].[HistoryFields] where [FieldName] = '''+@FieldName+''');

BEGIN

PRINT(''123'');

END'

BEGIN

PRINT(''+@TableName+'_History')

--Exec SP_ExecuteSQL @SQLCreateTable

Exec SP_ExecuteSQL @SQLCreateOrUpdateTrigger

Print('sdf')

END

Na execução do procedimento a linha a vermelho está a dar o seguinte erro:

Msg 105, Level 15, State 1, Procedure ClientName, Line 14

Unclosed quotation mark after the character string 'd'.

Msg 102, Level 15, State 1, Procedure ClientName, Line 14

Incorrect syntax near 'd'.

Ao meter a linha em comentário, o trigger é criado da seguinte forma:

set ANSI_NULLS ON

set QUOTED_IDENTIFIER ON

GO

ALTER TRIGGER [dbo].[ClientName] ON [dbo].[Client]

AFTER UPDATE, INSERT, DELETE

AS

DECLARE @OldValue varchar(150)

DECLARE @NewValue varchar(150)

DECLARE @LineId int

DECLARE @UserId int

DECLARE @Description nvarchar(100)

SELECT @OldValue = Name FROM DELETED;

SELECT @NewValue = Name FROM INSERTED;

SELECT @LineId = Id FROM INSERTED;

SELECT @UserId = UpdatedBy FROM INSERTED;

--SET @Description = (SELECT [DescriptionToShow] FROM

Não assume a linha por completo.

alguém me consegue ajudar?

Obrigado

Link para o comentário
Compartilhar em outros sites

1 resposta a esta questão

Posts Recomendados

  • 0
Olá,

Estou a implementar um sistema de histórico para uma aplicação parametrizável ao nível do utilizador. O que pretendo fazer é uma tabela que armazena os campos que se pretende auditar que contem os seguintes campos:

- TableField

- TableName

- DescriptionToShow

ao inserir ou eliminar um campo para histórico é executado um trigger que invoca um procedimento e caso seja um insert irá criar/actualizar um tabela 'TableName'_History e criar um trigger para 'vigiar' as alterações naquele campo.

Isto no final é um bocado mais complexo, mas agora estou com o seguinte problema:

Este stored procedure é só para testes,

ALTER PROCEDURE [dbo].[create_track_changes_field]

@TableName varchar(50) = '',

@FieldName varchar(50) = ''

AS

Declare @SQLCreateOrUpdateTrigger nvarchar(500)

Declare @SQLCreateTable nvarchar(500)

Select @SQLCreateTable = N'

CREATE TABLE [dbo].['+@TableName+'_History](

[id] [int] IDENTITY(1,1) NOT NULL,

[OldField] [nvarchar](50) NULL,

[NewField] [nvarchar](50) NULL,

[LineId] [int] NOT NULL,

[userId] [int] NOT NULL,

[FieldDescription] [nvarchar](50) NULL,

CONSTRAINT [PK_'+@TableName+'_History] PRIMARY KEY CLUSTERED

(

[id] ASC

)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]

) ON [PRIMARY]'

Select @SQLCreateOrUpdateTrigger = N'

CREATE TRIGGER '+@TableName+@FieldName+' ON dbo.'+@TableName+'

AFTER UPDATE, INSERT, DELETE

AS

DECLARE @OldValue varchar(150)

DECLARE @NewValue varchar(150)

DECLARE @LineId int

DECLARE @UserId int

DECLARE @Description nvarchar(100)

SELECT @OldValue = Name FROM DELETED;

SELECT @NewValue = Name FROM INSERTED;

SELECT @LineId = Id FROM INSERTED;

SELECT @UserId = UpdatedBy FROM INSERTED;

SET @Description =(SELECT [DescriptionToShow] FROM [dbo].[HistoryFields] where [FieldName] = '''+@FieldName+''');

BEGIN

PRINT(''123'');

END'

BEGIN

PRINT(''+@TableName+'_History')

--Exec SP_ExecuteSQL @SQLCreateTable

Exec SP_ExecuteSQL @SQLCreateOrUpdateTrigger

Print('sdf')

END

Na execução do procedimento a linha a vermelho está a dar o seguinte erro:

Msg 105, Level 15, State 1, Procedure ClientName, Line 14

Unclosed quotation mark after the character string 'd'.

Msg 102, Level 15, State 1, Procedure ClientName, Line 14

Incorrect syntax near 'd'.

Ao meter a linha em comentário, o trigger é criado da seguinte forma:

set ANSI_NULLS ON

set QUOTED_IDENTIFIER ON

GO

ALTER TRIGGER [dbo].[ClientName] ON [dbo].[Client]

AFTER UPDATE, INSERT, DELETE

AS

DECLARE @OldValue varchar(150)

DECLARE @NewValue varchar(150)

DECLARE @LineId int

DECLARE @UserId int

DECLARE @Description nvarchar(100)

SELECT @OldValue = Name FROM DELETED;

SELECT @NewValue = Name FROM INSERTED;

SELECT @LineId = Id FROM INSERTED;

SELECT @UserId = UpdatedBy FROM INSERTED;

--SET @Description = (SELECT [DescriptionToShow] FROM

Não assume a linha por completo.

alguém me consegue ajudar?

Obrigado

bem... descobri o erro.... esta foi muito má... a variavel @SQLCreateOrUpdateTrigger não tinha caracteres suficientes

Link para o comentário
Compartilhar em outros sites

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.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,5k
×
×
  • Criar Novo...