Есть ли в любом случае для кэширования данных, которые могут быть использованы в триггере БД сервера SQL - PullRequest
1 голос
/ 07 января 2010

у меня есть таблица заказов, в которой есть столбец userID

У меня есть пользовательская таблица с идентификатором, именем,

Я хотел бы иметь триггер базы данных, который показывает вставку, обновление или удаление по имени.

так что мне нужно сделать это соединение между этими двумя таблицами на каждом триггере дб. Я думаю, что было бы лучше, если бы я мог сделать один запрос заранее, чтобы сопоставить пользователей с идентификаторами, а затем повторно использовать этот «поиск» в моих триггерах. , это возможно?

DECLARE @oldId int
DECLARE @newId int
DECLARE @oldName VARCHAR(100)
DECLARE @newName VARCHAR(100)

SELECT @oldId = (SELECT user_id FROM Deleted)
SELECT @newId = (SELECT user_id FROM Inserted)

SELECT @oldName = (SELECT name FROM users where id = @oldId)
SELECT @newName = (SELECT name FROM users where id = @newId)

  INSERT INTO History(id,  . . . 

Ответы [ 2 ]

3 голосов
/ 07 января 2010

Хорошие новости, вы уже используете кеш! Ваш SELECT name FROM users WHERE id = @id выберет имя для кэшированных страниц пула буферов. Поверьте, вы не сможете создать лучше настроенный, более масштабный и быстрый кеш, чем этот.

Кэширование результатов может иметь смысл на клиенте, где можно полностью избежать обращения к базе данных. Или может быть полезно кэшировать какой-то сложный и длительный результат запроса. Но внутри хранимой процедуры / триггера нет абсолютно никакого значения в кэшировании простого результата поиска по индексу.

0 голосов
/ 07 января 2010

Как насчет того, чтобы включить Change Data Capture, а затем избавиться от всего этого кода?

Отредактировано, чтобы добавить остальные:

На самом деле, если вы рассматриваете возможность использования скалярной функции для получения имени пользователя, то не делайте этого. Это действительно плохо из-за проблем, связанных с процедурными скалярными функциями. Вам было бы лучше с чем-то вроде:

INSERT dbo.History (id, ...)
SELECT i.id, ...
FROM inserted i 
JOIN deleted d    ON d.id = i.id
JOIN dbo.users u  ON u.user_id = i.user_id;

Поскольку user_id уникален, и у вас есть FK, когда он используется, это не должно быть большой проблемой. Но да, вам нужно повторять эту логику в каждом триггере. Если вы не хотите повторять логику, используйте Change Data Capture в SQL 2008.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...