権限チェック

調べた限りなし

(19c)
権限分析

-- 権限分析ポリシーの作成

select * from DBA_PRIV_CAPTURES;

---- データベース分析

BEGIN
DBMS_PRIVILEGE_CAPTURE.CREATE_CAPTURE(
name => 'db_wide_capture_pol',
description => 'Captures database-wide privileges',
type => DBMS_PRIVILEGE_CAPTURE.G_DATABASE);
END;
/

---- ロール分析
BEGIN
DBMS_PRIVILEGE_CAPTURE.CREATE_CAPTURE(
name => 'dba_roles_capture_pol',
description => 'Captures DBA and LBAC_DBA role use',
type => DBMS_PRIVILEGE_CAPTURE.G_ROLE,
roles => role_name_list('dba', 'aq_user_role'));
END;
/

---- コンテキスト分析
BEGIN
DBMS_PRIVILEGE_CAPTURE.CREATE_CAPTURE(
name => 'sqlplus_capture_pol',
description => 'Captures privilege use during SQL*Plus use',
type => DBMS_PRIVILEGE_CAPTURE.G_CONTEXT,
condition => 'SYS_CONTEXT(''USERENV'', ''MODULE'')=''sqlplus''');
END;
/

 

-- 権限分析ポリシーの有効化

select * from DBA_PRIV_CAPTURES;

EXEC DBMS_PRIVILEGE_CAPTURE.ENABLE_CAPTURE ('db_wide_capture_pol');


-- 権限分析レポートの作成


EXEC DBMS_PRIVILEGE_CAPTURE.DISABLE_CAPTURE ('db_wide_capture_pol');
EXEC DBMS_PRIVILEGE_CAPTURE.GENERATE_RESULT ('db_wide_capture_pol');

select count(*) from DBA_USED_PRIVS;
select count(*) from DBA_UNUSED_PRIVS;

 

-- 権限分析ポリシーの削除
select * from DBA_PRIV_CAPTURES;


EXEC DBMS_PRIVILEGE_CAPTURE.DROP_CAPTURE ('sqlplus_capture_pol');

 

(13)
https://qiita.com/U_ikki/items/c7714f8cd19ab2012dd1
https://www.cybertec-postgresql.com/en/pg_permission-inspecting-your-postgresql-security-system/


-- インストール
git clone https://github.com/cybertec-postgresql/pg_permission.git

cd pg_permission
export PATH=$PATH:/usr/pgsql-13/bin
make install


CREATE EXTENSION pg_permissions ;

-- VIEWの確認
select * from all_permissions;
select * from database_permissions;
select * from schema_permissions;
select * from table_permissions;
select * from column_permissions;
select * from sequence_permissions;
select * from view_permissions;
select * from function_permissions;


-- 権限チェック

-- 検証例
user30を使用し、スキーマレベルとテーブルレベルで足りない権限と余計な権限を付与

-- あるべき権限
スキーマレベル: schema1へのusage権限,schema1へのcreate権限
テーブルレベル: schema1.tab1へのupdate権限,schema1.tab1へのselect権限

-- 実際の権限
スキーマレベル: schema1へのusage権限,schema2へのusage権限
テーブルレベル: schema1.tab1へのupdate権限,schema1.tab1へのdelete権限

-- 検証用ユーザ作成

drop owned by user30 cascade;
drop user user30;

drop schema schema1 cascade;
drop schema schema2 cascade;

create schema schema1;
create schema schema2;

create table schema1.tab1(col1 int);

create user user30 with login encrypted password 'user30';
grant usage on schema schema1 to user30;
grant usage on schema schema2 to user30;
grant update,delete on schema1.tab1 to user30;


-- あるべき権限をテーブルに登録
select * from permission_target;

truncate table permission_target;


insert into permission_target(role_name,permissions,object_type,schema_name)
values('user30','{USAGE,CREATE}','SCHEMA','schema1');

insert into permission_target(role_name,permissions,object_type,schema_name,object_name)
values('user30','{SELECT,UPDATE}','TABLE','schema1','tab1');

select * from permission_target;

select * from permission_diffs()
where role_name = 'user30'
;

missing | role_name | object_type | schema_name | object_name | column_name | permission
---------+-----------+-------------+-------------+-------------+-------------+------------
t | user30 | SCHEMA | schema1 | | | CREATE
f | user30 | TABLE | schema1 | tab1 | | DELETE
t | user30 | TABLE | schema1 | tab1 | | SELECT

→余計なスキーマ権限が検出できていない。その他は検出できている。

 

 

調べた限りなし

 

read only設定

(8.0.21)

show variables like '%read%only%';

innodb_read_only →スーパーユーザも書き込み不可
read_only →スーパーユーザは書き込み可能
super_read_only →スーパーユーザも書き込み不可
transaction_read_only →スーパーユーザも書き込み不可(トランザクションレベル)


※super_read_onlyとinnodb_read_onlyに機能的な差はない模様


-- データベースレベル

