Skip to content

Commit 9e435e8

Browse files
authored
Merge pull request #312 from janfh/feature/view_authorities
Right click option on SQL objects to view authorities
2 parents cc019bb + 1877ee3 commit 9e435e8

File tree

6 files changed

+81
-13
lines changed

6 files changed

+81
-13
lines changed

global.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ interface SQLParm {
3535

3636
interface BasicSQLObject {
3737
type: string;
38+
tableType: string;
3839
schema: string;
3940
name: string;
4041
specificName: string;

package.json

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -332,6 +332,11 @@
332332
"title": "Get Indexes",
333333
"category": "Db2 for i"
334334
},
335+
{
336+
"command": "vscode-db2i.getAuthorities",
337+
"title": "Get Authorities",
338+
"category": "Db2 for i"
339+
},
335340
{
336341
"command": "vscode-db2i.clearData",
337342
"title": "Clear...",
@@ -920,6 +925,11 @@
920925
"when": "viewItem == table || viewItem == schema",
921926
"group": "db2workWith@3"
922927
},
928+
{
929+
"command": "vscode-db2i.getAuthorities",
930+
"when": "viewItem == table || viewItem == view || viewItem == alias || viewItem == constraint || viewItem == function || viewItem == variable || viewItem == index || viewItem == procedure || viewItem == sequence || viewItem == package || viewItem == trigger || viewItem == type",
931+
"group": "db2workWith@4"
932+
},
923933
{
924934
"command": "vscode-db2i.clearData",
925935
"when": "viewItem == table",

src/database/schemas.ts

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -56,13 +56,13 @@ export default class Schemas {
5656
let filter: PartStatementInfo;
5757

5858
// If there are multiple types, we build a union. It's important that the ordering of the columns in the selects are consistant:
59-
// OBJ_TYPE, NAME, TEXT, SYS_NAME, SYS_SCHEMA, SPECNAME, BASE_SCHEMA, BASE_OBJ
59+
// OBJ_TYPE, TABLE_TYPE, NAME, TEXT, SYS_NAME, SYS_SCHEMA, SPECNAME, BASE_SCHEMA, BASE_OBJ
6060

6161
for (const type of types) {
6262
switch (type) {
6363
case `schemas`:
6464
selects.push([
65-
`select '${type}' as OBJ_TYPE, SCHEMA_NAME as NAME, SCHEMA_TEXT as TEXT, SYSTEM_SCHEMA_NAME as SYS_NAME, '' as SYS_SCHEMA, '' as SPECNAME, '' as BASE_SCHEMA, '' as BASE_OBJ`,
65+
`select '${type}' as OBJ_TYPE, '' as TABLE_TYPE, SCHEMA_NAME as NAME, SCHEMA_TEXT as TEXT, SYSTEM_SCHEMA_NAME as SYS_NAME, '' as SYS_SCHEMA, '' as SPECNAME, '' as BASE_SCHEMA, '' as BASE_OBJ`,
6666
`from QSYS2.SYSSCHEMAS`,
6767
details.filter ? `where UPPER(SCHEMA_NAME) = ? or UPPER(SYSTEM_SCHEMA_NAME) = ?` : ``,
6868
].join(` `));
@@ -78,7 +78,7 @@ export default class Schemas {
7878
case `logicals`:
7979
filter = getFilterClause(`TABLE_NAME`, details.filter);
8080
selects.push([
81-
`select '${type}' as OBJ_TYPE, TABLE_NAME as NAME, TABLE_TEXT as TEXT, SYSTEM_TABLE_NAME as SYS_NAME, SYSTEM_TABLE_SCHEMA as SYS_SCHEMA, '' as SPECNAME, BASE_TABLE_SCHEMA as BASE_SCHEMA, BASE_TABLE_NAME as BASE_OBJ`,
81+
`select '${type}' as OBJ_TYPE, TABLE_TYPE as TABLE_TYPE, TABLE_NAME as NAME, TABLE_TEXT as TEXT, SYSTEM_TABLE_NAME as SYS_NAME, SYSTEM_TABLE_SCHEMA as SYS_SCHEMA, '' as SPECNAME, BASE_TABLE_SCHEMA as BASE_SCHEMA, BASE_TABLE_NAME as BASE_OBJ`,
8282
`from QSYS2.SYSTABLES`,
8383
`where TABLE_SCHEMA = ? and TABLE_TYPE in (${typeMap[type].map(item => `'${item}'`).join(`, `)}) ${filter.clause}`,
8484
].join(` `));
@@ -89,7 +89,7 @@ export default class Schemas {
8989
case `constraints`:
9090
filter = getFilterClause(`CONSTRAINT_NAME`, details.filter);
9191
selects.push([
92-
`select '${type}' as OBJ_TYPE, CONSTRAINT_NAME as NAME, CONSTRAINT_TEXT as TEXT, SYSTEM_TABLE_NAME as SYS_NAME, SYSTEM_TABLE_SCHEMA as SYS_SCHEMA, '' as SPECNAME, TABLE_SCHEMA as BASE_SCHEMA, TABLE_NAME as BASE_OBJ`,
92+
`select '${type}' as OBJ_TYPE, '' as TABLE_TYPE, CONSTRAINT_NAME as NAME, CONSTRAINT_TEXT as TEXT, SYSTEM_TABLE_NAME as SYS_NAME, SYSTEM_TABLE_SCHEMA as SYS_SCHEMA, '' as SPECNAME, TABLE_SCHEMA as BASE_SCHEMA, TABLE_NAME as BASE_OBJ`,
9393
`from QSYS2.SYSCST`,
9494
`where CONSTRAINT_SCHEMA = ? ${filter.clause}`,
9595
].join(` `));
@@ -100,7 +100,7 @@ export default class Schemas {
100100
case `functions`:
101101
filter = getFilterClause(`ROUTINE_NAME`, details.filter);
102102
selects.push([
103-
`select '${type}' as OBJ_TYPE, ROUTINE_NAME as NAME, coalesce(ROUTINE_TEXT, LONG_COMMENT) as TEXT, '' as SYS_NAME, '' as SYS_SCHEMA, SPECIFIC_NAME as SPECNAME, '' as BASE_SCHEMA, '' as BASE_OBJ`,
103+
`select '${type}' as OBJ_TYPE, '' as TABLE_TYPE, ROUTINE_NAME as NAME, coalesce(ROUTINE_TEXT, LONG_COMMENT) as TEXT, '' as SYS_NAME, '' as SYS_SCHEMA, SPECIFIC_NAME as SPECNAME, '' as BASE_SCHEMA, '' as BASE_OBJ`,
104104
`from QSYS2.SYSFUNCS`,
105105
`where ROUTINE_SCHEMA = ? ${filter.clause} and FUNCTION_ORIGIN in ('E','U')`,
106106
].join(` `));
@@ -111,7 +111,7 @@ export default class Schemas {
111111
case `variables`:
112112
filter = getFilterClause(`VARIABLE_NAME`, details.filter);
113113
selects.push([
114-
`select '${type}' as OBJ_TYPE, VARIABLE_NAME as NAME, VARIABLE_TEXT as TEXT, SYSTEM_VAR_NAME as SYS_NAME, SYSTEM_VAR_SCHEMA as SYS_SCHEMA, '' as SPECNAME, '' as BASE_SCHEMA, '' as BASE_OBJ`,
114+
`select '${type}' as OBJ_TYPE, '' as TABLE_TYPE, VARIABLE_NAME as NAME, VARIABLE_TEXT as TEXT, SYSTEM_VAR_NAME as SYS_NAME, SYSTEM_VAR_SCHEMA as SYS_SCHEMA, '' as SPECNAME, '' as BASE_SCHEMA, '' as BASE_OBJ`,
115115
`from QSYS2.SYSVARIABLES`,
116116
`where VARIABLE_SCHEMA = ? ${filter.clause}`,
117117
].join(` `));
@@ -122,7 +122,7 @@ export default class Schemas {
122122
case `indexes`:
123123
filter = getFilterClause(`INDEX_NAME`, details.filter);
124124
selects.push([
125-
`select '${type}' as OBJ_TYPE, INDEX_NAME as NAME, INDEX_TEXT as TEXT, SYSTEM_INDEX_NAME as SYS_NAME, SYSTEM_INDEX_SCHEMA as SYS_SCHEMA, '' as SPECNAME, TABLE_SCHEMA as BASE_SCHEMA, TABLE_NAME as BASE_OBJ`,
125+
`select '${type}' as OBJ_TYPE, '' as TABLE_TYPE, INDEX_NAME as NAME, INDEX_TEXT as TEXT, SYSTEM_INDEX_NAME as SYS_NAME, SYSTEM_INDEX_SCHEMA as SYS_SCHEMA, '' as SPECNAME, TABLE_SCHEMA as BASE_SCHEMA, TABLE_NAME as BASE_OBJ`,
126126
`from QSYS2.SYSINDEXES`,
127127
`where INDEX_SCHEMA = ? ${filter.clause}`,
128128
].join(` `));
@@ -133,7 +133,7 @@ export default class Schemas {
133133
case `procedures`:
134134
filter = getFilterClause(`ROUTINE_NAME`, details.filter);
135135
selects.push([
136-
`select '${type}' as OBJ_TYPE, ROUTINE_NAME as NAME, ROUTINE_TEXT as TEXT, '' as SYS_NAME, '' as SYS_SCHEMA, SPECIFIC_NAME as SPECNAME, '' as BASE_SCHEMA, '' as BASE_OBJ`,
136+
`select '${type}' as OBJ_TYPE, '' as TABLE_TYPE, ROUTINE_NAME as NAME, ROUTINE_TEXT as TEXT, '' as SYS_NAME, '' as SYS_SCHEMA, SPECIFIC_NAME as SPECNAME, '' as BASE_SCHEMA, '' as BASE_OBJ`,
137137
`from QSYS2.SYSPROCS`,
138138
`where ROUTINE_SCHEMA = ? ${filter.clause}`,
139139
].join(` `));
@@ -144,7 +144,7 @@ export default class Schemas {
144144
case `sequences`:
145145
filter = getFilterClause(`SEQUENCE_NAME`, details.filter);
146146
selects.push([
147-
`select '${type}' as OBJ_TYPE, SEQUENCE_NAME as NAME, SEQUENCE_TEXT as TEXT, SYSTEM_SEQ_NAME as SYS_NAME, SYSTEM_SEQ_SCHEMA as SYS_SCHEMA, '' as SPECNAME, '' as BASE_SCHEMA, '' as BASE_OBJ`,
147+
`select '${type}' as OBJ_TYPE, '' as TABLE_TYPE, SEQUENCE_NAME as NAME, SEQUENCE_TEXT as TEXT, SYSTEM_SEQ_NAME as SYS_NAME, SYSTEM_SEQ_SCHEMA as SYS_SCHEMA, '' as SPECNAME, '' as BASE_SCHEMA, '' as BASE_OBJ`,
148148
`from QSYS2.SYSSEQUENCES`,
149149
`where SEQUENCE_SCHEMA = ? ${filter.clause}`,
150150
].join(` `));
@@ -154,7 +154,7 @@ export default class Schemas {
154154

155155
// case `packages`:
156156
// selects.push([
157-
// `select '${type}' as OBJ_TYPE, PACKAGE_NAME as NAME, PACKAGE_TEXT as TEXT, PROGRAM_SCHEMA as BASE_SCHEMA, PROGRAM_NAME as BASE_OBJ, `,
157+
// `select '${type}' as OBJ_TYPE, '' as TABLE_TYPE, PACKAGE_NAME as NAME, PACKAGE_TEXT as TEXT, PROGRAM_SCHEMA as BASE_SCHEMA, PROGRAM_NAME as BASE_OBJ, `,
158158
// ` '' as SYS_SCHEMA, '' as SYS_NAME, '' as SPECNAME`,
159159
// `from QSYS2.SQLPACKAGE`,
160160
// `where PACKAGE_SCHEMA = '${schema}' ${details.filter ? `and PACKAGE_NAME like '%${filter.clause}%'`: ``}`,
@@ -164,7 +164,7 @@ export default class Schemas {
164164
case `triggers`:
165165
filter = getFilterClause(`TRIGGER_NAME`, details.filter);
166166
selects.push([
167-
`select '${type}' as OBJ_TYPE, TRIGGER_NAME as NAME, TRIGGER_TEXT as TEXT, '' as SYS_NAME, '' as SYS_SCHEMA, '' as SPECNAME, EVENT_OBJECT_SCHEMA as BASE_SCHEMA, EVENT_OBJECT_TABLE as BASE_OBJ`,
167+
`select '${type}' as OBJ_TYPE, '' as TABLE_TYPE, TRIGGER_NAME as NAME, TRIGGER_TEXT as TEXT, '' as SYS_NAME, '' as SYS_SCHEMA, '' as SPECNAME, EVENT_OBJECT_SCHEMA as BASE_SCHEMA, EVENT_OBJECT_TABLE as BASE_OBJ`,
168168
`from QSYS2.SYSTRIGGERS`,
169169
`where TRIGGER_SCHEMA = ? ${filter.clause}`,
170170
].join(` `));
@@ -175,7 +175,7 @@ export default class Schemas {
175175
case `types`:
176176
filter = getFilterClause(`USER_DEFINED_TYPE_NAME`, details.filter);
177177
selects.push([
178-
`select '${type}' as OBJ_TYPE, USER_DEFINED_TYPE_NAME as NAME, TYPE_TEXT as TEXT, SYSTEM_TYPE_NAME as SYS_NAME, SYSTEM_TYPE_SCHEMA as SYS_SCHEMA, '' as SPECNAME, '' as BASE_SCHEMA, '' as BASE_OBJ`,
178+
`select '${type}' as OBJ_TYPE, '' as TABLE_TYPE, USER_DEFINED_TYPE_NAME as NAME, TYPE_TEXT as TEXT, SYSTEM_TYPE_NAME as SYS_NAME, SYSTEM_TYPE_SCHEMA as SYS_SCHEMA, '' as SPECNAME, '' as BASE_SCHEMA, '' as BASE_OBJ`,
179179
`from QSYS2.SYSTYPES`,
180180
`where USER_DEFINED_TYPE_SCHEMA = ? ${filter.clause}`,
181181
].join(` `));
@@ -199,6 +199,7 @@ export default class Schemas {
199199

200200
return objects.map(object => ({
201201
type: object.OBJ_TYPE,
202+
tableType: object.TABLE_TYPE,
202203
schema,
203204
name: object.NAME || undefined,
204205
specificName: object.SPECNAME || undefined,

src/views/schemaBrowser/contributes.json

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,11 @@
4949
"title": "Get Indexes",
5050
"category": "Db2 for i"
5151
},
52+
{
53+
"command": "vscode-db2i.getAuthorities",
54+
"title": "Get Authorities",
55+
"category": "Db2 for i"
56+
},
5257
{
5358
"command": "vscode-db2i.clearData",
5459
"title": "Clear...",
@@ -157,6 +162,11 @@
157162
"when": "viewItem == table || viewItem == schema",
158163
"group": "db2workWith@3"
159164
},
165+
{
166+
"command": "vscode-db2i.getAuthorities",
167+
"when": "viewItem == table || viewItem == view || viewItem == alias || viewItem == constraint || viewItem == function || viewItem == variable || viewItem == index || viewItem == procedure || viewItem == sequence || viewItem == package || viewItem == trigger || viewItem == type",
168+
"group": "db2workWith@4"
169+
},
160170
{
161171
"command": "vscode-db2i.clearData",
162172
"when": "viewItem == table",

src/views/schemaBrowser/index.ts

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import Configuration from "../../configuration";
1010
import Types from "../types";
1111
import Statement from "../../database/statement";
1212
import { copyUI } from "./copyUI";
13-
import { getAdvisedIndexesStatement, getIndexesStatement, getMTIStatement } from "./statements";
13+
import { getAdvisedIndexesStatement, getIndexesStatement, getMTIStatement, getAuthoritiesStatement } from "./statements";
1414

1515
const viewItem = {
1616
"tables": `table`,
@@ -187,6 +187,17 @@ export default class schemaBrowser {
187187
}
188188
}),
189189

190+
vscode.commands.registerCommand(`vscode-db2i.getAuthorities`, async (object: SQLObject) => {
191+
if (object) {
192+
const content = getAuthoritiesStatement(object.schema, object.name, object.type.toUpperCase(), object.tableType);
193+
vscode.commands.executeCommand(`vscode-db2i.runEditorStatement`, {
194+
content,
195+
qualifier: `statement`,
196+
open: false,
197+
});
198+
}
199+
}),
200+
190201
vscode.commands.registerCommand(`vscode-db2i.advisedIndexes`, async (object: SQLObject|SchemaItem) => { //table
191202
if (object) {
192203
let content: string|undefined;
@@ -546,6 +557,7 @@ class SQLObject extends vscode.TreeItem {
546557
name: string;
547558
specificName: string;
548559
type: string;
560+
tableType: string;
549561
system: {
550562
schema: string;
551563
name: string;
@@ -562,6 +574,7 @@ class SQLObject extends vscode.TreeItem {
562574
this.specificName = item.specificName; // Only applies to routines
563575
this.system = item.system;
564576
this.type = type;
577+
this.tableType = item.tableType;
565578
this.description = item.text;
566579
// For functions and procedures, set a tooltip that includes the specific name
567580
if (Schemas.isRoutineType(this.type)) {

src/views/schemaBrowser/statements.ts

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -234,4 +234,37 @@ export function getMTIStatement(schema: string, table: string = `*ALL`) {
234234
`)`,
235235
`order by key_definition`,
236236
].join(` `);
237+
}
238+
239+
export function getAuthoritiesStatement(schema: string, table: string, objectType: string, tableType: string): string {
240+
let sql: string = `
241+
select
242+
authorization_name "User profile name",
243+
object_authority "Object authority",
244+
owner "Object owner",
245+
authorization_list "Authorization list",
246+
primary_group "Primary group",
247+
authorization_list_management "Authorization list management",
248+
object_owner "User is object owner",
249+
object_operational "Object operational authority",
250+
object_management "Object management authority",
251+
object_existence "Object existence authority",
252+
object_alter "Object alter authority",
253+
object_reference "Object reference authority",
254+
data_read "Data read authority",
255+
data_add "Data add authority",
256+
data_update "Data update authority",
257+
data_delete "Data delete authority",
258+
data_execute "Data execute authority",
259+
text_description "Description"
260+
from qsys2.object_privileges
261+
where object_schema = '${schema}'
262+
and object_name = '${table}'
263+
`;
264+
if (objectType === 'TABLE' && tableType != 'T') {
265+
sql += ` and object_type = '*FILE'`;
266+
} else {
267+
sql += ` and sql_object_type = '${objectType}'`;
268+
}
269+
return sql;
237270
}

0 commit comments

Comments
 (0)