【发布时间】:2016-12-09 13:25:11
【问题描述】:
我有这 3 张桌子:
而且我需要建立一个触发器:约会(“encontro”)只有在 2 个个人资料(“perfis”)之间存在友谊(“amizade”)时才有效。
我已经创建了这个触发器,但我感到迷茫..帮助我
CREATE TRIGGER relaçoes_after_insert
ON encontros
INSTEAD OF insert -
as
begin
declare @idperfilA int;
declare @idperfilB int;
declare @data datetime;
declare @count int;
declare cursor_1 cursor for select * from inserted;
open cursor_1;
fetch next from cursor_1 into @idperfilA, @idperfilB, @data;
WHILE @@FETCH_STATUS = 0
BEGIN
if exists( select * from inserted i, amizade a
where i.IDPERFILA = a.IDPERFILA and i.IDPERFILB = a.IDPERFILB and GETDATE() > DATA)
RAISERROR('there isnt friendship', 16, 10);
else
insert into ENCONTROS select * from inserted;
end;
fetch next from cursor_1 into @idperfilA, @idperfilB, @data;
END
close cursor_1;
deallocate cursor_1;
【问题讨论】:
-
插入记录上的
IDPERFILA和IDPERFILB值是否总是与AMIZADE表中对应的A 或B 值匹配?或者你会遇到@idperfilA=AMIZADE.IDPERFILB和@idperfilB=AMIZADE.IDPERFILA的情况吗? -
我可能有点糊涂,但
if exists ...where i.idperfila = a.idperfila and i.idperfilb = a.idperfilb and getdate() > data不是说有有友谊吗? -- 此外,您不需要光标。 -
@SqlZim 我假设游标是用来处理多行插入的(就像在this question 中一样) - 即使可能是这种情况,它仍然没有必要吗?
-
应该是
if not exists。 @3N1GM4,需要使用游标或临时表才能通过多行插入引发错误。为了避免游标,她可以将插入和 amizade 的左连接插入临时表,检查空值,如果有则引发错误,否则插入 encontros。我怀疑临时表方法可能会稍微快一些。 -
Raquel,您应该避免使用隐式连接(使用
,),而应使用join运算符来使用显式连接。
标签: sql-server triggers sql-update sql-insert