diff --git a/adminer/drivers/mssql.inc.php b/adminer/drivers/mssql.inc.php index 62b8e767..e01fe3bb 100644 --- a/adminer/drivers/mssql.inc.php +++ b/adminer/drivers/mssql.inc.php @@ -477,6 +477,7 @@ WHERE OBJECT_NAME(i.object_id) = " . q($table) foreach (get_rows("EXEC sp_fkeys @fktable_name = " . q($table) . ", @fktable_owner = " . q(get_schema())) as $row) { $foreign_key = &$return[$row["FK_NAME"]]; $foreign_key["db"] = $row["PKTABLE_QUALIFIER"]; + $foreign_key["ns"] = $row["PKTABLE_OWNER"]; $foreign_key["table"] = $row["PKTABLE_NAME"]; $foreign_key["on_update"] = $on_actions[$row["UPDATE_RULE"]]; $foreign_key["on_delete"] = $on_actions[$row["DELETE_RULE"]]; @@ -556,6 +557,7 @@ WHERE sys1.xtype = 'TR' AND sys2.name = " . q($table) } function set_schema($schema) { + $_GET["ns"] = $schema; return true; // ALTER USER is permanent } diff --git a/adminer/foreign.inc.php b/adminer/foreign.inc.php index 0e4d4e4b..99caf5cb 100644 --- a/adminer/foreign.inc.php +++ b/adminer/foreign.inc.php @@ -56,14 +56,18 @@ if ($row["db"] != "") { $connection->select_db($row["db"]); } if ($row["ns"] != "") { + $orig_schema = get_schema(); set_schema($row["ns"]); } $referencable = array_keys(array_filter(table_status('', true), 'fk_support')); $target = array_keys(fields(in_array($row["table"], $referencable) ? $row["table"] : reset($referencable))); $onchange = "this.form['change-js'].value = '1'; this.form.submit();"; echo "

" . lang('Target table') . ": " . html_select("table", $referencable, $row["table"], $onchange) . "\n"; -if ($jush == "pgsql") { +if (support("scheme")) { echo lang('Schema') . ": " . html_select("ns", $adminer->schemas(), $row["ns"] != "" ? $row["ns"] : $_GET["ns"], $onchange); + if ($row["ns"] != "") { + set_schema($orig_schema); + } } elseif ($jush != "sqlite") { $dbs = array(); foreach ($adminer->databases() as $db) { diff --git a/adminer/include/editing.inc.php b/adminer/include/editing.inc.php index 2f53b83d..6739f5e9 100644 --- a/adminer/include/editing.inc.php +++ b/adminer/include/editing.inc.php @@ -550,7 +550,7 @@ function format_foreign_key($foreign_key) { return " FOREIGN KEY (" . implode(", ", array_map('idf_escape', $foreign_key["source"])) . ") REFERENCES " . ($db != "" && $db != $_GET["db"] ? idf_escape($db) . "." : "") . ($ns != "" && $ns != $_GET["ns"] ? idf_escape($ns) . "." : "") - . table($foreign_key["table"]) + . idf_escape($foreign_key["table"]) . " (" . implode(", ", array_map('idf_escape', $foreign_key["target"])) . ")" //! reuse $name - check in older MySQL versions . (preg_match("~^($on_actions)\$~", $foreign_key["on_delete"]) ? " ON DELETE $foreign_key[on_delete]" : "") . (preg_match("~^($on_actions)\$~", $foreign_key["on_update"]) ? " ON UPDATE $foreign_key[on_update]" : "") diff --git a/adminer/table.inc.php b/adminer/table.inc.php index d2af40c2..be73e611 100644 --- a/adminer/table.inc.php +++ b/adminer/table.inc.php @@ -44,7 +44,9 @@ if (!is_view($table_status)) { echo ""; echo "" . implode(", ", array_map('h', $foreign_key["source"])) . ""; echo "" - . ($foreign_key["db"] != "" ? "" . h($foreign_key["db"]) . "." : "") . ($foreign_key["ns"] != "" ? "" . h($foreign_key["ns"]) . "." : "") . h($foreign_key["table"]) + . ($foreign_key["db"] != "" && $foreign_key["db"] != DB ? "" . h($foreign_key["db"]) . "." : "") + . ($foreign_key["ns"] != "" && $foreign_key["ns"] != $_GET["ns"] ? "" . h($foreign_key["ns"]) . "." : "") + . h($foreign_key["table"]) . "" ; echo "(" . implode(", ", array_map('h', $foreign_key["target"])) . ")";