• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

javac

Trigger inserir dados quando nova linha

17 mensagens neste tópico

Olá, criei um trigger mas estou a ter problemas pois o meu objectivo era quando o utilizador criar um novo/alterar registo o trigger preenche automaticamente um campo, colocando ele a true.

Funciona quando o registo já está criado, mas quando crio um novo não dá, pois o campo não permite dados a null e dá o erro que não permite null.

ALTER TRIGGER [dbo].[modificou_dados]

  ON  [dbo].[utilizador]

  FOR INSERT,UPDATE

AS

BEGIN

-- SET NOCOUNT ON added to prevent extra result sets from

-- interfering with SELECT statements.

SET NOCOUNT ON;

--set dbo.Utilizador.update = True;

--print 'actualizado';

Begin

update Utilizador set actualizar = 'True';

END

    -- Insert statements for trigger here

END

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Então o problema não tem a ver com o trigger certo? tem a ver com o campo estar a null na inserção!

mete a base de dados a meter false nesse campo por default

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Já coloquei por defeito e não insere, agora fica com um erro assim como mostra a imagem.

teste.jpg

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

porque não meter esse valor a true nos insert e o trigger apenas para updates?

mete aí o código do default

este actualizar = 'True' não me soa bem mas...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

eu usei a interface, mas o código é este:

GO

/****** Object:  Table [dbo].[utilizador]    Script Date: 02/07/2009 15:39:44 ******/

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO

CREATE TABLE [dbo].[utilizador](

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

[username] [nchar](10) NOT NULL,

[password] [nchar](20) NOT NULL,

[admin] [bit] NOT NULL,

[nome] [nchar](30) NOT NULL,

[morada] [nchar](80) NOT NULL,

[cod_postal] [int] NOT NULL,

[cod_postal2] [int] NULL,

[localidade] [nchar](20) NOT NULL,

[telefone] [int] NULL,

[telemovel] [int] NOT NULL,

[nchar](30) NOT NULL,

[actualizar] [bit] NOT NULL CONSTRAINT [DF_Utilizador_actualizar]  DEFAULT ('false'),

[data] [datetime] NOT NULL CONSTRAINT [DF_Utilizador_data]  DEFAULT (getdate()),

CONSTRAINT [PK_Utilizador_1] PRIMARY KEY CLUSTERED

(

[id_utilizador] ASC

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

) ON [PRIMARY]

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

o default não está bem

[teste] [bit] NOT NULL CONSTRAINT [DF_Table_1_teste]  DEFAULT ((0)),

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Coloquei a (0) e não actualiza automaticamente, aparece da mesma maneira que a outra imagem só depois se clicar no registo e dizer que quero executar slq, é que fica bem!! será que na aplicação funciona!?

teste2.jpg

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Coloquei a (0) e não actualiza automaticamente, aparece da mesma maneira que a outra imagem só depois se clicar no registo e dizer que quero executar slq, é que fica bem!! será que na aplicação funciona!?

teste2.jpg

Sim, é mesmo assim, isso na realidade não vai para a base de dados enquanto não fizeres execute, está apenas na interface gráfica

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Já estou mais descansado, obrigado pelas dicas. :P

Vou continuar então a fazer triggers    :D

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Agora tenho o problema de quando altero um registo altera o campo actualizar=true o problema é que quando faço execute o trigger coloca a true todos os registos, queria apenas que colocasse a true o registo que foi alterado.

GO

/****** Object:  Trigger [dbo].[modificou_dados]    Script Date: 02/07/2009 19:21:09 ******/

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO

-- =============================================

-- Author: <Author,,Name>

-- Create date: <Create Date,,>

-- Description: <Description,,>

-- =============================================

ALTER TRIGGER [dbo].[modificou_dados]

  ON  [dbo].[utilizador]

  AFTER UPDATE

AS

BEGIN

SET NOCOUNT ON;

Begin

update Utilizador set actualizar = 'TRUE';

END

END

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Pois o problema é que o trigger nao recebe o ID, nem queria ter que o chamar, pois pretendia na aplicação nao me preocupar com este campo...tipo quando altero um registo o trigger actualizava o campo a true.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

o trigger tem uma tabela chamada 'updated' onde estão todos os registos que foram modificados e dispararam o trigger, é lá que vais consultar os valores para o where

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

nao encontro nenhum exemplo com código! :S será que podes colocar um exemplo

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

qualquer coisa parecido com isto

ALTER TRIGGER [dbo].[modificou_dados]
   ON  [dbo].[utilizador]
   AFTER UPDATE
AS
BEGIN
   SET NOCOUNT ON;
   Begin
DECLARE @userID int
SET @userID = (SELECT userID FROM updated)
   update Utilizador set actualizar = 'TRUE' WHERE userID=@userID
   END
END

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boas já consegui, após várias tentativas aqui fica o código caso alguém tenha o mesmo problema de querer somente actualizar os registos que foram modificados:

ALTER TRIGGER [dbo].[modificou_dados]
   ON  [dbo].[utilizador]
   AFTER UPDATE
AS
BEGIN
   SET NOCOUNT ON;
Begin
	if (not update(actualizar))
	BEGIN
	UPDATE c
	SET c.actualizar='false'
	FROM utilizador c
	join inserted i
		ON c.id_utilizador=i.id_utilizador
	END
END
END

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora