因此,我尝试使用以下触发器,以便在更新表中的行时,它将特定列设置为 8 个随机字母数字字符的字符串。触发器工作正常,只是结果必须是唯一的。在触发器之前它将是空白的,因此不会在服务器上强制执行此唯一性。这个想法是,一旦客户在流程中走得足够远,他们就会得到这个字符串,但之前不会,因为我们有很多没有走得那么远的客户。
触发:
CREATE TRIGGER test_rand
ON test_trigger
AFTER UPDATE
AS
UPDATE test_trigger set col2=(select
Random_String =
substring(x,(abs(checksum(newid()))%36)+1,1)+
substring(x,(abs(checksum(newid()))%36)+1,1)+
substring(x,(abs(checksum(newid()))%36)+1,1)+
substring(x,(abs(checksum(newid()))%36)+1,1)+
substring(x,(abs(checksum(newid()))%36)+1,1)+
substring(x,(abs(checksum(newid()))%36)+1,1)+
substring(x,(abs(checksum(newid()))%36)+1,1)+
substring(x,(abs(checksum(newid()))%36)+1,1)
from
(select x='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ') a) WHERE col2='';
GO
这个触发器是我使用一个只有两列的简单表运行的测试,col1
并且col2
. 我更新col1
了一堆行并col2
获得了看似随机的值,但是我知道两行可以获得相同的数字,如果可能的话,我想防止这种情况发生。
我曾想过在不存在该字符串的地方检查 select 语句本身,但我无法想出一个好的方法来做到这一点。
我是触发器的新手,所以如果我遗漏了一些简单的东西或者应该搜索一下,那么我为浪费你的时间而道歉。据我所知,这甚至可能是不可能的,但我想我应该在放弃并尝试其他事情之前先问清楚。
此外,在执行更新的脚本中没有这样做的原因是我无法从客户端得到关于哪些脚本实际执行此操作的直接答案。如果这不可能,我将只编写一个由 Windows 任务计划程序运行的任务,但我希望这样做。
我的解决方案
根据 usr 告诉我的内容,我创建了以下代码来满足我的要求:
CREATE TRIGGER test_rand
ON test_trigger
AFTER UPDATE
AS
DECLARE @Ins_Col3 int;
DECLARE Ins_Curs CURSOR FOR SELECT col3 FROM inserted;
DECLARE @Ref char(8);
OPEN Ins_Curs
FETCH NEXT FROM Ins_Curs
INTO @Ins_Col3;
WHILE @@FETCH_STATUS = 0
BEGIN;
SET @Ref = LEFT(NEWID(), 8);
WHILE(EXISTS(SELECT col2 from test_trigger WHERE col2=@Ref))
BEGIN;
SET @Ref = LEFT(NEWID(), 8);
END;
UPDATE test_trigger SET test_trigger.col2=@Ref FROM inserted WHERE test_trigger.col3=@Ins_Col3;
FETCH NEXT FROM Ins_Curs
INTO @Ins_Col3;
END;
我必须添加col3
一个自动递增的 id 值,以便我可以识别每一行。
col1
因此,只有在那里,我才能通过更新语句进行更改。