【发布时间】: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_CONSTRAINTS和USER_CONS_COLUMNS中读取共享相同名称的主键列的数量,如果数量大于1,则引发异常。(由于问题已关闭,我无法发布代码. 如果这个问题永远不会被重新打开并且你需要完整的代码,请给我发电子邮件。) -
@LJWoods 但是 DDL 触发器很棘手,如果编码不正确,可能会导致严重的数据库问题。通过创建定期检查这些问题并发送电子邮件的计划作业,解决此问题可能更安全、更容易。或者创建单个 PL/SQL 块来检查问题,并在部署或 CI/CD 过程中运行它。
标签: oracle triggers ddl oracle19c