Получить список всех таблиц в oracle?

Исправьте ошибку ora-00942

Прежде всего, небольшой отказ от ответственности. Я не администратор баз данных, я администратор Windows, а также специалист по аппаратному и настольному оборудованию. Я знаю, как запустить SQL, но не до какой-то степени опыта и, конечно, не до уровня, который может устранять проблемы. Я должен был попросить моего друга Oracle DBA о помощи, поэтому, пока я писал эту часть, все умные биты принадлежали ему.

Этот список из трех причин ошибки ora-00942 не является исчерпывающим. Есть, очевидно, другие случайные причины этого, но эти три, по-видимому, наиболее распространены.

Недостаточно прав пользователя

Одной из основных причин ошибки ora-00942 является то, что у пользователя недостаточно прав для доступа к рассматриваемой таблице. Вы можете проверить это, выполнив два запроса.

-- перечислить системные привилегии для пользователя или роли
SELECT * FROM dba_sys_privs
ГДЕ получатель гранта (user_role, 'PUBLIC');

— список привилегий объекта для пользователя или роли

SELECT грантополучатель, владелец || '.' || объект table_name, привилегия, грантируемое
FROM dba_tab_privs
ГДЕ получатель гранта (user_role)
ORDER BY грантополучатель, владелец || '.' || table_name, привилегия;

Эти двое скажут вам, имеет ли данный пользователь правильные привилегии для запуска команды. Если пользователь имеет правильные привилегии, переходите к следующему. Если пользователь не имеет правильных привилегий, предоставьте их им или попросите администратора БД сделать это.

Ошибка ora-00942 также может возникнуть, если пользователь используемой схемы имеет привилегии INSERT, но не привилегии SELECT. Опять же, проверьте уровень привилегий и добавьте SELECT в список или попросите администратора БД сделать это. Очевидно, что каждой схеме должна быть предоставлена ​​определенная привилегия SELECT, в противном случае вы все равно увидите ошибку ora-00942.

Таблица или представление на самом деле не существуют

Причиной ошибки ora-00942 может быть неправильный синтаксис запроса или отсутствие таблицы. Хотя это может показаться логичным для начала, я уверен, что привилегия пользователя является причиной ошибки номер один. Таблица, которой там нет или используется неверный синтаксис таблицы, занимает второе место.

Чтобы проверить, существует ли таблица, сначала проверьте синтаксис запроса. Если синтаксис правильный, запустите этот запрос.

ВЫБЕРИТЕ владельца, имя_объекта, тип_объекта
ОТ всех_объектов
WHERE object_type IN ('TABLE', 'VIEW')
AND имя_объекта = ‘YOUR_TABLE_NAME ';

В последней строке вставьте фактическое имя таблицы, где вы видите «YOUR_TABLE_NAME». Это должно точно сказать вам, существует ли таблица, к которой вы пытаетесь обратиться, или нет. Если он возвращается без таблицы, запрашиваемая вами таблица не существует в схеме или базе данных.

Если в используемой вами системе есть меню «Таблицы», вы можете вручную проверить таблицу, если хотите, но вышеуказанный запрос выполняет свою работу.

Таблица или представление находятся в другой схеме

Если у пользователя есть права, и таблица существует, но вы все еще видите ошибку ora-00942, скорее всего, это связано со схемой. Если вы управляете несколькими схемами, легко выполнить запрос к схеме, которая не принадлежит вам. Когда вы заняты и против этого, это простая ошибка, чтобы сделать.

Проверьте схему вручную, если можно или добавьте имя схемы в строке ОТ вашего запроса. Если у вас нет правильных привилегий для новой схемы, вы снова увидите ошибку ora-00942. Вернитесь к первому исправлению привилегий пользователя и проверьте соответствующую схему или попросите своего администратора базы данных сделать это за вас.

Как упомянуто выше, я проконсультировался с моим приятелем по DBA Oracle для этой работы, так что вся заслуга ему в тяжелой работе. Если вы обнаружите здесь какие-либо ошибки или упущения, они одни. Дайте мне знать в разделе комментариев, если я что-то пропустил или ошибся, и я исправлю это.

