【问题标题】:Oracle PL/SQL: Prevent delete * from table unless primary key specifiedOracle PL/SQL:除非指定主键,否则防止从表中删除 *
【发布时间】:2017-05-10 12:45:44
【问题描述】:

在 Oracle PL/SQL 语言中,我想防止用户使用 delete * from table 除非指定主键。

我怎样才能做到这一点?

我刚刚发现了一个类似的问题,但语言不同:prevent delete * from table unless primary key specified

您能帮我找到一个Oracle PL/SQL 语言的解决方案吗?

编辑:

SELECT * FROM V$VERSION;

BANNER,CON_ID
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production,0
PL/SQL Release 12.1.0.2.0 - Production,0
CORE    12.1.0.2.0  Production,0
TNS for IBM/AIX RISC System/6000: Version 12.1.0.2.0 - Production,0
NLSRTL Version 12.1.0.2.0 - Production,0

【问题讨论】:

  • 作为您链接的那个问题的给定解决方案(在 cmets 中),您必须在触发器中执行此操作。要使其可用于所有表,您必须创建一个函数来接收表名并查看字典以查看主键列并检查它们是否已填充。
  • 你的表中主键的结构是什么?它只是和自增整数字段吗?
  • 触发器必须是通用的,并且适用于任何表。
  • 如何从一个部门删除所有员工(例如)?你不想限制delete 没有where 子句,或者没有引用索引列的where 子句吗?
  • 如果您想限制某人删除记录,您应该撤销该权限;然后,您可以在 PL/SQL 中创建一个 API,允许他们执行您希望允许的删除操作。

标签: oracle plsql triggers


【解决方案1】:

正如有人在引用的线程中观察到的那样,这个要求相当于我想减慢在我的数据库中执行的每次删除。更不用说有时需要批量删除。

这是一个典型的例子,试图将技术解决方案应用于政治局势,过程失败。我曾经认识一位开发人员发起删除 大量(数百万行)表,因为他们不知道如何在 PL/SQL 中定义变量范围。但是因为一个人的愚蠢错误而惩罚整个开发团队是错误的。

正确的解决方案是实现其中一项或两项:

  • 确保您的开发人员(或任何具有原始 SQL 访问权限的用户)了解如何编写正确的 SQL
  • 撤销无法信任的人的 DELETE 权限
  • 有不错的备份,因此无论是否有人删除所有记录都无关紧要

【讨论】:

    【解决方案2】:

    不确定,但是如果违反约束,删除将失败,所以我想看看您是否可以创建将被违反的约束(例如,必须首先删除子记录的外键约束)。

    【讨论】:

    • 但这不会改变删除本身的行为。用户可以删除所有子记录,然后删除所有父记录。
    • @apc 如果 OP 的用户对他们不想要的数据库拥有如此多的访问权限,那么他们就有麻烦了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-17
    • 2016-07-28
    • 2021-02-04
    • 1970-01-01
    • 2014-10-19
    • 2021-09-06
    • 1970-01-01
    相关资源
    最近更新 更多