如何使用会话变量来缩短存储过程中的参数需求?
How to use a session variable to shorten parameter needs in my stored procedures?
我尝试 运行 通过使用程序员通常在应用程序中执行的命令创建存储过程,在数据库中尽可能多地处理逻辑业务。所以我的 Java/PHP/etc 代码中不再有 'select * from table'。
我创建的过程如下:
create procedure show_clients(user_account integer, client_type varchar)
begin
select client_name from clients
where type = client_type and
user_owner = user_account; -- < this is done in every query
end
当然,我的所有查询都只会显示属于正在操作该会话的用户的行。 所以...
有没有一种方法可以让用户登录应用程序时,我的登录过程会保存他的 user_id
所以在每个需要了解用户的过程中,我把这个session 变量,并且这种方法是安全的,因此其他会话中的其他用户不会看到不属于他们的数据?
示例:
create procedure login(_username, _password)
begin
sessionUserId = 0;
select user_id into sessionUserId from users
where login = _username and password = _password;
if sessionUserId is null
select sessionUserId;
exit;
else
select * from users where id = sessionUserId;
session_vars.this_session_id = sessionUserId; -- < more or less like this
end
create procedure new_show_clients(client_type varchar) -- < more light
begin
select client_name from clients
where type = client_type and
user_owner = session_vars.this_session_id; -- < no need for a parameter!
end
注意:我指的会话是用户登录的web aaplication会话。我想知道MySQL调用是否会识别这个应用程序的会话并将来自它的所有调用也统一在它的 DBMS 中的一个会话中。
或者..我是否必须为我的应用程序的每个用户创建一个 MySQL 用户,以便 MySQL 为他们存储会话变量?
我发现在这个site中是可行的。
但我只在 Delphi 上进行了测试,其中 MySQL 的会话一直保持活动状态,直到我手动断开数据库连接组件或通过终止程序。
我们可以在存储过程中使用 set @varxyz = 123;
,我也可以在其中使用它的值来创建 select。不幸的是,我们不能在视图内使用这些会话变量或在过程外设置它们。
在 PHP 中无法使用此方法,因为每次调用服务器都会建立一个新的数据库连接,因此,我创建了一个新会话,我们丢失了之前在会话中创建的那些变量.我还没有测试我们是否可以将数据库连接变量 $connect
保存在 PHP 会话数组中。我可以,但它会在接下来的 session_start()
中在数据库中保持相同的会话吗?
稍后我会测试它,post结果在这里。
任何人都可以告诉我 Java 方法是否可以在用户向 servlet 请求页面时保持数据库会话打开?
我尝试 运行 通过使用程序员通常在应用程序中执行的命令创建存储过程,在数据库中尽可能多地处理逻辑业务。所以我的 Java/PHP/etc 代码中不再有 'select * from table'。
我创建的过程如下:
create procedure show_clients(user_account integer, client_type varchar)
begin
select client_name from clients
where type = client_type and
user_owner = user_account; -- < this is done in every query
end
当然,我的所有查询都只会显示属于正在操作该会话的用户的行。 所以...
有没有一种方法可以让用户登录应用程序时,我的登录过程会保存他的 user_id
所以在每个需要了解用户的过程中,我把这个session 变量,并且这种方法是安全的,因此其他会话中的其他用户不会看到不属于他们的数据?
示例:
create procedure login(_username, _password)
begin
sessionUserId = 0;
select user_id into sessionUserId from users
where login = _username and password = _password;
if sessionUserId is null
select sessionUserId;
exit;
else
select * from users where id = sessionUserId;
session_vars.this_session_id = sessionUserId; -- < more or less like this
end
create procedure new_show_clients(client_type varchar) -- < more light
begin
select client_name from clients
where type = client_type and
user_owner = session_vars.this_session_id; -- < no need for a parameter!
end
注意:我指的会话是用户登录的web aaplication会话。我想知道MySQL调用是否会识别这个应用程序的会话并将来自它的所有调用也统一在它的 DBMS 中的一个会话中。
或者..我是否必须为我的应用程序的每个用户创建一个 MySQL 用户,以便 MySQL 为他们存储会话变量?
我发现在这个site中是可行的。
但我只在 Delphi 上进行了测试,其中 MySQL 的会话一直保持活动状态,直到我手动断开数据库连接组件或通过终止程序。
我们可以在存储过程中使用 set @varxyz = 123;
,我也可以在其中使用它的值来创建 select。不幸的是,我们不能在视图内使用这些会话变量或在过程外设置它们。
在 PHP 中无法使用此方法,因为每次调用服务器都会建立一个新的数据库连接,因此,我创建了一个新会话,我们丢失了之前在会话中创建的那些变量.我还没有测试我们是否可以将数据库连接变量 $connect
保存在 PHP 会话数组中。我可以,但它会在接下来的 session_start()
中在数据库中保持相同的会话吗?
稍后我会测试它,post结果在这里。
任何人都可以告诉我 Java 方法是否可以在用户向 servlet 请求页面时保持数据库会话打开?