Если вам известен какой-либо другой способ исправить ошибку ora-00942, сообщите нам об этом ниже!

DBA_TAB_COLUMNS

Предположим, вы нужно узнать среднюю длину каждой строки таблицы или значение по умолчанию каждого столбца (если таковое есть). Представление DBA_TAB_COLUMNS — отличный способ быстро получить всю детальную информацию о столбцах таблиц схемы, как показано в листинге ниже.

SQL> SELECT column_name,
2 avg_col_len,
3 data_type,
4 data_length,
5 nullable,
6 FROM dba_tab_columns
7* WHERE owner='OE';
COLUMN_NAME               AVG_COL_LEN     DATA_TYPE   DATA_LENGTH     NULL
----------------------    -----------     ---------   -------------   ----
CUSTOMER_ID                         4     NUMBER                 22   N
CUST_FIRST_NAME                     7     VARCHAR2               20   N
CUST_LAST_NAME                      8     VARCHAR2               20   N
TRANSLATED_DESCRIPTION            245     NVARCHAR2            4000   N
PRODUCT_DESCRIPTION               123     VARCHAR2             2000   Y
WARRANTY_PERIOD                     5     INTERVAL YEA            5   Y
SQL>

как использовать ограничения по умолчанию в MySQL | серия 20 | СЕРИЯ MySQL | КЛАСС 11 КОМПЬЮТЕРНЫЕ НАУКИ / IP

Как мне запросить базу данных Oracle для отображения имен всех таблиц в ней?

  • 1 Есть (как это сделано в MySQL) работает?
  • 1 @MartinThoma нет. попробовал это сначала, прежде чем прибегать к Google

Предполагается, что у вас есть доступ к просмотр словаря данных. Если у вас нет этих привилегий, но они вам нужны, вы можете запросить, чтобы администратор баз данных явно предоставил вам привилегии для этой таблицы, или чтобы администратор базы данных предоставил вам привилегия или роль (любая из которых позволит вам запрашивать любую таблицу словаря данных). Конечно, вы можете исключить определенные схемы, например а также которые содержат большое количество таблиц Oracle, которые вам, вероятно, не нужны.

В качестве альтернативы, если у вас нет доступа к , вы можете увидеть все таблицы, к которым у вашей учетной записи есть доступ, через Посмотреть:

Хотя это может быть подмножество таблиц, доступных в базе данных ( показывает информацию для всех таблиц, к которым вашему пользователю предоставлен доступ).

Если вас интересуют только таблицы, которыми вы владеете, а не те, к которым у вас есть доступ, вы можете использовать :

поскольку содержит информацию только о таблицах, которыми вы владеете, у него нет столбец владельцем, по определению, является вы.

В Oracle также есть несколько устаревших представлений словарей данных: , , , а также например — это можно было бы использовать. В общем, я бы не предлагал использовать эти унаследованные представления, если вам абсолютно не нужно переносить ваши скрипты в Oracle 6. Oracle давно не менял эти представления, поэтому у них часто возникают проблемы с новыми типами объектов. Например, а также оба представления показывают информацию о таблицах, которые находятся в корзине пользователя, а просмотры все отфильтровывают. также показывает информацию о материализованных журналах просмотра с «ТАБЛИЦА», что вряд ли будет тем, что вам действительно нужно. объединяет таблицы и синонимы и не сообщает вам, кому принадлежит объект.

9 Я получаю исключение «ORA-00942: таблица или представление не существует» 46 Значит, вам не разрешили просматривать все таблицы в базе данных. Вы можете запросить представление словаря данных ALL_TABLES, чтобы увидеть все таблицы, к которым вам разрешен доступ, которые могут быть небольшим подмножеством таблиц в базе данных. Простая ошибка, если не обычный пользователь sqlplus: добавьте конечную точку с запятой (‘;’), если вы просто не получаете результатов с помощью вышеуказанных команд :)

Обратите внимание, что в Oracle 12c в словаре данных dba_users есть столбец, который помогает удалить системные таблицы из набора результатов. Полный запрос будет: SELECT owner, table_name from dba_tables, where owner not in (выберите имя пользователя из dba_users, где oracle_mainhibited = ‘Y’)

Запрос а также не сработало. Это сделал:

