Триггер (возможно хранимая процедура) для замены текста при вставке новой записи? - PullRequest
0 голосов
/ 24 июня 2011

Я сталкиваюсь с загадкой.Разработанное нами приложение позволяет пользователям создавать ссылки на файлы, но ссылки создаются относительно сервера, на котором находится база данных 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.

Любая помощь приветствуется.Большое спасибо!

Ответы [ 3 ]

0 голосов
/ 24 июня 2011
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
0 голосов
/ 24 июня 2011

У меня нет способа проверить это.Замените базу данных именем базы данных, таблицу именем таблицы и столбец url именем столбца

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
0 голосов
/ 24 июня 2011

Я не знаю, почему компании настаивают на использовании переходных подключенных дисков вместо 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%'

Кстати, если вы ищете, чтобы сделатьесли вы уверены, что данные верны, то вы должны использовать эту логику в своем приложении.В идеале ваше приложение уже использует хранимые процедуры для обновления данных, поэтому вы можете добавить код, аналогичный приведенному выше, для обновления входящего параметра, который содержит 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)
...