select @@read_only;
select @@innodb_read_only;
select @@super_read_only;

-- テーブルレベル
ない模様


-- トランザクションレベル
set transaction_read_only=ON;

select @@transaction_read_only;

 

(19c)

-- データベースレベル(CDB)

shutdown immediate;
startup mount;
alter database open read only;
alter database open read write;

select open_mode from v$database;


-- データベースレベル(PDB)

alter pluggable database pdb1 close immediate;
alter pluggable database pdb1 open read only;
alter pluggable database pdb1 open read write;

select * from v$pdbs;

-- テーブルレベル

alter table tab1 read only;
alter table tab1 read write;

select table_name,read_only from user_tables where table_name = 'TAB1';


-- トランザクションレベル

set transaction read only;
set transaction read write;

 

(13)

 

-- データベースレベル


alter database test set default_transaction_read_only = on;
alter database test set default_transaction_read_only = off;
show default_transaction_read_only;


※新規セッションから有効


-- テーブルレベル
ない模様


-- トランザクションレベル

set transaction read only;
set transaction read write;

 

(2019)


-- データベースレベル

ALTER DATABASE test SET READ_ONLY;
ALTER DATABASE test SET READ_WRITE;

select name,is_read_only from sys.databases;

 

-- テーブルレベル
ない模様

-- トランザクションレベル
ない模様

 

プランガイド

SQL文を変更せずに、実行計画を修正する機能

調べた限りなし

(12cR1)

-- プランスタビリティ( ストアドアウトライン )
※レガシーのため、SQL計画管理への移行が推奨される


-- 検証方法
ストアドアウトラインでヒント句を使用せずにフルスキャンの実行計画を作成し、
意図的にインデックスを使用しない実行計画を強制する

-- テストテーブル作成
drop table tab1 purge;
create table tab1(col1 int, col2 int);
alter table tab1 add constraint tab1pk primary key(col1);
create index ind12 on tab1(col2);

-- ストアドアウトライン用データ作成
truncate table tab1;

declare
begin
for i in 1..1000000 loop
insert into tab1 values(i,0);
commit;
end loop;
end;
/

exec dbms_stats.gather_table_stats('TEST','TAB1');

explain plan for
select count(col1) from tab1 where col2 = 0;

SELECT PLAN_TABLE_OUTPUT FROM TABLE(DBMS_XPLAN.DISPLAY());


-- ストアドアウトライン作成

create or replace public outline outline01 for category cat01
on select count(col1) from tab1 where col2 = 0;


select * from all_outlines where category='CAT01';
select * from all_outline_hints where name='OUTLINE01';


-- 検証用データ作成

truncate table tab1;

declare
begin
for i in 1..1000000 loop
insert into tab1 values(i,i);
commit;
end loop;
end;
/

exec dbms_stats.gather_table_stats('TEST','TAB1');

explain plan for
select count(col1) from tab1 where col2 = 0;

SELECT PLAN_TABLE_OUTPUT FROM TABLE(DBMS_XPLAN.DISPLAY());

→実行計画はインデックスを使用している


-- ストアドアウトライン動作確認

alter session set USE_STORED_OUTLINES = CAT01;

explain plan for
select count(col1) from tab1 where col2 = 0;

SELECT PLAN_TABLE_OUTPUT FROM TABLE(DBMS_XPLAN.DISPLAY());

→実行計画がFULL SCANに変化

 

(12)

-- pg_hint_planのテーブルでヒント句を指定する方法


-- インストール

yum install https://ja.osdn.net/projects/pghintplan/downloads/72398/pg_hint_plan12-1.3.5-1.el7.x86_64.rpm

CREATE EXTENSION pg_hint_plan;

 

vim postgresql.conf
shared_preload_libraries = 'pg_hint_plan'


-- 検証方法
pg_hint_planのテーブル指定による方法でフルスキャンのヒント句を指定し、
意図的にインデックスを使用しない実行計画を強制する

-- テストテーブル作成
drop table tab1;
create table tab1(col1 int, col2 int);
alter table tab1 add constraint tab1pk primary key(col1);
create index ind12 on tab1(col2);

-- テスト用データ作成
truncate table tab1;

do $$
declare
begin
for i in 1..1000000 loop
insert into tab1 values(i,i);
end loop;
end
$$
;

analyze tab1;


explain analyze
select count(col1) from tab1 where col2 = 0;

-- ヒント句動作確認

/*+ SeqScan(tab1) */
explain analyze
select count(col1) from tab1 where col2 = 0;


-- ヒント用のテーブルにヒントを登録

select * from hint_plan.hints;


INSERT INTO hint_plan.hints(norm_query_string, application_name, hints)
VALUES (
'explain analyze select count(col1) from tab1 where col2 = ?;',
'',
'SeqScan(tab1)'
);


-- テーブルで指定するヒント句の動作確認
show pg_hint_plan.enable_hint_table;
set pg_hint_plan.enable_hint_table = 'on';

explain analyze select count(col1) from tab1 where col2 = 0;