14 @LimitedAtonement Извините, это неправильно. Представление называется user_tables, а не user_table. Если user_tables не работает для vitule, значит что-то еще не так.

Пройдя еще один шаг, есть еще одно представление под названием cols (all_tab_columns), которое можно использовать для определения, какие таблицы содержат данное имя столбца.

Например:

чтобы найти все таблицы, имена которых начинаются с EST, и столбцы, содержащие CALLREF в любом месте их имен.

Это может помочь при выборе столбцов, к которым вы хотите присоединиться, например, в зависимости от соглашений об именах таблиц и столбцов.

4 я сделал select * from cols и получил 0 строк.

Создание таблицы — путем копирования выбранных столбцов из другой таблицы

Синтаксис

Синтаксис CREATE TABLE AS, для копирования выбранных столбцов в Oracle PL/SQL:

CREATE TABLE new_table
AS (SELECT column_1, column2, … column_n
FROM old_table);

Пример

Рассмотрим на примере CREATE TABLE AS, который показывает, как создать таблицу путем копирования выбранных столбцов из другой таблицы.
Например:

Oracle PL/SQL

CREATE TABLE suppliers
AS (SELECT company_id, address, city, state, zip
FROM companies
WHERE company_id < 5000);

1
2
3
4

CREATETABLEsuppliers

AS(SELECTcompany_id,address,city,state,zip

FROMcompanies

WHEREcompany_id<5000);

Этот пример будет создать новую таблицу с наименованием suppliers. Новая таблица будет включать в себя только указанные столбцы (company_id, address, city, state и zip) из таблицы companies.
Кроме того, если в таблице companies будут записи, то новая таблица suppliers будет заполнена записями, возвращенными оператором SELECT.

Групповые привилегии

Роль получает привилегии своих групповых ролей. Нужно ли ей будет для получения привилегий выполнять SET ROLE зависит от атрибута роли, который мы можем указать при создании роли, как было показано на предыдущем уроке:

  • INHERIT – атрибут роли, который включает автоматическое наследование привилегий;
  • NOINHERIT – атрибут роли, который требует явное выполнение SET ROLE.

В 13 PostgreSQL при инициализации кластера создаются следующие роли вместе с суперпользователем postgres:

  • pg_signal_backend – право посылать сигналы обслуживающим процессам, например можно вызвать функцию pg_reload_conf() или завершить процесс с помощью функции pg_terminate_backend();
  • pg_read_all_settings – право читать все конфигурационные параметры, даже те, что обычно видны только суперпользователям;
  • pg_read_all_stats – право читать все представления pg_stat_* и использовать различные расширения, связанные со статистикой, даже те, что обычно видны только суперпользователям;
  • pg_stat_scan_tables – право выполнять функции мониторинга, которые могут устанавливать блокировки в таблицах, возможно, на длительное время;
  • pg_monitor – право читать и выполнять различные представления и функции для мониторинга. Эта роль включена в роли pg_read_all_settings, pg_read_all_stats и pg_stat_scan_tables;
  • pg_read_server_files – право читать файлы в любом месте файловой системы, куда имеет доступ postgres на сервере. А также выполняя копирование и другие функции работы с файлами;
  • pg_write_server_files – право записывать файлы в любом месте файловой системы, куда имеет доступ postgres на сервере. А также выполнять копирование и другие функции работы с файлами.
  • pg_execute_server_program – право выполнять программы на сервере (от имени пользователя, запускающего СУБД).

Какие бывают обобщенные табличные выражения?

Они бывают простые и рекурсивные.

Простые не включают ссылки на самого себя, а рекурсивные соответственно включают.

Рекурсивные ОТВ используются для возвращения иерархических данных, например, классика жанра это отображение сотрудников в структуре организации (чуть ниже мы это рассмотрим).

В качестве тестовых данных давайте использовать таблицу TestTable, которая будет содержать идентификатор сотрудника, его должность и идентификатор его начальника.

Где,

  • UserID — идентификатор сотрудника;
  • Post — должность;
  • ManagerID — идентификатор начальника.

Как видите, у директора отсутствует ManagerID, так как у него нет начальника. А теперь переходим к примерам.

