Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 использование Полей таблицы в триггере  [new]
gds
Member

Откуда: Железнодорожный
Сообщений: 1842
Блог
Добрый день.
Подскажите, как мне можно использовать значение полей в триггере.
Суть следующая, после вставки в таблицу А необходимо добавлять данные в таблицу Б.
триггер
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TRIGGER dbo.tgr_AddModule 
   ON  dbo.Modules 
   AFTER INSERT
AS 
BEGIN
	declare @MOD int;
	@MOD = select moduleId from Inserted;
	SET NOCOUNT ON;
	insert into allRight(ModuleID,RoleID,IsInsert,IsUpdate,IsSelect,IsDelete,state)	
	values(@MOD,1,1,1,1,1,1);
END
GO

таблица А
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[Modules](
	[ModuleId] [int] IDENTITY(1,1) NOT NULL,
	[ModuleName] [nvarchar](50) NOT NULL,
	[ModuleDescription] [ntext] NULL,
 CONSTRAINT [PK_Modules] PRIMARY KEY CLUSTERED 
(
	[ModuleId] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

GO

Таблица Б
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[AllRight](
	[RightID] [int] IDENTITY(1,1) NOT NULL,
	[ModuleID] [int] NOT NULL,
	[RoleID] [int] NOT NULL,
	[IsInsert] [bit] NOT NULL,
	[IsUpdate] [bit] NOT NULL,
	[IsSelect] [bit] NOT NULL,
	[IsDelete] [bit] NOT NULL,
	[state] [bit] NOT NULL,
 CONSTRAINT [PK_Right] PRIMARY KEY CLUSTERED 
(
	[RightID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

ALTER TABLE [dbo].[AllRight]  WITH CHECK ADD  CONSTRAINT [FK_AllRight_Modules] FOREIGN KEY([ModuleID])
REFERENCES [dbo].[Modules] ([ModuleId])
ON DELETE CASCADE
GO

ALTER TABLE [dbo].[AllRight] CHECK CONSTRAINT [FK_AllRight_Modules]
GO

ALTER TABLE [dbo].[AllRight]  WITH CHECK ADD  CONSTRAINT [FK_Right_Roles] FOREIGN KEY([RoleID])
REFERENCES [dbo].[Roles] ([RoleID])
ON DELETE CASCADE
GO

ALTER TABLE [dbo].[AllRight] CHECK CONSTRAINT [FK_Right_Roles]
GO

ALTER TABLE [dbo].[AllRight] ADD  CONSTRAINT [DF_Rigth_IsInsert]  DEFAULT ((0)) FOR [IsInsert]
GO

ALTER TABLE [dbo].[AllRight] ADD  CONSTRAINT [DF_Rigth_IsUpdate]  DEFAULT ((0)) FOR [IsUpdate]
GO

ALTER TABLE [dbo].[AllRight] ADD  CONSTRAINT [DF_Rigth_IsSelect]  DEFAULT ((1)) FOR [IsSelect]
GO

ALTER TABLE [dbo].[AllRight] ADD  CONSTRAINT [DF_Rigth_IsDelete]  DEFAULT ((0)) FOR [IsDelete]
GO

ALTER TABLE [dbo].[AllRight] ADD  CONSTRAINT [DF_Rigth_state]  DEFAULT ((1)) FOR [state]
GO


Прочитал топик и MSDN, но видимо плохо читал.

С Уважением gds.
Одна из основных проблем человека - проблема выбора.
14 авг 09, 12:19    [7538506]     Ответить | Цитировать Сообщить модератору
 Re: использование Полей таблицы в триггере  [new]
Glory
Member

Откуда:
Сообщений: 104760
CREATE TRIGGER dbo.tgr_AddModule 
   ON  dbo.Modules 
   AFTER INSERT
AS 
BEGIN
	SET NOCOUNT ON;
	insert into allRight(ModuleID,RoleID,IsInsert,IsUpdate,IsSelect,IsDelete,state)	
        select moduleId,1,1,1,1,1,1 from Inserted;
END
14 авг 09, 12:26    [7538573]     Ответить | Цитировать Сообщить модератору
 Re: использование Полей таблицы в триггере  [new]
caper
Member

Откуда: Москва
Сообщений: 418
gds,
между begin и end триггера оставьте только:
SET NOCOUNT ON;
insert into allRight(ModuleID,RoleID,IsInsert,IsUpdate,IsSelect,IsDelete,state)	
	select I.moduleId,,1,1,1,1,1,1
	from inserted I

так и при вставке нескольких значений все будет ок...
14 авг 09, 12:28    [7538589]     Ответить | Цитировать Сообщить модератору
 Re: использование Полей таблицы в триггере  [new]
gds
Member

Откуда: Железнодорожный
Сообщений: 1842
Блог
Glory, caper

спасибо.
14 авг 09, 12:30    [7538613]     Ответить | Цитировать Сообщить модератору
 Re: использование Полей таблицы в триггере  [new]
Glory
Member

Откуда:
Сообщений: 104760
ЗЫ
Синтаксис присвоения вообще то такой

declare @MOD int;
select @MOD=moduleId from Inserted;
14 авг 09, 12:30    [7538615]     Ответить | Цитировать Сообщить модератору
 Re: использование Полей таблицы в триггере  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Glory
ЗЫ
Синтаксис присвоения вообще то такой

declare @MOD int;
select @MOD=moduleId from Inserted;
Или такой:
SQL2008
declare @MOD int = (select moduleId from Inserted);

Если одно значение возвращается...
14 авг 09, 12:45    [7538738]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить