Firebird 3.0 中的用户管理
SQL Language Extension: CREATE/ALTER/CREATE_OR_ALTER/DROP USER
实现从常规数据库连接中管理用户的功能。
作者:
Alex Peshkoff [email protected]
语法为:
CREATE USER name [ options ] [ TAGS ( tag [, tag [, tag ...]] ) ] ALTER USER name [ SET ] [ options ] [ TAGS ( tag [, tag [, tag ...]] ) ] ALTER CURRENT USER [ SET ] [ options ] [ TAGS ( tag [, tag [, tag ...]] ) ] CREATE OR ALTER USER name [ SET ] [ options ] [ TAGS ( tag [, tag [, tag ...]] ) ] DROP USER name [ USING PLUGIN name ];
其中 OPTIONS 是以下选项的列表:
- PASSWORD ‘password’
- FIRSTNAME ‘firstname’
- MIDDLENAME ‘middlename’
- LASTNAME ’lastname'
- ACTIVE
- INACTIVE
- USING PLUGIN name
每个 TAG 可以有以下两种形式之一:
name = ‘string value’
或:
DROP name
其中 NAME 是任何有效的 SQL 标识符。
描述:
使得可以通过 SQL 语言在安全数据库中添加、修改和删除用户。
Firebird 从 3.0 版本开始支持多个安全数据库。gsec 实用程序和 services API
不支持此功能,使用它们来管理用户已被弃用。
CREATE 和 DROP 子句仅对 SYSDBA(或安全数据库中被授予 RDB$ADMIN 角色的其他用户)可用。普通用户可以修改自己的密码、宽名称和标签。尝试修改
其他用户将会失败。同样,尝试使自己变为非活动或活动状态也会失败。为了避免每次输入自己的名字,提供了简化形式的 ALTER CURRENT USER。
在 ALTER USER 语句中,PASSWORD、FIRSTNAME、MIDDLENAME、LASTNAME、ACTIVE、INACTIVE 或 TAGS 中至少必须出现一项。另外,请注意创建新用户时必须包含 PASSWORD 子句。
PASSWORD 子句不言自明。FIRSTNAME、MIDDLENAME 和 LASTNAME 子句也是如此,但也可以用来存储关于用户的任何简短信息。INACTIVE/ACTIVE 子句用于禁用用户登录服务器而不将其从列表中删除,以及恢复该能力。USING PLUGIN 子句使得不仅可以与默认管理插件(firebird.conf 中 UserManager 参数中列出的第一个)配合使用,还可以与其他插件配合使用。gsec 实用程序和 services API 不支持多个用户管理插件–始终使用默认插件。
TAGS 是最终用户定义的属性列表。值的长度不应超过 255 字节。
为名称赋值会设置新标签或修改现有标签。要删除标签,请使用 DROP 选项。
为用户设置标签列表时,如果之前设置的标签当前未被提及,则会保留这些标签。
请注意–由已弃用的 gsec 输入的 UID/GID 在 SQL 接口中被视为标签。
要访问用户列表,请从虚拟表 SEC$USERS 和 SEC$USER_ATTRIBUTES 中选择。
示例(假设 firebird.conf 中 UserManager=Srp,Legacy_UserManager):
通用:
CREATE USER alex PASSWORD 'test'; ALTER USER alex SET FIRSTNAME 'Alex' LASTNAME 'Peshkoff'; CREATE OR ALTER USER alex SET PASSWORD 'IdQfA'; DROP USER alex; ALTER CURRENT USER SET PASSWORD 'SomethingLongEnough' USING PLUGIN srp;
使用标签:
ALTER USER alex SET TAGS (a='a', b='b'); NAME VALUE ================ ============================== A a B b ALTER USER alex SET TAGS (b='x', c='d'); NAME VALUE ================ ============================== A a B x C d ALTER USER alex SET TAGS (drop a, c='sample'); NAME VALUE ================ ============================== B x C sample
显示用户列表:
SELECT CAST(U.SEC$USER_NAME AS CHAR(20)) LOGIN, CAST(A.SEC$KEY AS CHAR(10)) TAG, CAST(A.SEC$VALUE AS CHAR(20)) "VALUE", U.SEC$PLUGIN "PLUGIN" FROM SEC$USERS U LEFT JOIN SEC$USER_ATTRIBUTES A ON U.SEC$USER_NAME = A.SEC$USER_NAME AND U.SEC$PLUGIN = A.SEC$PLUGIN;
LOGIN TAG VALUE PLUGIN
==================== ========== ==================== =============================== SYSDBA <null> <null> Srp ALEX B x Srp ALEX C sample Srp SYSDBA <null> <null> Legacy_UserManager
注意!
此功能高度依赖于用户管理插件。请注意,使用旧版用户管理插件时,某些选项会被忽略。