簡體   English   中英

插入新記錄時是否觸發(可能是存儲過程)替換文本?

[英]Trigger (possibly stored procedure) to replace text when a new record is inserted?

我遇到了障礙。 我們開發的應用程序允許用戶創建文件鏈接,但是鏈接是相對於SQL數據庫所在的服務器而不是相對於用戶創建的。

這是我需要發生的一些偽代碼。

when dbo.File_.Link_to_File has a prefix of '\\dc\App Share'
replace '\\dc\App Share' with 'Z:'

本質上,文件鏈接是相對於服務器( \\\\dc\\App Share )存儲的,但是我已將其映射為所有用戶計算機上的網絡驅動器(Z :)。 我需要一個觸發器,該觸發器將服務器路徑前綴替換為Z:

請記住,這是文件( \\\\dc\\App Share\\myfolder\\myfile.txt )的前綴(路徑),因此代碼只需查找此前綴並替換它即可。

它在SQL Server 2008 R2上運行。

任何幫助表示贊賞。 非常感謝!

我不知道為什么公司堅持使用瞬態映射驅動器而不是UNC路徑,但這應該可行。

UPDATE
    dbo.File_
SET
    Link_to_File = 'Z:' + SUBSTRING(Link_to_File, 15, LEN(Link_to_File) - 14)
WHERE
    Link_to_File LIKE '\\dc\App Share%'

順便說一句,如果您正在尋找a來確保以后的數據正確無誤,那么您應該將該邏輯放入您的應用程序中。 理想情況下,您的應用程序已經使用存儲過程來更新數據,因此您可以添加類似於上面的代碼來更新保存Link_to_File的傳入參數。 就像是:

IF (@Link_to_File LIKE '\\dc\App Share%')
    SET @Link_to_File = 'Z:' + SUBSTRING(Link_to_File, 15, LEN(Link_to_File) - 14)
CREATE TRIGGER File_Insert ON dbo.File
INSTEAD OF INSERT
AS
DECLARE @LinkColumn varchar(50)
SET @LinkColumn = (SELECT Link_to_File FROM INSERTED)
IF (LEFT(@LinkColumn, 1) <> 'Z')
BEGIN
     SELECT * INTO #Inserted FROM Inserted
     UPDATE #Inserted SET Link_to_File = REPLACE(Link_to_File,'\\dc\App Share','Z:')
     INSERT INTO dbo.File_ SELECT * FROM #Inserted
END
ELSE
     INSERT INTO dbo.File_SELECT * FROM Inserted

我沒有任何測試方法。 用db名稱替換數據庫,用表名稱替換表,用列名稱替換urlcolumn

CREATE TRIGGER trigger_name ON database.table
INSTEAD OF INSERT
AS
DECLARE @UriColumn varchar(150)
SET @UriColumn = (SELECT urlcolumn FROM INSERTED)
IF (@UriColumn like '\\dc\App Share' + '%')
BEGIN
     SET @UriColumn = replace(@UriColumn, '\\dc\App Share', 'Z:'
     SELECT * INTO #Inserted FROM Inserted
     UPDATE #Inserted SET urlcolumn = @UriColumn
     INSERT INTO table SELECT * FROM #Inserted
END
ELSE
     INSERT INTO table SELECT * FROM Inserted

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM