Sql server 从2个不同的基在2个表上创建触发器
你好,我正在做一个扳机。此触发器能够比较从基F插入到我的表DOUBLON中的数据和从基T插入到客户机中的数据。 如果存在类似的TEL、TELPOR、TELPRO、TELDOM,那么它将更新F.DOUBLON.DOUBLON='OUI',否则它将放入一个'NON'。 我在我桌上的F座上创建了触发器 这就是我所做的:Sql server 从2个不同的基在2个表上创建触发器,sql-server,database,triggers,insert,Sql Server,Database,Triggers,Insert,你好,我正在做一个扳机。此触发器能够比较从基F插入到我的表DOUBLON中的数据和从基T插入到客户机中的数据。 如果存在类似的TEL、TELPOR、TELPRO、TELDOM,那么它将更新F.DOUBLON.DOUBLON='OUI',否则它将放入一个'NON'。 我在我桌上的F座上创建了触发器 这就是我所做的: CREATE TRIGGER DoublonInserted ON dbo.DOUBLON AFTER INSERT AS DECLARE
CREATE TRIGGER DoublonInserted
ON dbo.DOUBLON
AFTER INSERT
AS
DECLARE @doublon INTEGER
SELECT @doublon = 0
IF SELECT count(C.TEL)
FROM T.dbo.CLIENT AS C , inserted AS I
where I.TEL = C.TEL
OR I.TEL = C.TELDOM
OR I.TEL = C.TELPRO
OR I.TEL = C.TELPOR
OR I.TELDOM = C.TEL
OR I.TELDOM = C.TELDOM
OR I.TELDOM = C.TELPRO
OR I.TELDOM = C.TELPOR
OR I.TELPRO = C.TEL
OR I.TELPRO = C.TELDOM
OR I.TELPRO = C.TELPRO
OR I.TELPRO = C.TELPOR
OR I.TELPOR = C.TEL
OR I.TELPOR = C.TELDOM
OR I.TELPOR = C.TELPRO
OR I.TELPOR = C.TELPOR) > 1
BEGIN
UPDATE dbo.DOUBLON
SET DOUBLON = 'OUI' --, @doublon = 0
FROM T.dbo.CLIENT AS C, inserted AS I
where I.TEL = C.TEL
OR I.TEL = C.TELDOM
OR I.TEL = C.TELPRO
OR I.TEL = C.TELPOR
OR I.TELDOM = C.TEL
OR I.TELDOM = C.TELDOM
OR I.TELDOM = C.TELPRO
OR I.TELDOM = C.TELPOR
OR I.TELPRO = C.TEL
OR I.TELPRO = C.TELDOM
OR I.TELPRO = C.TELPRO
OR I.TELPRO = C.TELPOR
OR I.TELPOR = C.TEL
OR I.TELPOR = C.TELDOM
OR I.TELPOR = C.TELPRO
OR I.TELPOR = C.TELPOR
END
ELSE
BEGIN
UPDATE dbo.DOUBLON
SET DOUBLON = 'NON' --, @doublon = 0
FROM T.dbo.CLIENT AS C, inserted AS I
where I.TEL != C.TEL
OR I.TEL != C.TELDOM
OR I.TEL != C.TELPRO
OR I.TEL != C.TELPOR
OR I.TELDOM != C.TEL
OR I.TELDOM != C.TELDOM
OR I.TELDOM != C.TELPRO
OR I.TELDOM != C.TELPOR
OR I.TELPRO != C.TEL
OR I.TELPRO != C.TELDOM
OR I.TELPRO != C.TELPRO
OR I.TELPRO != C.TELPOR
OR I.TELPOR != C.TEL
OR I.TELPOR != C.TELDOM
OR I.TELPOR != C.TELPRO
OR I.TELPOR != C.TELPOR
END
事实上,这是可行的,但事实并非如此:
个案工作。
工作如果我的插入中有任何重复项,则为插入的每一行在我的列doublon中触发设置“NON”。
如果我的插入中只有重复项,则为插入的每行在我的列doublon中触发设置“OUI”
箱子坏了。
如果存在重复项且未插入重复项,则不工作
我试图重置我的var@doublon,但还是一样
我注意到,我的触发器将我的测试的最后结果放在了doublon列的所有行上。如果最新插入是重复数据,则所有行都将显示“是”,反之亦然
我想有人帮我解释一下原因,或者用另一种方法来使用触发器
我不能触摸数据库,不能添加列等
++基地在同一台服务器上++
谢谢你的时间和帮助
编辑:
表客户端
多布隆表
ID\u客户端->int
我想要的是:
在Doublon上设置正确的值
其他所有内容varchar50您只需要一个查找双精度查询:
CREATE TRIGGER DoublonInserted
ON dbo.DOUBLON
AFTER INSERT
AS BEGIN
IF EXISTS(
select * from
FROM T.dbo.CLIENT AS C, inserted AS I
where I.TEL = C.TEL
OR I.TEL = C.TELDOM
OR I.TEL = C.TELPRO
OR I.TEL = C.TELPOR
OR I.TELDOM = C.TEL
OR I.TELDOM = C.TELDOM
OR I.TELDOM = C.TELPRO
OR I.TELDOM = C.TELPOR
OR I.TELPRO = C.TEL
OR I.TELPRO = C.TELDOM
OR I.TELPRO = C.TELPRO
OR I.TELPRO = C.TELPOR
OR I.TELPOR = C.TEL
OR I.TELPOR = C.TELDOM
OR I.TELPOR = C.TELPRO
OR I.TELPOR = C.TELPOR)
UPDATE dbo.DOUBLON
SET DOUBLON = 'OUI'
WHERE ID_CLIENT = I.ID_CLIENT;
ELSE
UPDATE dbo.DOUBLON
SET DOUBLON = 'NON'
WHERE ID_CLIENT = I.ID_CLIENT;
END
我想我现在明白你的意思了。下面是如何将其创建为一个替代触发器。这应该很接近
CREATE TRIGGER DoublonInserted
ON dbo.DOUBLON
INSTEAD OF INSERT AS
BEGIN
SET NOCOUNT ON;
INSERT DOUBLON
(
ID_CLIENT
, NOM
, PRENOM
, TEL
, TELDOM
, TELPRO
, TELPOR
, DOUBLON
)
select i.ID_CLIENT
, i.NOM
, i.PRENOM
, i.TEL
, i.TELDOM
, i.TELPRO
, i.TELPOR
, case when
I.TEL = C.TEL
OR I.TEL = C.TELDOM
OR I.TEL = C.TELPRO
OR I.TEL = C.TELPOR
OR I.TELDOM = C.TEL
OR I.TELDOM = C.TELDOM
OR I.TELDOM = C.TELPRO
OR I.TELDOM = C.TELPOR
OR I.TELPRO = C.TEL
OR I.TELPRO = C.TELDOM
OR I.TELPRO = C.TELPRO
OR I.TELPRO = C.TELPOR
OR I.TELPOR = C.TEL
OR I.TELPOR = C.TELDOM
OR I.TELPOR = C.TELPRO
OR I.TELPOR = C.TELPOR
THEN 'OUI'
ELSE 'NON'
END
FROM inserted AS I
join T.dbo.CLIENT AS C on c.ID_CLIENT = i.ID_CLIENT;
END
细节上仍然很模糊,但我想你想要这样的东西
CREATE TRIGGER DoublonInserted
ON dbo.DOUBLON
INSTEAD OF INSERT AS
BEGIN
SET NOCOUNT ON;
INSERT DOUBLON
(
ID_CLIENT
, NOM
, PRENOM
, TEL
, TELDOM
, TELPRO
, TELPOR
, DOUBLON
)
select i.ID_CLIENT
, i.NOM
, i.PRENOM
, i.TEL
, i.TELDOM
, i.TELPRO
, i.TELPOR
, CASE
when C.TEL IS NULL
OR C.TELPRO IS NULL
OR C.TELDOM IS NULL
OR C.TELPOR IS NULL
THEN 'NON'
ELSE 'OUI'
END
FROM inserted AS I
left join T.dbo.CLIENT AS C on I.TEL = C.TEL
OR I.TEL = C.TELPRO
OR I.TEL = C.TELDOM
OR I.TEL = C.TELPOR
END
好的!答案如下:
CREATE TRIGGER DoublonInserted
ON dbo.DOUBLON
INSTEAD OF INSERT AS
BEGIN
INSERT INTO DOUBLON
(
ID_CLIENT
, NOM
, PRENOM
, TEL
, TELDOM
, TELPRO
, TELPOR
, DOUBLON
)
select i.ID_CLIENT
, i.NOM
, i.PRENOM
, i.TEL
, i.TELDOM
, i.TELPRO
, i.TELPOR
, CASE
when I.TEL = C.TEL
OR I.TEL = C.TELDOM
OR I.TEL = C.TELPRO
OR I.TEL = C.TELPOR
OR I.TELDOM = C.TEL
OR I.TELDOM = C.TELDOM
OR I.TELDOM = C.TELPRO
OR I.TELDOM = C.TELPOR
OR I.TELPRO = C.TEL
OR I.TELPRO = C.TELDOM
OR I.TELPRO = C.TELPRO
OR I.TELPRO = C.TELPOR
OR I.TELPOR = C.TEL
OR I.TELPOR = C.TELDOM
OR I.TELPOR = C.TELPRO
OR I.TELPOR = C.TELPOR
THEN 'OUI'
ELSE 'NON'
END
FROM inserted AS I
left join T.dbo.CLIENT AS C
on I.TEL = C.TEL
OR I.TEL = C.TELDOMICIL
OR I.TEL = C.TELPRO
OR I.TEL = C.TELPOR
OR I.TELDOM = C.TEL
OR I.TELDOM = C.TELDOM
OR I.TELDOM = C.TELPRO
OR I.TELDOM = C.TELPOR
OR I.TELPRO = C.TEL
OR I.TELPRO = C.TELDOM
OR I.TELPRO = C.TELPRO
OR I.TELPRO = C.TELPOR
OR I.TELPOR = C.TEL
OR I.TELPOR = C.TELDOM
OR I.TELPOR = C.TELPRO
OR I.TELPOR = C.TELPOR
END
多亏了@Sean Lange你做到了@波希米亚人♦ 还有其他人 -25年前,在ANSI-92 SQL标准中,旧式的逗号分隔表格列表样式被正确的ANSI JOIN语法所取代,因此不鼓励使用这种样式。您能否请一位母语为英语的人帮助您重新编写问题?我试着读了,但我就是读不懂。你这里有一些严重的逻辑问题。首先,update语句将更新DOUBLON中的每一行。其次,如果第一个条件为true,它将只运行第一个update语句,否则它将运行第二个update语句。您的插入中可能有满足这两个条件的数据。我将尝试您的语法@marc_s谢谢您的提示!我们不想一行一行地写任何东西。相反,它应该是基于设置的更新。我不能提供太多,因为我不知道你们的桌子是什么样子。这是一个很好的起点。sql server中没有BEFORE触发器。这里发布的语法对sql server无效。@sean现在呢?我不会说sql Server是的。。。我试着在Oracle db上这样做,但sql server以前不接受,这就是我后来写的原因。我应该使用而不是吗?在两个更新中都需要连接。逻辑似乎相当接近,但这需要成为一个而不是触发器。由于这是一个插入触发器,我们可能在DOUBLON中还没有一行。我们仍然存在这样一个问题,即两个结果都是真的,因为sql server中的触发器在每个操作中都会触发一次。如果插入两行,则插入的虚拟表将有两行。还有一个问题。ID_客户端与I.ID_客户端不同不要问我为什么我不是构建体系结构的人…c.ID_客户端=I.ID_客户端每次都是假的,因为我从CSV文件插入,而ID_客户端从该文件以1、2、3开始…好的。我在这里猜测是因为我没有多少细节要处理。如何知道插入的新行与客户端中的现有行相关?也许您只需要修改连接谓词?我们不希望电话号码重复,所以我们会在这方面测试什么是您需要注意的。如果除TEL、TELPRO、TELDOM、TELPOR之外,所有数据都相同,则行不被视为重复。@PandaRasta请参阅我的最新编辑。我仍然有点猜测你的要求,但我认为这更接近你想要的。我现在没有访问DB的权限,所以我将在明天早上测试它。谢谢你的帮助和时间!