→実行計画がFULL SCANに変化

 

(2019)
https://docs.microsoft.com/ja-jp/sql/relational-databases/performance/plan-guides?view=sql-server-ver15
https://qiita.com/HirokiSakonju/items/010344f0b6d7f4560ce4

 

-- 検証方法
プランガイドでヒント句を適用し、ハッシュジョインを強制する

※マニュアルには下記のような記載があるが、試したかぎり指定できない
「INDEX、FORCESCAN、および FORCESEEK のテーブル ヒントをクエリ ヒントとして指定できます」

※スペースや改行も含めて完全一致しないとプランガイドは適用されない
(SSMSで実行する場合、プランガイドで指定したSQL文と同じ範囲を選択して実行する必要がある)

-- テストテーブル作成
drop table tab1;
create table tab1(col1 int not null, col2 int);
alter table tab1 add constraint tab1pk primary key(col1);
create index ind12 on tab1(col2);

drop table tab2;
create table tab2(col1 int not null, col2 int);
alter table tab2 add constraint tab2pk primary key(col1);


-- 検証データ作成
truncate table tab1;
truncate table tab2;

declare @i int;
set @i = 1;

while (@i <= 100)
begin
insert into tab1 values (@i,@i);
insert into tab2 values (@i,@i);
set @i = @i + 1;
end


update statistics tab1;
update statistics tab2;

 

SET STATISTICS PROFILE ON;
go

select count(*) from tab1 t1 inner join tab2 t2 on t1.col2 = t2.col2 where t2.col2 = 10

→結合方式はNestedLoop

SET STATISTICS PROFILE OFF;
go

-- プランガイド作成

EXEC sp_create_plan_guide
@name = N'plan01',
@stmt = N'select count(*) from tab1 t1 inner join tab2 t2 on t1.col2 = t2.col2 where t2.col2 = 10',
@type = N'SQL',
@module_or_batch = NULL,
@params = NULL,
@hints = N'OPTION (HASH JOIN)'
;

select * from sys.plan_guides;

-- 動作確認

SET STATISTICS PROFILE ON;
go

select count(*) from tab1 t1 inner join tab2 t2 on t1.col2 = t2.col2 where t2.col2 = 10

→結合方式はHash Joinに変化

SET STATISTICS PROFILE OFF;
go

 

複文

(8.0.21)

select 1;select 1;

→実行可能

(19c)

select 1 from dual;select 1 from dual;

→ORA-00933: SQLコマンドが正しく終了されていません。

(13)

select 1;select 1;

→実行可能

(2019)
select 1;select 1;

→実行可能

サスペンド

(18)
https://qiita.com/Hypnam/items/1c8fdf05f5478188d96f

①実機で確認

systemctl suspend

サスペンドWOL復帰どちらも可能


②ESXiで確認

systemctl suspend

サスペンドはできるがWOLで復帰しない、コンソールクリックでも復帰できない

 

(9)

①実機で確認
systemctl suspend

サスペンドWOL復帰どちらも可能


②ESXiで確認

systemctl suspend

サスペンドはできるがWOLで復帰しない、コンソールクリックで復帰は可能

 

(8)

①実機で確認

systemctl suspend

サスペンドWOL復帰どちらも可能

 

②ESXiで確認
systemctl suspend

サスペンドはできるがWOLで復帰しない、コンソールクリックでも復帰できない

 

(2016)
https://tipszone.jp/20110517_stop-pc/


①実機で確認

powercfg /a
powercfg /hibernate on
%windir%\System32\rundll32.exe powrprof.dll,SetSuspendState

レジストリやグループポリシーを変更したが、試した限りサスペンド不可

 


②ESXiで確認


powercfg /a
powercfg /hibernate on
%windir%\System32\rundll32.exe powrprof.dll,SetSuspendState

レジストリやグループポリシーを変更したが、試した限りサスペンド不可

 

ROWID

調べた限りなし

(19)

drop table tab1 purge;
create table tab1(col1 int);
insert into tab1 values(1);
insert into tab1 values(2);
commit;

select rowid,col1 from tab1;

select col1,rowid, DBMS_ROWID.ROWID_RELATIVE_FNO(rowid) from tab1;
select col1,rowid, DBMS_ROWID.ROWID_BLOCK_NUMBER(rowid) from tab1;
select col1,rowid, DBMS_ROWID.ROWID_ROW_NUMBER (rowid) from tab1;
select col1,rowid, DBMS_ROWID.ROWID_OBJECT(rowid) from tab1;

 

(13)

drop table tab1;
create table tab1(col1 int);
insert into tab1 values(1);
insert into tab1 values(2);

select ctid,col1 from tab1;

 

調べた限りなし

 

 

先行読み取り

実際の読み込みが発生する前にデータファイルからメモリにデータを読み込む機能

 

機能あり( InnoDB バッファープールのプリフェッチ (先読み) )

 

機能あり( Pre-Warming機能 )

調べた限り機能なし

 

機能あり( read-ahead reads )