【问题标题】:Is there a way to prevent new tables being created with the same primary key column name as that on another table? [closed]有没有办法防止使用与另一个表上的主键列名相同的主键列名创建新表? [关闭]
【发布时间】:2021-11-06 01:55:19
【问题描述】:

我想阻止任何人创建一个主键与同一架构中另一个表上的主键具有相同列名的表。

我可能正在寻找创建表的触发器,它可以查看正在创建的表的列名,将它们与所有其他 PK 列名进行检查,可能在 ALL_CONS_COLUMNS 中,如果它已经存在则抛出错误。我该怎么做?

我很感激人们认为这不是一个好主意,但这不是我选择去做的事情,而是我必须尝试去做的事情。这就是我所拥有的,我走在正确的轨道上吗? @MT0 是否正确,我不能以不会与数据字典表混淆的方式执行此操作?

CREATE OR REPLACE TRIGGER create_table_trigger
  BEFORE CREATE ON SCHEMA
BEGIN
  IF SYS.DICTIONARY_OBJ_TYPE = 'TABLE' THEN
    IF /* can I grab the PK column name? */ IN ( SELECT COLUMN_NAME
                                                       FROM all_tables_in_schema
                                                       WHERE column = a_primary_key )
    THEN
      RAISE e_duplicate_pk;
    END IF;
  END IF;
END;

我还很初级,我不会定义 CR 流程或命名约定。如果您觉得这是一个愚蠢的问题,请随意提出您认为更有价值的问题,也许其他人会告诉我是否可行。

【问题讨论】:

  • 您为什么要这样做?它所做的只是促进在列名中不必要地使用额外的术语或缩写。如果您有一个“事物”表和一个“东西”表,并且您需要在两个表中都有一个用于对象名称的列,那么将两个表中的列称为“名称”,然后如果您需要加入然后表使用表/列别名来区分。
  • @MarEll 这无关紧要。我只需要知道你能不能做到,如果能,怎么做。
  • 如果您不知道如何获取列名,请分享您当前的代码以及您目前研究的内容。因为这个要求提供答案很奇怪:需要有人支持它并在这样的设置中开发。我不想参加
  • @LJWoods 是的,您可以使用触发器执行此操作。但触发器必须是AFTER 而不是BEFORE,否则新表将不在数据字典中。然后您可以从USER_CONSTRAINTSUSER_CONS_COLUMNS 中读取共享相同名称的主键列的数量,如果数量大于1,则引发异常。(由于问题已关闭,我无法发布代码. 如果这个问题永远不会被重新打开并且你需要完整的代码,请给我发电子邮件。)
  • @LJWoods 但是 DDL 触发器很棘手,如果编码不正确,可能会导致严重的数据库问题。通过创建定期检查这些问题并发送电子邮件的计划作业,解决此问题可能更安全、更容易。或者创建单个 PL/SQL 块来检查问题,并在部署或 CI/CD 过程中运行它。

标签: oracle triggers ddl oracle19c


【解决方案1】:

这是一个框架挑战答案。

你问的是相当于

如何向系统拥有的数据字典表添加触发器,以防止某些 DDL 语句工作?

不要。

假设您设法使触发器正常工作;你怎么知道如果触发器阻止更新ALL_CONS_COLUMNS 表,那么所有其他字典表将被回滚并保持一致状态。您正在弄乱数据字典,永远不应该这样做,否则您可能会使数据库处于不一致和不可用的状态。


如果您确实想要相同架构中的表不能重复主键的结果,请实施代码审查流程并将该检查作为审查流程的一部分,然后您可以在所有代码检查和签署之前在数据库中运行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-15
    • 2011-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-30
    相关资源
    最近更新 更多