DBA_DATA_FILES

Представление словаря данных — еще одно исключительно полезное представление, к которому вы будете часто обращаться при управлении пространством хранилища базы данных. Это представление запрашивается для нахождения имен всех файлов данных, табличных пространств, к которым они относятся, и информации об этих файлах, такой как количество байтов и блоков, а также относительный номер файла. Простой запрос к представлению отображает все файлы данных, как показано в листинге 3.

Представление — аналог представления , дающего информацию о временных файлах временных табличных пространств.

DBA_TAB_MODIFICATIONS

Представление DBA_TAB_MODIFICATIONS показывает все изменения DML в таблице,произошедшие с момента последнего сбора статистики по этой таблице. Вот запрос к этому представлению: 

SQL> SELECT table_name, inserts, updates, deletes
FROM DBA_TAB_MODIFICATIONS;
TABLE_NAME                  INSERTS  UPDATES  DELETES
--------------------------  -------  -------  -------
WRH$ACTIVE_SESSION_HISTORY  1233     0        0
WRH$SERVICE_STAT            5376     0        0
WRH$SERVICE_WAIT_CLASS      1050     0        0
. . .
SQL>

База данных не обновляет представление DBA_TAB_MODIFICATIONS в реальном времени. Следовательно, вы можете и не увидеть изменений в различных таблицах, немедленно отраженных в этом представлении.

Удаление всех данных из таблицы

Для удаления всех строк из таблицы можно применить команду TRUNCATE, которая,несмотря на название, на самом деле ничего не усекает и не сокращает — она просто очень быстро удаляет все строки. TRUNCATE — команда DDL, поэтому она не может быть отменена командой ROLLBACK.

Можно также удалить все строки из таблицы командой DELETE * FROM TABLE…, и поскольку это команда DML, то в этом случае при желании возможна отмена удаления.Однако поскольку команда DELETE пишет все изменения в сегменты отмены, на ее выполнение требуется намного больше времени. Команде TRUNCATE не нужно возиться с сегментами отмены, поэтому она выполняется за считанные секунды, даже для очень крупных таблиц.

Вот пример команды TRUNCATE в действии: 

SQL> SELECT COUNT(*) FROM test;
COUNT(*)
-----------
31
SQL> TRUNCATE TABLE test;
Table truncated.
SQL> SELECT COUNT(*) FROM test;
COUNT(*)
------------
0
SQL>

Создание новой таблицы с помощью CTAS

Чтобы создать новую таблицу, которая будет идентичной существующей, или же создать новую таблицу, которая включит только некоторые строки и столбцы из другой таблицы, можно воспользоваться командой CREATE TABLE AS SELECT * FROM.С помощью этой команды легко загрузить часть существующей таблицы в новую таблицу, используя условия where, или же загрузить все данные из старой таблицы в новую,применяя конструкцию SELECT * FROM, как показано в следующем фрагменте кода:

SQL> CREATE TABLE emp_new
AS
SELECT * FROM emp;
Table created.
SQL>

Если таблица содержит миллионы строк, а ваше время слишком ограничено, чтобы использовать метод CTAS, существует пара способов ускорить создание новой таблицы,содержащей большие объемы данных. Если создаваемая таблица должна быть пустой,то время на ее создание беспокоить не должно — она будет создана немедленно. Но если вы загружаете новую таблицу данными из другой таблицы, то можете выиграть от применения опций PARALLEL и NOLOGGING, которые ускоряют загрузку крупных таблиц.

Опция PARALLEL позволяет осуществлять загрузку данных параллельно несколькими процессами, а опция NOLOGGING инструктирует Oracle о том, что протоколировать изменения, происходящие при загрузке в файлы журналов повторного выполнения и сегменты отката (за исключением очень небольшого объема, необходимого для внутренних потребностей), не требуется. Вот пример:

SQL> CREATE TABLE employee_new
2 AS SELECT * FROM employees
3 PARALLEL DEGREE 4
4* NOLOGGING;
Table created.
SQL>

