提交 554281ac 编写于 作者: S serge-rider

PG permission DDL refactoring


Former-commit-id: 59d8e169
上级 2328953a
......@@ -36,6 +36,7 @@ import org.jkiss.dbeaver.model.exec.jdbc.JDBCPreparedStatement;
import org.jkiss.dbeaver.model.exec.jdbc.JDBCResultSet;
import org.jkiss.dbeaver.model.exec.jdbc.JDBCSession;
import org.jkiss.dbeaver.model.impl.AbstractObjectCache;
import org.jkiss.dbeaver.model.impl.edit.SQLDatabasePersistAction;
import org.jkiss.dbeaver.model.impl.edit.SQLDatabasePersistActionComment;
import org.jkiss.dbeaver.model.impl.jdbc.JDBCUtils;
import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor;
......@@ -491,14 +492,42 @@ public class PostgreUtils {
return opt.toString();
}
public static void getObjectGrantPermissionActions(DBRProgressMonitor monitor, PostgrePermissionsOwner table, List<DBEPersistAction> actions, Map<String, Object> options) throws DBException {
public static String getObjectTypeName(PostgrePermissionsOwner object) {
if (object instanceof PostgreSequence) {
return "SEQUENCE";
} else if (object instanceof PostgreProcedure) {
return ((PostgreProcedure) object).getProcedureTypeName();
} else {
return "TABLE";
}
}
public static String getObjectUniqueName(PostgrePermissionsOwner object) {
if (object instanceof PostgreProcedure) {
return ((PostgreProcedure) object).getFullQualifiedSignature();
} else {
return DBUtils.getObjectFullName(object, DBPEvaluationContext.DDL);
}
}
public static void getObjectGrantPermissionActions(DBRProgressMonitor monitor, PostgrePermissionsOwner object, List<DBEPersistAction> actions, Map<String, Object> options) throws DBException {
if (CommonUtils.getOption(options, PostgreConstants.OPTION_DDL_SHOW_PERMISSIONS)) {
// Permissions
Collection<PostgrePermission> permissions = table.getPermissions(monitor);
Collection<PostgrePermission> permissions = object.getPermissions(monitor);
if (!CommonUtils.isEmpty(permissions)) {
actions.add(new SQLDatabasePersistActionComment(table.getDataSource(), "Permissions"));
actions.add(new SQLDatabasePersistActionComment(object.getDataSource(), "Permissions"));
// Owner
PostgreRole owner = object.getOwner(monitor);
if (owner != null) {
actions.add(new SQLDatabasePersistAction(
"Owner change",
"ALTER " + getObjectTypeName(object) + " " + getObjectUniqueName(object) + " OWNER TO " + DBUtils.getQuotedIdentifier(owner)
));
}
for (PostgrePermission permission : permissions) {
if (permission.hasAllPrivileges(table)) {
if (permission.hasAllPrivileges(object)) {
Collections.addAll(actions,
new PostgreCommandGrantPrivilege(permission.getOwner(), true, permission, new PostgrePrivilegeType[] { PostgrePrivilegeType.ALL })
.getPersistActions(options));
......
......@@ -17,13 +17,13 @@
package org.jkiss.dbeaver.ext.postgresql.edit;
import org.jkiss.dbeaver.ext.postgresql.PostgreMessages;
import org.jkiss.dbeaver.ext.postgresql.PostgreUtils;
import org.jkiss.dbeaver.ext.postgresql.model.*;
import org.jkiss.dbeaver.model.DBPEvaluationContext;
import org.jkiss.dbeaver.model.DBUtils;
import org.jkiss.dbeaver.model.edit.DBEPersistAction;
import org.jkiss.dbeaver.model.edit.DBECommand;
import org.jkiss.dbeaver.model.impl.edit.SQLDatabasePersistAction;
import org.jkiss.dbeaver.model.edit.DBEPersistAction;
import org.jkiss.dbeaver.model.impl.edit.DBECommandAbstract;
import org.jkiss.dbeaver.model.impl.edit.SQLDatabasePersistAction;
import java.util.Map;
......@@ -70,22 +70,14 @@ public class PostgreCommandGrantPrivilege extends DBECommandAbstract<PostgrePerm
objectName = ((PostgreRolePermission)permission).getFullObjectName();
} else {
roleName = DBUtils.getQuotedIdentifier(object.getDataSource(), ((PostgreObjectPermission) permission).getGrantee());
if (object instanceof PostgreProcedure) {
objectName = ((PostgreProcedure) object).getFullQualifiedSignature();
} else {
objectName = DBUtils.getObjectFullName(object, DBPEvaluationContext.DDL);
}
objectName = PostgreUtils.getObjectUniqueName(object);
}
String objectType;
if (permission instanceof PostgreRolePermission) {
objectType = ((PostgreRolePermission) permission).getKind().name();
} else if (object instanceof PostgreSequence) {
objectType = "SEQUENCE";
} else if (object instanceof PostgreProcedure) {
objectType = "FUNCTION";
} else {
objectType = "TABLE";
objectType = PostgreUtils.getObjectTypeName(object);
}
String grantScript = "GRANT " + privName + //$NON-NLS-1$
" ON " + objectType + " " + objectName + //$NON-NLS-1$
......
......@@ -30,6 +30,8 @@ public interface PostgrePermissionsOwner extends PostgreObject {
PostgreSchema getSchema();
PostgreRole getOwner(DBRProgressMonitor monitor) throws DBException;
Collection<PostgrePermission> getPermissions(DBRProgressMonitor monitor) throws DBException;
}
......@@ -300,15 +300,6 @@ public class PostgreProcedure extends AbstractProcedure<PostgreDataSource, Postg
procDDL = body;
}
if (CommonUtils.getOption(options, PostgreConstants.OPTION_DDL_SHOW_PERMISSIONS)) {
//
// ALTER FUNCTION public.__st_countagg_transfn(agg_count, raster, integer, boolean, double precision) OWNER TO postgres;
PostgreRole owner = getOwner(monitor);
if (owner != null) {
procDDL += "\n" +
"ALTER FUNCTION " + getFullQualifiedSignature() + " OWNER TO " + DBUtils.getQuotedIdentifier(owner) + "\n";
}
List<DBEPersistAction> actions = new ArrayList<>();
PostgreUtils.getObjectGrantPermissionActions(monitor, this, actions, options);
procDDL += "\n" + SQLUtils.generateScript(getDataSource(), actions.toArray(new DBEPersistAction[actions.size()]), false);
......
......@@ -281,6 +281,12 @@ public class PostgreRole implements PostgreObject, PostgrePermissionsOwner, DBPP
return null;
}
@Override
public PostgreRole getOwner(DBRProgressMonitor monitor) throws DBException {
// Dummy implementation
return this;
}
@Override
public Collection<PostgrePermission> getPermissions(DBRProgressMonitor monitor) throws DBException {
try (JDBCSession session = DBUtils.openMetaSession(monitor, getDataSource(), "Read role privileges")) {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册