Mottchanさんの助け合いフォーラム投稿一覧
解説では、
「・DML文は1つの文で1つのトランザクションになる
DML文は1つ以上の文のまとまりで1つのトランザクションになります。」
となるので、ばつとなっています。
DML文は1つ以上の文のまとまりで1つのトランザクションが正解であれば
DML文は1つの文で1つのトランザクションになる。も正解では無いでしょうか。
1つ以上の文のまとまりという言葉が理解できていないかもしれません。
誰かわかる人教えてください。
・データ・ディクショナリの所有者はSYSTEMユーザーである
データ・ディクショナリはSYSユーザーによって所有され、SYSTEM表領域(管理情報が格納されている論理的な記憶領域)に格納されているので、誤りです。
→SYSTEMユーザーとSYSユーザーは異なる。
ORACLE公式ドキュメントより
7.3.1 SYSおよびSYSTEMユーザー
SYS
このアカウントでは、すべての管理機能を実行できます。データベースのデータ・ディクショナリ用のすべての実表およびベース・ビューはSYSスキーマに保存されます。これらの実表およびベース・ビューはOracle Databaseを操作する際に重要となります。データ・ディクショナリの整合性を保持するには、SYSスキーマ内の表をデータベースのみで操作します。すべてのユーザーまたはデータベース管理者による変更は絶対に行わないでください。また、SYSスキーマ内に表を作成しないでください。
SYSユーザーにはSYSDBA権限が付与され、この権限によりバックアップやリカバリのような高水準な管理タスクを実行できます。
SYSTEM
このアカウントは、次の例外を除いたすべての管理機能を実行します。
・バックアップとリカバリ
・データベースのアップグレード
このアカウントを使用して日常的な管理タスクを実行できますが、Oracle Databaseを管理するための名前付きユーザー・アカウントを作成して、データベース・アクティビティを監視できるようにすることをお薦めします。
SYSユーザーとSYSTEMユーザーの違いは、SYSDBA権限があるかないかの違いである。
ORACLE公式ドキュメントより
7.3.2 SYSDBAおよびSYSOPERシステム権限
SYSDBAおよびSYSOPERはデータベースの作成、起動、停止、バックアップまたはリカバリなどの高度な管理操作を実行するために必要な管理権限です。SYSDBAシステム権限は、すべての権限を持つデータベース管理者用、SYSOPERシステム権限は、基本的な運用タスクを実行するがユーザー・データを表示する権限は持たないユーザー用です。
また、
ORACLE公式ドキュメントより、
SYS(データ・ディクショナリの所有者)
データ・ディクショナリのすべての実表とユーザー・アクセス可能ビューは、Oracle DatabaseユーザーSYSが所有しています。したがって、Oracle Databaseユーザーは、SYSスキーマに含まれている行またはスキーマ・オブジェクトを決して変更(UPDATE、DELETEまたはINSERT)しないでください。そのような操作により、データ整合性が損われることがあります。セキュリティ管理者は、このアカウントを厳しく管理する必要があります。
となっているので、SYSDBA権限はDBの中でもかなり重要な権限となっている。
以下の文は正解のクエリとなっていますが、>の解説がありませんのでよくわかりませんでした。
SELECT department_id, AVG(salary) FROM employees WHERE salary > (SELECT MIN(salary) FROM employees) GROUP BY department_id
どなたかご教授いただけると幸いです。
以下の2つのCREATE文で、
列UNIQUE制約を付与してから複数列UNIQUE制約をつけるのと、
複数列UNIQUE制約のみの場合でどのように違うか教えてください。
CREATE TABLE temp
(
id NUMBER(2) CONSTRAINT id_uq UNIQUE NOT NULL,
name VARCHAR2(10) CONSTRAINT name_nn NOT NULL,
birth DATE,
CONSTRAINT temp_uq UNIQUE(id, name)
);
CREATE TABLE temp
(
id NUMBER(2) CONSTRAINT id_uq NOT NULL,
name VARCHAR2(10) CONSTRAINT name_nn NOT NULL,
birth DATE,
CONSTRAINT temp_uq UNIQUE(id, name)
);
解説:
表の結合を行う際に、表接頭辞として「表名」または「表別名」を指定すると、メモリの使用量が節約でき、パフォーマンスの向上につながります。
ただし、同じ表の表接頭辞として「表名」と「表別名」を混在することはできません。
「表名」と「表別名」を混在している状況ってどのようなコードでしょうか。
ON e.emp = job みたいなことでしょうか。
どちらか片方だけで表Aの参照権限はuserに付与されて、表Aをslectできるようになると思います。
表Aを参照権限を付与したい場合、
GRANT SELECT ON 表A TO user;
全ての表の参照権限を付与したい場合、
GRANT SELECT ANY TABLE TO user;
少し調べましたが、ここが一番わかりやすいとおもいます。↓
オブジェクト権限とシステム権限
そう考えると実務でテーブル数が多い場合、全部ANYでいいじゃんってなると思うんですけど、
セキュリティ面を考えてANYを使わないで多くの表に権限を付与する方法というのもあるみたいです。以下Oracleの公式サイト↓
SELECT ANY TABLEシステム権限を使わないために
Oracle® Database SQL言語リファレンスより
CASCADE CONSTRAINTS
CASCADE CONSTRAINTSを指定すると、削除される表の主キーまたは一意キーを参照するすべての参照整合性制約を削除できます。このような参照整合性制約があるときにこの句を省略した場合、エラーが戻され、表は削除されません。
上記の書き方だと、参照整合性制約を削除した上で表を削除するんだと思います。
Oracleガイドラインより
大きな表で頻繁に検索される行の割合が15%未満の場合は索引を作成してください。割合は、表スキャンの相対速度、および索引キーに対する行データの分散度によって大きく異なります。表スキャンが高速であるほど割合は低くなり、クラスタ化されている行データが多いほど割合は高くなります。
10%以上でも索引は使用した方が良いのでは無いでしょうか。
タイトルの通りです。もし、わかる方いたらお願いします。
SELECT employee_name, department_name, job_name
FROM departments d JOIN employees e
ON d.department_id = e.department_id JOIN jobs j
ON e.job_id = j.job_id;