Другой метод, который можно применять для экономии времени во время создания таблицы, состоит в перемещении таблицы из одного табличного пространства в другое. Можете воспользоваться преимуществом операции перемещения, чтобы изменить любые параметры хранения. Ниже приведен пример команды ALTER TABLE…MOVE,которая позволяет быстро перемещать таблицы между табличными пространствами.В данном примере таблица employee перемещается из ее текущего табличного пространства в новое: 

SQL> ALTER TABLE employee MOVE new_tablespace;

При перемещении таблицы идентификаторы ROWID ее строк меняются, а это означает, что база данных не позволит добавлять, удалять или изменять данные каким-либо образом. Например, если есть конфигурационная таблица, которую требуется сохранить от любых изменений любыми пользователями, можно изменить ее статус на “только для чтения”.

Воспользуйтесь оператором ALTER TABLE для перевода таблицы в режим “только для чтения”: 

SQL> ALTER TABLE test READ ONLY;

После перевода таблицы в режим “только для чтения” база данных не позволит выполнять на ней следующие операции:

  • TRUNCATE TABLE
  • SELECT FOR UPDATE
  • Любые операции DML
  • ALTER TABLE ADD/MODIFY/RENAME/DROP COLUMN
  • ALTER TABLE SET COLUMN UNUSED
  • ALTER TABLE DROP/TRUNCATE/EXCHANGE (SUB)PARTITION
  • ALTER TABLE UPGRADE INCLUDING DATA or ALTER TYPE CASCADE INCLUDING
  • TABLE DATA для типа, от которого зависит таблица “только для чтения”
  • Оперативное переопределение
  • FLASHBACK TABLE

Перечисленные ниже операции на таблице “только для чтения” выполнять можно:

  • SELECT
  • CREATE/ALTER/DROP INDEX
  • ALTER TABLE ADD/MODIFY/DROP/ENABLE/DISABLE CONSTRAINT
  • ALTER TABLE для изменения физических свойств
  • ALTER TABLE MOVE
  • RENAME TABLE и ALTER TABLE RENAME TO
  • DROP TABLE

Вернуть таблицу в нормальное состояние “чтение-запись” можно, указав конструкцию READ WRITE в операторе ALTER TABLE:

SQL> ALTER TABLE test READ WRITE; 

Представления словаря данных

 Словарь данных содержим метаданные: грубо говоря данные о данных. Он содержит описание базы данных, физическую и логическую структуру и содержание БД. Учётные записи, информация о безопасности, целостные ограничения и (начиная с версии 10g) информацию о производительности – всё это хранится в словаре данных. Логически это набор сегментов а табличных пространствах SYSTEM и SYSAUX.

Сегменты словаря данных практически идентичны обычным пользовательским сегментам (таблицам и индексам). Ключевым различием является то, что таблицы словаря данных создаются в момент создания БД и не могут быть использованы напрямую. Конечно физически это возможно,но любые изменения могут привести к нарушению БД и никто не сможет вам помочь. Создание словаря данных – это часть процесса создания базы данных. Словарь данных управляется DDL (Data Definition Language) командами. Когда вы запускаете команду CREATE TABLE – вы не только создаёте сегмент данных для хранения строк в нем – ваша команда также добавит строки в различные таблицы словаря данных, которые содержат информацию о табличном пространстве, extent-ах, столбцах и владельце сегмента.

Для просмотра словаря данных, Oracle предоставляет набор представлений, отличающихся префиксом: DBA_, ALL_ или USER_. Практически все представления созданы для всех трёх префиксов. Любое представление начинающееся с USER_ отобразит инфомрацию об объектах, владельцем которых является текущий пользователь. Если пользователя ВАСЯ будет просматривать представление USER_TABLES, то он увидит только таблицы владельцем которых он является. Представления начинающиеся с ALL_ отображают объекты, к которым у текущего пользователя есть доступ. Т.е. если выполнить запрос в ALL_TABLES то вернутся строки таблица которые вы создали, плюс строки о таблицах других пользователей к которым у вас есть доступ для просмотра. Любое представление с префиксом DBA_ содержит информацию о всех объектах в БД, то есть DBA_TABLES будет содержать строки для всех таблиц во всей базе данных, без разницы кто их создал. Рисунок 3-10 отображает концепцию трех видов представлений. Для доступа к представлениям с префиксом DBA _– у пользователя дожны быть права доступа DBA.

