Oracle SQL изменить таблицу добавить столбец с текущим именем пользователя - PullRequest
0 голосов
/ 07 февраля 2020

Это был вопрос из двух частей, и я правильно получил метку времени. Я на 12 C и пытаюсь сделать что-то вроде:

ALTER TABLE customers
    ADD modified_by (USER FROM DUAL);

В основном это просто столбцы в таблице, которые показывают, кто изменил таблицу и в какое время они это сделали.

Я также попробовал

ALTER TABLE customers
    ADD last_modified TIMESTAMP;
ALTER TABLE customers
    ADD modified_by USER;

и другие комбинации ключевых слов, которые я нашел на этом и других сайтах, но ни одно из них не работает.

Мы изучали только два в классе, но я ищу какой-либо способ сделать это.

Редактировать:

Теперь я понимаю, чему меня научил пользователь с почти 1 миллион очков.

До сих пор не уверены, как сделать имя пользователя. Прочитайте это: https://docs.oracle.com/cd/B19306_01/server.102/b14237/statviews_2114.htm#REFRN20302

и попытайтесь:

ALTER TABLE customers
    ADD modified_by USERNAME;

не работает, получите неверный тип данных.

Затем увидел это: https://www.techonthenet.com/oracle/questions/find_users.php

и попытался:

ALTER TABLE customers
    ADD modified_by USERNAME FROM DBA_USERS;

, но получаю неверную опцию изменения таблицы. SQL сложно.

Ответы [ 2 ]

1 голос
/ 07 февраля 2020

После того, как вы отредактировали вопрос, кажется, что вы немного ближе к тому, что вы хотите. Это:

ALTER TABLE customers ADD modified_by VARCHAR2(30);
                                      ^^^^^^^^^^^^
                                      datatype goes here, not what you'd like
                                      to put into this column

Затем, во время вставки или обновления этой таблицы, вы поместите туда USER, например,

insert into customers (id, modified_by) values (100, USER);

Или, возможно, даже лучше, установите его в значение по умолчанию, как подсказывает @a_horse_with_no_name:

ALTER TABLE customers ADD modified_by VARCHAR2(30) DEFAULT USER;

поэтому - если вы явно не поместите ничего в этот столбец, он будет заполнен значением функции USER.

1 голос
/ 07 февраля 2020

Если вы прочитаете Oracle документацию о виртуальных столбцах, вы найдете это:

Функции в выражениях должны быть детерминированными c во время таблицы создание, но впоследствии может быть перекомпилировано и сделано недетерминированным c

Детерминированная c функция - это функция, которая возвращает то же значение, когда ей передаются те же аргументы. Используемые выражения содержат недетерминированные c функции. Следовательно, они недопустимы.

Ошибка, которую я получаю при попытке сделать следующее:

ORA-54002: в выражении виртуального столбца можно указать только чистые функции

По какой-то неизвестной причине Oracle приравнивает «pure» к «terministi c »в сообщении об ошибке. Но это говорит о том, что функция должна быть детерминированной c.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...