当前位置: 首页 > 面试题库 >

ORACLE PLSQL创建用户,触发器由:new用户名和密码标识

诸葛利
2023-03-14
问题内容

我正在使用ORACLE为SQL项目编写在线视频游戏数据库,而我正在尝试为每个在我的ACCCOUNT表格中提交其信息的用户创建一个触发器

CREATE TABLE ACCOUNT (
USERNAME              VARCHAR(20),
PASSWORD              VARCHAR(20)            NOT NULL,
NATIONALITY           VARCHAR(15),
CREATION DATE         DATE,
EMAIL_ACCOUNT         VARCHAR(35)            NOT NULL,
CONSTRAINT            KEYACCOUNT          PRIMARY KEY(USERNAME),
CONSTRAINT            NO_USER_CSPEC          CHECK(REGEXP_LIKE(USERNAME, '^[a-zA-Z0-9._]+$') AND USERNAME NOT LIKE '% %'),
CONSTRAINT            NO_EASY_PASS           CHECK(REGEXP_LIKE(PASSWORD, '^[a-zA-Z0-9._!#拢$%&/()=?]') AND PASSWORD NOT LIKE '% %'),
CONSTRAINT            LENGHTUSER          CHECK(LENGTH(USERNAME)>3),
CONSTRAINT            LENGHTPASS          CHECK(LENGTH(PASSWORD)>5),
CONSTRAINT            FK_EMAIL               FOREIGN KEY(EMAIL_ACCOUNT) REFERENCES PERSONA(EMAIL) ON DELETE CASCADE
);

将触发一个触发器,该触发器将使用刚刚插入的新用户名和密码创建一个新用户。

这是我尝试编写的代码

 CREATE OR REPLACE TRIGGER NEW_USER
 AFTER INSERT ON ACCOUNT
 FOR EACH ROW
 BEGIN
 CREATE USER :NEW.USERNAME IDENTIFIED BY :NEW.PASSWORD;
 GRANT ROLE_NAME TO :NEW.USERNAME
 END;

为什么我要这样做呢?基本上是因为我想在仅涉及特定用户的特定行上提供特定视图。(想象一下,如果在管理帐户时可以访问表ACCOUNT中存储的所有其他行)

创建该特定用户后,我可以创建一些过程,并在其中输入用户名(成功创建用户的用户名),并返回该特定行上的视图。

有没有办法做到这一点 ?


问题答案:

我在这里看到的主要问题是授予create user。您可能不希望您的架构能够创建用户。因此,触发器(当然是其他答案指出需要这样做execute immediate)不应直接调用create user。我将创建在您的工作模式以外的其他模式中创建用户的过程。该外部模式将授予create user您的权限,而您的模式将仅授予从强特权模式执行该过程的权限。在这种情况下,触发器将仅从外部模式调用单个过程

因此,回顾一下:

 CREATE OR REPLACE TRIGGER your_schema.NEW_USER
 AFTER INSERT ON ACCOUNT
 FOR EACH ROW
 BEGIN
   STRONG.CREATE_USER(:NEW.PASSWORD,:NEW.USERNAME);
 END;

CREATE OR REPLACE PROCEDURE STRONG.CREATE_USER(PASS VARCHAR2, USERNAME VARCHAR2) AS
DECLARE    
  PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
  execute immediate 'CREATE USER ' || USERNAME || ' IDENTIFIED BY ' || PASS;
  execute immediate 'GRANT ROLE_NAME, CONNECT, RESOURCE TO ' || USERNAME; --and whatever user needs more
END;

STRONG用户有权创建用户,而your_schema有权执行 STRONG.CREATE_USER

额外的东西。切勿以纯文本形式存储密码。使用一些哈希。



 类似资料:
  • 我正在尝试使用jmeter模拟在我的测试站点上创建的500个用户名/密码。主页有3个字段,用户名、电子邮件地址和密码。如何让jmeter自动填充这些字段?下一个问题是,jmeter是否可以转到下一页,例如填写信用信息?

  • 如何从java代码中使用用户名和密码创建mysql数据库?然后创建所有的表? 我在谷歌上搜索,发现了这个代码 但就我而言,我需要: -从java设置用户名和密码 创建所有的表 确保: > MySQL连接排序:utf8_general_ci 我的数据库和表排序规则设置为:utf8\u general\u ci或utf8\u unicode\u ci 然后我必须在MySQL中执行:设置名称utf8 设

  • 我试图创建新的肥皂请求在SoapUI从服务endpoint复制密码用户名和endpoint。 它使用终结点,但不使用用户名和密码。 有人知道怎么做吗? (我不想克隆)!

  • 我正在尝试将mysql与移动应用程序结合起来。 我刚刚将mySQLi php扩展添加到我的windowsserver2008中,但是我不知道如何连接php代码:$this- 当我尝试使用用于通过远程桌面连接到服务器的用户名和密码登录时,我收到此反馈:警告:mysqli::mysqli()[mysqli.mysqli]:(28000/1045):用户“admin”@“localhost”的访问被拒绝

  • 我正在构建一个Java Web应用程序,当经理批准他们的请求时,它会自动授予用户对其Windows PC的管理权限。 为了实现这一点,我将编写一个脚本来自动远程访问用户的计算机,并将他们添加到计算机的管理组中。我想为了做到这一点,我需要一个管理服务帐户来访问所有的计算机。 我的问题是,我如何安全地存储管理服务帐户信息?应用程序每次需要访问并授予用户管理员权限时都需要凭据,那么我如何让应用程序在没有

  • 我有麻烦管理詹金斯的秘密密码。我希望密码不显示在日志上,但我尝试了两种方法没有成功: 第一次尝试 我尝试使用全局凭据(不受限制)设置用户和pwd,如下所示: 我执行了: 但我可以在日志中看到,用户的写入是正确的,但pwd的写入方式与它的路径相同: 在我的自动测试中,也是通过输入完整路径而不是变量的值。 第二次尝试 我试着用这样的密文: 但控制台日志上显示的是原样的密码。 有人能帮我吗? 先谢谢你。