Эти представления создаются во время создания БД, вместе с огромным количеством PL/SQL пакетов, которые предоставляет Oracle для упрощения администрарования БД и разработки приложений.

Существует несколько сот представлений словаря данных. Некоторые часто используемые DBA это

DBA_OBJECT содержит строки для всех объектов в БД

DBA_DATA_FILES каждая строка описаывает файл данных

DBA_USER строки отображают информацию об учётной записи

DBA_TABLES описание таблиц

DBA_ALERT_HISTORY строки описывают последние события для записи в системный журнал

Также существует много других представлений и вместе с представлениями создаются синонимы. Следующий запрос

select object_name,owner, object_type from dba_objects where object_name=’DBA_OBJECTS’;

показывает, что фактически владельцем представления DBA_OBJECTS является SYS и создан синоним с таким же названием, к которому и выполнен запрос.

Создание таблицы — путем копирования выбранных столбцов из нескольких таблиц

Синтаксис

Синтаксис CREATE TABLE AS, для копирования столбцов из нескольких таблиц в Oracle PL/SQL:

CREATE TABLE new_table
AS (SELECT column_1, column2, … column_n
FROM old_table_1, old_table_2, … old_table_n);

Пример

Рассмотрим пример CREATE TABLE AS, который показывает, как создать таблицу путем копирования выбранных столбцов из нескольких таблиц.
Например:

Oracle PL/SQL

CREATE TABLE suppliers
AS (SELECT companies.company_id, companies.address, categories.category_type
FROM companies, categories
WHERE companies.company_id = categories.category_id
AND companies.company_id < 5000);

1
2
3
4
5

CREATETABLEsuppliers

AS(SELECTcompanies.company_id,companies.address,categories.category_type

FROMcompanies,categories

WHEREcompanies.company_id=categories.category_id

ANDcompanies.company_id<5000);

В этом примере будет создана новая таблиц с наименованием suppliers на основе столбцов определенных из двух таблиц companies и categories (company_id, address, category_type).

Show Tables in SQL Server

There are a few ways to list tables in SQL Server.

All Tables and Views

The easiest way to find all tables in SQL is to query the INFORMATION_SCHEMA views.

You do this by specifying the information schema, then the “tables” view.

Here’s an example.

This will show the name of the table, which schema it belongs to, and the type.

The type will either be “BASE TABLE” for tables or “VIEW” for views.

SQL Server 2000

If you’re running SQL Server 2005 you can use the information_schema method above. If you’re on 2000 or earlier, then you’ll need to use a different method.

You can query the SYSOBJECTS view to find all of the tables in the database. This shows all objects, so to filter it to tables we can filter on the xtype column equals the value of “U”, which represents a user table.

Here’s the query:

Понятие NULL. Not-null колонки

Ячейки в таблицах могут быть пустыми, т.е. не содержать значения. Для
обозначения отсутствия значения в ячейке используется ключевое слово .
Null могут содержать ячейки с любым типом данных.

Рассмотрим таблицу cars из предыдущего примера. В каждой из трех ее колонок может
храниться Null(даже в колонке , если указать значение Null явно при вставке).

Но представляют ли информационную ценность строки в таблице, где абсолютно
нет значений? Конечно нет. Если рассматривать таблицу
как источник информации об автомобилях, то нам хотелось бы получать
хоть какую-то полезную информацию

Наиболее важной здесь будет
колонка model — без нее информация о стране-производителе и количестве колес будет бесполезной.

Для того, чтобы запретить Null-значения в колонке при
создании таблицы, к описанию колонки добавляется :

create table cars(
    model varchar2(50 char) not null,
    country varchar2(50 char),
    wheel_count number(2) default 4
)

Теперь БД гарантирует, что колонка не будет пустой,
по крайней мере до тех пор, пока флаг включен для этой колонки.

Также можно указать, что колонка тоже не должна содержать :

create table cars(
    model varchar2(50 char) not null,
    country varchar2(50 char),
    wheel_count number(2) default 4 not null
);

DBA_TABLESPACES

