【发布时间】:2014-07-28 07:39:08
【问题描述】:
在由 FreeRADIUS 执行的 PostgreSQL 查询中,我想做类似的事情(表名和值只是示例):
SELECT name
FROM users
WHERE city LIKE '%blahblah%';
但有一个问题:blahblah 值包含在 FreeRADIUS 变量中,用“%{variable-name}”表示。它扩展为“blahblah”。
现在我的问题是:如何使用 LIKE 运算符将 %{variable-name} 变量与存储在表中的值匹配?
我尝试过使用
SELECT name
FROM users
WHERE city LIKE '%%{variable-name}%';
但它不能像那样正确展开,显然是不正确的。
我想要实现的最终查询是
...
WHERE city LIKE '%blahblah%';
因此它与存储在表中的包含“blahblah”的较长字符串匹配,但我希望变量动态扩展为正确的查询。有办法吗?
谢谢!
【问题讨论】:
-
那么,
blahblah的%{variable-name}的值从何而来?请展示一个完整的示例,最好使用表的创建表和插入语句。 FreeRADIUS 是否检测到这些变量字符串并将它们直接替换到 SQL 中?您是否希望在 PostgreSQL 中执行此操作? -
另外,“没有正确展开”怎么办? “明显不正确”怎么办?执行什么 SQL?
-
嗯,这是我添加到 freeradius 的授权部分的一个查询,用于清理陈旧的会话。这个想法是如果新的身份验证请求来自相同的 MAC 地址,则删除具有 NULL acctstoptime 的会话。由于我的 NAS 未能在 Accounting-Request 数据包中为 radius 服务器提供“Calling-Station-Id”(wifi 站的 MAC)字段,因此 freeradius 在记帐 INSERT 期间没有将 wifi 站的 MAC 地址存储在 callstationid 列中.
-
因此,我修改了accounting_start 查询,改为在radacct 表的callingstationid 列中插入Acct-Multi-Session-Id。 Acct-Multi-Session-Id 包含站点的 MAC,但它是一个较长的字符串,其中还包含 NAS 的 MAC。因此,在我的会话清理查询中,我需要使用 WHERE 和 LIKE 进行更新,以将 %{Calling-Station-Id} 变量(在运行查询之前由 FreeRADIUS 动态扩展)与修改后的 Acct-Multi-Session-Id 值匹配callstationid 列。
-
所以我按照你的建议做了: UPDATE radacct set AcctStopTime=('%S'::timestamp - '%{%{Acct-Delay-Time}:-0}'::interval) , AcctTerminateCause='Clear-Stale Session' WHERE UserName='%{User-Name}' and CallingStationId like '%' || '%{Calling-Station-Id}' || '%' 和 AcctStopTime 为 NULL;关闭陈旧的会话,它可以工作。谢谢!
标签: postgresql sql-like freeradius