![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как часть транзакции сделать безоткатной? [D7, MSSQL]
LAMER Pro © (2003-07-09 09:05:00)Уважаемые Мастера!
Наверняка Вам уже приходилось решать проблему аудита системы. Я мало знаком с SQL, а сейчас пишу ТЗ на программу, в которой необходимо фиксировать попытки пользователя произвести определённый набор действий с информацией в БД. В каждой ХП размещаю добавление записи в журнал аудита, но ведь при откате должны "отмениться" ВСЕ измениния в БД? Как быть - мне нужен аудит ВСЕХ действий, даже закончившихся неудачей?
Система ПОКА планируется "клиент-сервер", т.к. пользователй мало (50-70). Или придётся переходить на трёхзвенку?
Планирую использовать Delphi7 + MSSQL2K + ADO2.7 + MS Svr2K, клиенты Win98/Win2K
Буду рад любой идее.
LAMER Pro (2003-07-09 19:10:00) [21]to Smashich
UDF-User Define Function - функции определяемые пользователем, следовательно это не встроенная возможность - писать свою DLL, регистрировать (опять как?) в SQL, потом пользоваться?
Или разработчики Microsoft сами понасоздавали UDF?
По-моему как-то проще должно быть.
LAMER Pro (2003-07-09 18:25:00) [22]to handra
нет, всё-таки меня не понимают в этом мире...
это линейное выполнение транзакции с откатом до save point (точки сохранения). Вобщем, придётся отложить в сторону "грифель" и пробовать, пробовать, пробовать самому.
Блин, ещё бы этот SQL знать... каждую инструкцию придётся смотреть в BOL.
Smashich (2003-07-09 18:21:00) [23]через UDF(не помню как они у сиквела именуются) можна
LAMER Pro (2003-07-09 18:19:00) [24]to handra
спасибо, сейчас буду разбираться.
Одновременно ко всем вопрос-идея!
Можно ли с сервера писать текстовый файл логов?
handra (2003-07-09 17:39:00) [25]Пример из BOL:
BEGIN TRANSACTION royaltychange
UPDATE titleauthor
SET royaltyper = 65
FROM titleauthor, titles
WHERE royaltyper = 75
AND titleauthor.title_id = titles.title_id
AND title = "The Gourmet Microwave"
UPDATE titleauthor
SET royaltyper = 35
FROM titleauthor, titles
WHERE royaltyper = 25
AND titleauthor.title_id = titles.title_id
AND title = "The Gourmet Microwave"
SAVE TRANSACTION percentchanged
/*
After having updated the royaltyper entries for the two authors, the
user inserts the savepoint percentchanged, and then determines how a
10-percent increase in the book"s price would affect the authors" royalty earnings.
*/
UPDATE titles
SET price = price * 1.1
WHERE title = "The Gourmet Microwave"
SELECT (price * royalty * ytd_sales) * royaltyper
FROM titles, titleauthor
WHERE title = "The Gourmet Microwave"
AND titles.title_id = titleauthor.title_id
/*
The transaction is rolled back to the savepoint
with the ROLLBACK TRANSACTION statement.
*/
ROLLBACK TRANSACTION percentchanged
COMMIT TRANSACTION
/* End of royaltychange. */
Думаю все ясно...
Smashich (2003-07-09 17:38:00) [26]если ломиться читать то зачем тебе транзакции? потдтверждение чтения это я пока тока в The Bat! видел;)
вообще то маловато данных о том как ты хочешь логи вести, поэтому посоветовать тебе что то кроме выполнения паралельных, а не вложенных транзакций не знаю что. тоесть после тада уже выполнения транзакции основной ызывай транзакцию которая в лог запишет чего надо
LAMER Pro (2003-07-09 17:27:00) [27]to Smashich
триггер если вставить, обновить...
а если кто-то ломится читать и мне нужно знать когда это было, с какого компа и т.п.?
Smashich (2003-07-09 17:21:00) [28]используй триггеры
LAMER Pro (2003-07-09 17:17:00) [29]to Fay
Это относится и к хранимым процедурам?
CREATE PROC addEvent @uid, -- пользователь
@eid, -- событие
@oid int -- объект
AS
INSERT ...
GO
CREATE PROC Foo @i int
AS
...
ROLLBACK TRAN
GO
CREATE PROC chkDocument @oid int -- объект
AS
EXEC addEvent @@UserID, 17, @oid
BEGIN TRAN tr1
...
EXEC Foo 14
...
COMMIT TRAN tr1
GO
Как сделать здесь так, чтобы действия ХП addEvent сохранились в БД даже при "провале" Foo при выполнении chkDocument
Плз....
Max Zyuzin (2003-07-09 11:28:00) [30]>LAMER Pro © (09.07.03 10:26)
Ты читаешь не ту статью :) транзакции должны быть не вложенеми а параллено идти не завсия друг от друга
uuuu (2003-07-09 10:47:00) [31]Сделай два коннекшена к одной базе. Откаты в одном будешь фиксировать в другом. и во втором естественно не будет откатов.
Fay (2003-07-09 10:31:00) [32]Типа этого
begin tran tran1
insert into Table2 select 2, "blablabla"
commit tran tran1
begin tran tran2
insert into table1 select 1, "Ky-Ky"
rollnack tran tran2
LAMER Pro (2003-07-09 10:26:00) [33]to DenK_vrtz, Max Zyuzin
Если можно, то объясните подробнее, т.к. я вычитал следующее:
"Создание вложенной транзакции производится автоматически, если пользователь выполняет команду BEGIN TRAN до того, как будет завершена предыдущая транзакция. Не трудно прийти к выводу, что создание вложенной транзакции возможно только при использовании режима явного определения транзакции. В режиме автоматического начала транзакции каждая команда выполняется как отдельная транзакция, которая завершается сразу же после выполнения команды. Таким образом, образование вложенной транзакции просто невозможно. При работе в режиме неявного определения транзакции пользователь использует только команды ROLLBACK TRAN и COMMIT TRAN, тогда как команда BEGIN TRAN выполняется системой автоматически."
"Отдельно необходимо рассмотреть поведение вложенных транзакций в случае отката или фиксирования транзакций нижнего уровня. При использовании вложенных процедур каждая процедура нижнего уровня рассматривается как единственная команда, которая может завершиться либо удачно, либо нет. При удачном завершении транзакции нижнего уровня выполняется следующая команда текущей транзакции. Если же одна из вложенных транзакций любого уровня закончится неудачно (будет откачена), то это приведёт к откату всей вложенной транзакции. При этом, согласно требованиям ACID, ПРОИСХОДИТ ОТКАТ ВСЕХ ТРАНЗАКЦИЙ, в том числе и успешно завершённых."
Я это понял так: если в транзакции хотя бы один оператор сгенерит исключение, то будут отменены ВСЕ транзакции, даже завершённые по commit внутри хранимой процедуры.
Если я ошибаюсь, то помогите разобраться...
Max Zyuzin (2003-07-09 09:26:00) [34]>LAMER Pro © (09.07.03 09:05)
Делай заполнение журнала аудита в отдельной транзакции, специальной для именно этой таблички, Там думаю откаты тебе не понадобятся.
DenK_vrtz (2003-07-09 09:07:00) [35]commit чаще делай, я думаю в MSSQL есть такое понятие