MySql, .NET, хранимые процедуры, совместно использующие текущую дату и время с вызывающим клиентом - PullRequest
0 голосов
/ 30 августа 2010

Я пишу хранимую процедуру для обновления таблицы:

UPDATE st SET somedate = NOW();

Клиент SP должен знать точную дату и время, генерируемые функцией NOW.

Есть два варианта:

1) клиент передает входной параметр (называемый _now) в SP, предоставляя ему текущую дату и время

UPDATE st SET somedate = _now;

2) SP возвращает клиенту вывод NOW в выходной параметр

UPDATE st SET somedate = NOW();
SELECT somedate FROM st INTO _now;

Какой вариант вы считаете лучшим? Возможны ли другие варианты?

Ответы [ 3 ]

1 голос
/ 30 августа 2010
  • varnow = now ()
  • ОБНОВЛЕНИЕ st set somedate = varnow
  • return varnow
0 голосов
/ 30 августа 2010

я бы сделал что-то вроде этого:

drop table if exists users;
create table users
(
user_id int unsigned not null auto_increment primary key,
username varchar(32) unique not null,
created_date datetime not null
)
engine=innodb;


delimiter ;

drop procedure if exists insert_user;

delimiter #

create procedure insert_user
(
in uname varchar(32)
)
proc_main:begin

declare id int unsigned default null;
declare created datetime default null;

set created = now();

insert into users (username, created_date) values (uname, created);

set id = last_insert_id();

-- use id elsewhere maybe...

select id as user_id, created as created_date;

end proc_main #


delimiter ;

call insert_user('f00');
call insert_user('bar');

select * from users;
0 голосов
/ 30 августа 2010

Я подозреваю, что оба подхода неверны.

клиент СП должен знать точную дату и время

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

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

Добавьте еще один столбец или другую таблицу и создайте суррогатный ключ для описания транзакции.

C.

...