Представление — очень важное представление словаря для управления табличными пространствами. С помощью этого представления можно много узнать о табличных пространствах, например, отключены или подключены ли они в данный момент (offline/online); являются ли они undo, постоянными или временными; тип управления экстентами, тип расширения, тип управления пространством сегментов;состоят они из bigfile или smallfile

В статье наших блогов “Создание табличных пространств” уже были даны  примеры применения этого представления. Представление словаря служит для поиска важной информации о табличном пространстве, в том числе:

  • размер начального экстента;
  • размер следующего экстента;
  • максимальное количество экстентов по умолчанию;
  • статус (онлайновое, отключенное, только для чтения);
  • содержимое (постоянное, временное или undo);
  • тип управления экстентами ( или );
  • управление пространством сегмента ( или ).

DBA_IND_COLUMNS

Представления DBA_IND_COLUMNS по структуре подобно представлению DBA_CONS_COLUMNS и содержит информацию обо всех проиндексированных столбцах каждой таблицы. Эта информация важна при настройке производительности, когда вы замечаете,что запрос использует индекс, но вы не знаете точно, на каких столбцах этот индекс определен. Запрос, приведенный в листинге ниже, показывает, что таблица имеет индексы, определенные на неверных столбцах.

SQL> SELECT index_name,
2 table_name,
3 column_name,
4 column_position
5 FROM DBA_IND_COLUMNS
6* WHERE table_owner='OE';
INDEX_NAME                TABLE_NAME     COLUMN_NAME       COLUMN_POSITION
-----------------------   -----------    ----------------  ---------------
CUST_ACCOUNT_MANAGER_IX   CUSTOMERS      ACCOUNT_MGR_ID    1
CUST_LNAME_IX             CUSTOMERS      CUST_LAST_NAME    1
CUST_EMAIL_IX             CUSTOMERS      CUST_EMAIL        1
INVENTORY_PK              INVENTORIES    PRODUCT_ID        1
INVENTORY_PK              INVENTORIES    WAREHOUSE_ID      2
INV_PRODUCT_IX            INVENTORIES    PRODUCT_ID        1
ORDER_PK                  ORDERS         ORDER_ID          1
ORD_SALES_REP_IX          ORDERS         SALES_REP_ID      1
ORD_CUSTOMER_IX           ORDERS         CUSTOMER_ID       1
SQL>

Совет. Взглянув на столбец INDEX_NAME, можно легко идентифицировать составные ключи. Если одно и то же вхождение INDEX_NAME появляется больше одного раза, значит, это составной ключ; и столбцы, являющиеся его частью, показаны в столбце COLUMN_NAME. Например,INVENTORY_PK — первичный ключ таблицы INVENTORIES, определенный на двух столбцах:PRODUCT_ID и WAREHOUSE_ID. Порядок столбцов в определении составного ключа можно узнать с помощью столбца COLUMN_POSITION.

INDEX_STATS

Представление INDEX_STATS полезно для того, чтобы узнать, насколько эффективно индекс использует свое пространство. Крупные индексы имеют тенденцию со временем становиться несбалансированными, если происходит много удалений данных таблицы (а, следовательно, и индекса). Ваша цель — не упускать из виду эти крупные индексы,чтобы сохранять их сбалансированными.

Обратите внимание, что представление INDEX_STATS наполняется, только когда таблица подвергается анализу с помощью команды ANALYZE, как показано ниже: 

SQL> ANALYZE index hr.emp_name_ix VALIDATE STRUCTURE;
Index analyzed.

Запрос из листинга ниже, использующий представление INDEX_STATS, помогает определить необходимость в перестройке индекса. Чтобы определить, следует ли перестраивать индекс, в запросе необходимо сосредоточиться на перечисленных ниже столбцах представления INDEX_STATS.

  • HEIGHT. Этот столбец ссылается на высоту B-дерева индекса и обычно имеет значение уровня 1, 2 или 3. Если массивные вставки данных выталкивают индекс на высоту уровня 4, самое время перестроить индекс, уменьшив высоту B-дерева.
  • DEL_LF_ROWS. Это количество листовых узлов, удаленных из-за удаления строк.Oracle не перестраивает индекс автоматически и, следовательно, слишком много удалений листовых строк могут привести к несбалансированному B-дереву.
  • BLK_GETS_PER_ACCESS. Столбец BLK_GETS_PER_ACCESS позволяет увидеть, сколько логических операций ввода-вывода требуется для извлечения данных индекса.Если здесь находится двузначное число, значит, наступило время для перестройки индекса.
