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

javac

Trigger inserir dados quando nova linha

Recommended Posts

javac

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

Share this post


Link to post
Share on other sites
javac

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]

Share this post


Link to post
Share on other sites
javac

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

Share this post


Link to post
Share on other sites
vitortomaz

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

Share this post


Link to post
Share on other sites
javac

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

Share this post


Link to post
Share on other sites
javac

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.

Share this post


Link to post
Share on other sites
vitortomaz

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

Share this post


Link to post
Share on other sites
javac

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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.