所以,我試圖使用下面的觸發器,以便當表中的某行更新時,它會將一個特定列設置爲一個由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='ABCDEFGHIJKLMNOPQRSTUVWXYZ') 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 [email protected]))
BEGIN;
SET @Ref = LEFT(NEWID(), 8);
END;
UPDATE test_trigger SET [email protected] FROM inserted WHERE [email protected]_Col3;
FETCH NEXT FROM Ins_Curs
INTO @Ins_Col3;
END;
我不得不添加col3
作爲一個自增ID值,以便我可以識別每一行。 col1
因此只有這樣才能使用更新語句更改某些內容。
你的代碼應該可以工作,但我不確定你可以從GUID的前八個字節獲得一個隨機數有多好。見http://blogs.msdn.com/b/oldnewthing/archive/2008/06/27/8659071.aspx –
我認爲你應該嘗試與你的客戶談談使用UniqueIdentifier字段。 NEWID()函數總是會給你一個唯一的字符串。您將獲得性能提升,因爲您不會試圖確保您的價值已不在數據庫中。 UniqueIdentifier只有128位。您的八字符字段至少爲64位。額外的64位性能提升值得。 –
但這不是關於表演。這是關於讓客戶使用這種方式來識別推薦他們的人,而客戶並不認爲再讓他們打字或寫下來可能會造成問題。這也適用於測試系統,甚至可能持續超過一個月或兩個月。如果他們決定保持更長的時間,那麼我可能會與他們討論延長它的時間。 – sparrow