Commit 6661ac7
Support enforced: option on foreign keys
Mirrors rails/rails#57377 (commit 6cb88eae), which adds an `enforced:`
option to `add_foreign_key` (and a `change_foreign_key` helper) for
PostgreSQL 18.4+ NOT ENFORCED constraints. The Ruby option name follows
SQL:2011's [NOT] ENFORCED constraint characteristic (carried into
SQL:2016). Oracle does not implement the [NOT] ENFORCED keyword;
instead, the adapter exposes Oracle's pre-existing 4-state constraint
model via the independent `enforced:` and `validate:` Ruby options.
enforced | validate | Oracle state
---------|----------|----------------------------------------
true | true | ENABLE VALIDATE
true | false | ENABLE NOVALIDATE
false | true | DISABLE VALIDATE (blocks DML, ORA-25128)
false | false | DISABLE NOVALIDATE (~ PG NOT ENFORCED)
Both Ruby-API defaults are `true` and the options are independent.
Users wanting PostgreSQL-NOT-ENFORCED semantics on Oracle should pass
both `enforced: false, validate: false`; passing only `enforced: false`
yields DISABLE VALIDATE (intentional, but blocks DML). The matrix is
also reproduced in source above visit_ForeignKeyDefinition.
- supports_enforced_foreign_keys? returns true unconditionally
- visit_ForeignKeyDefinition emits ` DISABLE` (before any ` VALIDATE` /
` NOVALIDATE`) and emits explicit ` VALIDATE` when DISABLE is set and
validate is true, because Oracle's bare DISABLE defaults to NOVALIDATE
- foreign_keys introspection selects c.status from all_constraints;
c.status -> options[:enforced]=false, c.validated -> options[:validate]
=false, reported independently
- change_foreign_key issues ALTER TABLE ... MODIFY CONSTRAINT ...
ENABLE/DISABLE via foreign_key_for! lookup; raises ArgumentError when
:enforced is omitted (mirrors PG, prevents a no-op call from silently
disabling the FK). Docstring records the accepted opts and the bare
DISABLE/ENABLE side effect on Oracle's VALIDATED state.
Schema dumping relies on the abstract SchemaDumper#foreign_keys, which
since rails/rails#57377 emits `enforced:` based on
ForeignKeyDefinition#enforced? (options.fetch(:enforced, true)); no
adapter-level dumper override is needed.
References:
- pgsql-hackers (SQL:2011 4.17.2 quote; accessible primary reference
since the ISO standard itself is paywalled):
https://postgrespro.com/list/thread-id/1770540
- Oracle 8i SQL Reference Release 3 (8.1.7) constraint_clause -
documents ENABLE/DISABLE and VALIDATE/NOVALIDATE on foreign-key
constraints; the DML-blocking semantics of DISABLE VALIDATE
(ORA-25128) are part of the same long-standing model:
https://docs.oracle.com/cd/A87860_01/doc/server.817/a85397/state14a.htm
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>1 parent ac83019 commit 6661ac7
5 files changed
Lines changed: 204 additions & 1 deletion
File tree
- lib/active_record/connection_adapters
- oracle_enhanced
- spec/active_record/connection_adapters/oracle_enhanced
Lines changed: 19 additions & 1 deletion
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
85 | 85 | | |
86 | 86 | | |
87 | 87 | | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
88 | 101 | | |
89 | 102 | | |
90 | 103 | | |
91 | | - | |
| 104 | + | |
| 105 | + | |
| 106 | + | |
| 107 | + | |
| 108 | + | |
| 109 | + | |
92 | 110 | | |
93 | 111 | | |
94 | 112 | | |
| |||
Lines changed: 16 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
753 | 753 | | |
754 | 754 | | |
755 | 755 | | |
| 756 | + | |
756 | 757 | | |
757 | 758 | | |
758 | 759 | | |
| |||
776 | 777 | | |
777 | 778 | | |
778 | 779 | | |
| 780 | + | |
779 | 781 | | |
780 | 782 | | |
781 | 783 | | |
| |||
821 | 823 | | |
822 | 824 | | |
823 | 825 | | |
| 826 | + | |
| 827 | + | |
| 828 | + | |
| 829 | + | |
| 830 | + | |
| 831 | + | |
| 832 | + | |
| 833 | + | |
| 834 | + | |
| 835 | + | |
| 836 | + | |
| 837 | + | |
| 838 | + | |
| 839 | + | |
824 | 840 | | |
825 | 841 | | |
826 | 842 | | |
| |||
Lines changed: 4 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
527 | 527 | | |
528 | 528 | | |
529 | 529 | | |
| 530 | + | |
| 531 | + | |
| 532 | + | |
| 533 | + | |
530 | 534 | | |
531 | 535 | | |
532 | 536 | | |
| |||
Lines changed: 51 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
388 | 388 | | |
389 | 389 | | |
390 | 390 | | |
| 391 | + | |
| 392 | + | |
| 393 | + | |
| 394 | + | |
| 395 | + | |
| 396 | + | |
| 397 | + | |
| 398 | + | |
| 399 | + | |
| 400 | + | |
| 401 | + | |
| 402 | + | |
| 403 | + | |
| 404 | + | |
| 405 | + | |
| 406 | + | |
| 407 | + | |
| 408 | + | |
| 409 | + | |
| 410 | + | |
| 411 | + | |
| 412 | + | |
| 413 | + | |
| 414 | + | |
| 415 | + | |
| 416 | + | |
| 417 | + | |
| 418 | + | |
| 419 | + | |
| 420 | + | |
| 421 | + | |
| 422 | + | |
| 423 | + | |
| 424 | + | |
| 425 | + | |
| 426 | + | |
| 427 | + | |
| 428 | + | |
| 429 | + | |
| 430 | + | |
| 431 | + | |
| 432 | + | |
| 433 | + | |
| 434 | + | |
| 435 | + | |
| 436 | + | |
| 437 | + | |
| 438 | + | |
| 439 | + | |
| 440 | + | |
| 441 | + | |
391 | 442 | | |
392 | 443 | | |
393 | 444 | | |
| |||
Lines changed: 114 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1950 | 1950 | | |
1951 | 1951 | | |
1952 | 1952 | | |
| 1953 | + | |
| 1954 | + | |
| 1955 | + | |
| 1956 | + | |
| 1957 | + | |
| 1958 | + | |
| 1959 | + | |
| 1960 | + | |
| 1961 | + | |
| 1962 | + | |
| 1963 | + | |
| 1964 | + | |
| 1965 | + | |
| 1966 | + | |
| 1967 | + | |
| 1968 | + | |
| 1969 | + | |
| 1970 | + | |
| 1971 | + | |
| 1972 | + | |
| 1973 | + | |
| 1974 | + | |
| 1975 | + | |
| 1976 | + | |
| 1977 | + | |
| 1978 | + | |
| 1979 | + | |
| 1980 | + | |
| 1981 | + | |
| 1982 | + | |
| 1983 | + | |
| 1984 | + | |
| 1985 | + | |
| 1986 | + | |
| 1987 | + | |
| 1988 | + | |
| 1989 | + | |
| 1990 | + | |
| 1991 | + | |
| 1992 | + | |
| 1993 | + | |
| 1994 | + | |
| 1995 | + | |
| 1996 | + | |
| 1997 | + | |
| 1998 | + | |
| 1999 | + | |
| 2000 | + | |
| 2001 | + | |
| 2002 | + | |
| 2003 | + | |
| 2004 | + | |
| 2005 | + | |
| 2006 | + | |
| 2007 | + | |
| 2008 | + | |
| 2009 | + | |
| 2010 | + | |
| 2011 | + | |
| 2012 | + | |
| 2013 | + | |
| 2014 | + | |
| 2015 | + | |
| 2016 | + | |
| 2017 | + | |
| 2018 | + | |
| 2019 | + | |
| 2020 | + | |
| 2021 | + | |
| 2022 | + | |
| 2023 | + | |
| 2024 | + | |
| 2025 | + | |
| 2026 | + | |
| 2027 | + | |
| 2028 | + | |
| 2029 | + | |
| 2030 | + | |
| 2031 | + | |
| 2032 | + | |
| 2033 | + | |
| 2034 | + | |
| 2035 | + | |
| 2036 | + | |
| 2037 | + | |
| 2038 | + | |
| 2039 | + | |
| 2040 | + | |
| 2041 | + | |
| 2042 | + | |
| 2043 | + | |
| 2044 | + | |
| 2045 | + | |
| 2046 | + | |
| 2047 | + | |
| 2048 | + | |
| 2049 | + | |
| 2050 | + | |
| 2051 | + | |
| 2052 | + | |
| 2053 | + | |
| 2054 | + | |
| 2055 | + | |
| 2056 | + | |
| 2057 | + | |
| 2058 | + | |
| 2059 | + | |
| 2060 | + | |
| 2061 | + | |
| 2062 | + | |
| 2063 | + | |
| 2064 | + | |
| 2065 | + | |
| 2066 | + | |
1953 | 2067 | | |
1954 | 2068 | | |
1955 | 2069 | | |
| |||
0 commit comments