SQL> SELECT height, /* Высота B-дерева */
2 blocks, /* Блоки в сегменте индекса */
3 name, /* Имя индекса */
4 lf_rows, /* Количество листовых строк в индексе */
5 lf_blks, /* Количество листовых блоков в индексе */
6 del_lf_rows, /* Количество удаленных листовых строк в индексе */
7 rows_per_key /* Среднее количество строк на каждый отдельный ключ */
8 blk_gets_per_access /* Согласованные чтения блоков (gets) */
8 FROM INDEX_STATS
9* WHERE name='EMP_NAME_IX';
HEIGHT  BLOCK        LF_ROWS  LF_BLKS   DEL_LF_ROWS  ROWS_PER_KEY  BLK_GETS
------  -----------  -------  --------  -----------  ------------  ---------
16      EMP_NAME_IX  107      1         0            1             1
SQL> 

Удаление таблиц

Для удаления таблицы служит команда DROP TABLE имя_таблицы. Чтобы иметь возможность удалить таблицу, пользователь должен быть ее владельцем (она должна быть в его схеме) или же обладать привилегией DROP ANY TABLE.

После выдачи команда DROP TABLE таблица не исчезает немедленно — Oracle просто переименовывает таблицу и сохраняет ее в корзине (Recycle Bin), которая на самом деле является таблицей словаря данных. Поэтому можно вернуть нечаянно удаленную таблицу с помощью следующей команды: 

SQL> FLASHBACK TABLE emp TO BEFORE DROP;

Возможность восстановления удаленной таблицы называется средством Flashback Drop (Ретроспектива удаления). 

Если вы уверены, что таблица никогда более не понадобится, можете окончательно избавиться от нее, указав опцию PURGE в команде DROP TABLE:

SQL> DROP TABLE emp PURGE;

В результате использования приведенной выше команды PURGE таблица emp будет немедленно уничтожена без возможности восстановления!

На заметку! Команда DROP TABLE имя_таблицы PURGE эквивалентна старой команде DROP TABLE имя_таблицы в версиях, предшествовавших Oracle Database 10g.

Когда вы удаляете таблицу, все индексы, относящиеся к ней, также удаляются. Если таблица, которую необходимо удалить, содержит первичные или уникальные ключи,на которые ссылаются во внешних ключах другие таблицы, потребуется включить конструкцию CASCADE в оператор DROP TABLE, чтобы одновременно уничтожить эти ограничения:

SQL> DROP TABLE emp CASCADE CONSTRAINTS;

Получаем список всех таблиц с помощью системной процедуры

Еще одним способом получения списка таблиц в базе данных Microsoft SQL Server является использование системной процедуры sp_Tables, но, на мой взгляд, данный способ менее удобный, к тому же он возвращает также немного сведений, по сути, только название таблиц.

Для того чтобы получить сведения о таблицах в БД нам нужно указать параметр @table_type со значением ‘TABLE’, так как данная процедура возвращает еще данные о представлениях и системных таблицах

Следует обратить внимание на то, что значение параметра нужно заключать в двойные кавычки, а каждое значение типа в одиночные кавычки, так как через запятую возможно указывать несколько типов (например, для того чтобы получить таблицы и представления, в значение параметра нужно указать — «‘TABLE’, ‘VIEW’»). Также мы укажем параметр @table_owner, для того чтобы ограничиться одним владельцем

   
   EXEC sp_Tables @table_owner = 'dbo', 
                           @table_type = "'TABLE'";

Вот мы с Вами и рассмотрели три возможности получения списка таблиц в Microsoft SQL Server.Всем тем, кто только начинает свое знакомство с языком SQL, рекомендую прочитать книгу SQL код» – это самоучитель по языку SQL, которую написал я, и в которой я подробно, и в то же время простым языком, рассказываю о языке SQL.

У меня все, пока!

Нравится5Не нравится

Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Все про сервера
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: