Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Подскажите, есть ли способ реализовать задуманное без джоба?  [new]
teCa
Member

Откуда:
Сообщений: 637
Есть задачка, в игре игроку выдается предмет, нужно у него забрать этот предмет через N времени. ID Таких предметов известен заранее.
Что делаю я:
Я повесил триггер на таблицу с предметами, как только в таблице появляется нужный мне предмет, я сохраняю uid предмета, id игрока и время получения в отдельную таблицу. Этих данных мне достаточно, что-бы этот предмет в дальнейшем забрать. Дальше мне нужно периодически заглядывать в эту табличку с выборкой по полю дата и искать предметы, которые пора удалять.
Ясно, что это можно сделать джобом, который будет периодически это делать. Хочется просто узнать, есть ли альтернативы?
5 июн 16, 12:13    [19259384]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите, есть ли способ реализовать задуманное без джоба?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37068
Добавить в таблицу поле, когда предмет протухает, и после просто не выбирать запись из таблицы.
Удалять после этого хоть раз в месяц можно.
5 июн 16, 12:16    [19259391]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите, есть ли способ реализовать задуманное без джоба?  [new]
teCa
Member

Откуда:
Сообщений: 637
Гавриленко Сергей Алексеевич,

такое поле не будет иметь смысла, тк серверная часть не будет его воспринимать. В том то и дело, что мне при помощи mssql нужно поймать момент, когда итем пора удалить и сделать это. Минус джоба в том, что он будет работать только через интервалы времени, а хотелось бы это делать налету.
5 июн 16, 12:38    [19259412]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите, есть ли способ реализовать задуманное без джоба?  [new]
teCa
Member

Откуда:
Сообщений: 637
teCa,

те задачу правильнее поставить так:
Есть таблица, в которой есть поле с датой и временем, можно ли при помощи mssql ловить тот момент, когда текущее время сравняется со значением в этом поле.
5 июн 16, 12:43    [19259422]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите, есть ли способ реализовать задуманное без джоба?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37068
А как серверная часть узнает, что вы что-то в таблице удаляете? O_o
5 июн 16, 12:45    [19259423]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите, есть ли способ реализовать задуманное без джоба?  [new]
invm
Member

Откуда: Москва
Сообщений: 9404
teCa
такое поле не будет иметь смысла, тк серверная часть не будет его воспринимать.
Это смотря как реализовать.
5 июн 16, 12:50    [19259431]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите, есть ли способ реализовать задуманное без джоба?  [new]
teCa
Member

Откуда:
Сообщений: 637
Гавриленко Сергей Алексеевич,
Серверная часть в эту таблицу даже не смотрит, удаляю я бинарным пакетов, который отправляю в API сервера. Такой пакет формирует отдельная утилита, которая смотрит в табличку на сервере mssql. Те, когда мне нужно удалить итем, я делаю инсерт в эту таблицу. Туда я передаю имя функции, атрибуты и уже обработчик на основе этих данных формирует пакет и отправляет его в API сервера.
5 июн 16, 12:52    [19259438]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите, есть ли способ реализовать задуманное без джоба?  [new]
teCa
Member

Откуда:
Сообщений: 637
invm,
К сожалению или к счастью, серверную часть как либо модифицировать мы возможности не имеем.
5 июн 16, 12:53    [19259441]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите, есть ли способ реализовать задуманное без джоба?  [new]
invm
Member

Откуда: Москва
Сообщений: 9404
teCa
серверную часть как либо модифицировать мы возможности не имеем.
И где же тогда расположена ваша собственная таблица?
5 июн 16, 13:03    [19259456]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите, есть ли способ реализовать задуманное без джоба?  [new]
teCa
Member

Откуда:
Сообщений: 637
invm,

да тут нет разницы, где она расположена. Есть серверная часть, с которой можно взаимодействовать по средствам API. ГеймСервер работает с собственной бд mssql. С этой БД данные можно считать, но изменять их нет смысла, тк все данные с таблиц сервер держит у себя в памяти. Нами написано несколько утилит, которые обеспечивают работу с API сервиса. Те, что-бы удалить итем на сервере, мы должны сообщить об этом своей утилите, сообщить мы можем ей путем инсерта строчки с указаниями в таблицу, за которой следит наша утилита.

Те, например, если мы хотим дать что-то игроку, который достиг 50 уровня, то, я на таблицу, где сервер хранит данные о игроках, вешаю триггер, который следит за полем уровень. И как только триггер ловит уровень 50, он делает инсерт уже таблицу нашей утилиты, где описаны инструкции, по которым утилита сформирует пакет и отправит его в API.

Видимо придется остановиться на варианте с джобом и не парить никому мозги)
5 июн 16, 13:18    [19259470]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите, есть ли способ реализовать задуманное без джоба?  [new]
invm
Member

Откуда: Москва
Сообщений: 9404
teCa,

"Не имеем возможности" и "не знаем как" - разные вещи.
Один из способов - оригинальную таблицу переименовать и вместо нее подсунуть представление:
+
use tempdb;
go

create table dbo.OriginalTable (id int identity primary key, SomeField int);
insert into dbo.OriginalTable
values
 (1), (2), (3);
go

select * from dbo.OriginalTable;
go

exec sp_rename 'dbo.OriginalTable', 'OriginalTableInternal';
go

create view dbo.OriginalTable
with view_metadata
as
select id, SomeField from dbo.OriginalTableInternal where SomeField > 1;
go

select * from dbo.OriginalTable;

insert into dbo.OriginalTable
values
 (0), (5);

select * from dbo.OriginalTable;
go

drop view dbo.OriginalTable;
drop table dbo.OriginalTableInternal;
go
5 июн 16, 13:37    [19259496]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите, есть ли способ реализовать задуманное без джоба?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31437
teCa
И как только триггер ловит уровень 50, он делает инсерт уже таблицу нашей утилиты, где описаны инструкции, по которым утилита сформирует пакет и отправит его в API.
А утилита когда смотрит в эту таблицу? Периодически опрашивает? Или вы, после изменения таблиц, должны её вызвать?
5 июн 16, 13:42    [19259509]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите, есть ли способ реализовать задуманное без джоба?  [new]
teCa
Member

Откуда:
Сообщений: 637
alexeyvg,

она эту табличку постоянно опрашивает на предмет необработанных строк.
5 июн 16, 13:52    [19259520]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите, есть ли способ реализовать задуманное без джоба?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31437
teCa
alexeyvg,

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

Те, например, если мы хотим дать что-то игроку, который достиг 50 уровня, то, я на таблицу, где сервер хранит данные о игроках, вешаю триггер, который следит за полем уровень. И как только триггер ловит уровень 50, он делает инсерт уже таблицу нашей утилиты, где описаны инструкции, по которым утилита сформирует пакет и отправит его в API.
В триггере сразу меняйте табличку, которую утилита "постоянно опрашивает на предмет необработанных строк".

У вас же утилита как бы работает вместо джоба, она же сама всё опрашивает, ничего больше не нужно.
5 июн 16, 14:30    [19259588]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите, есть ли способ реализовать задуманное без джоба?  [new]
teCa
Member

Откуда:
Сообщений: 637
alexeyvg,

Угу, вариант её доработать всегда остается.
5 июн 16, 15:40    [19259659]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите, есть ли способ реализовать задуманное без джоба?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31437
teCa
Угу, вариант её доработать всегда остается.
В данном случае не нужно её дорабатывать.
Она как читала периодически задания, так и будет читать.
5 июн 16, 21:49    [19260402]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить