This is a very common task for a DBA(Database Administrator) and it can be time consuming in some cases. So in this article we will see how we can build a User Defined Procedure in HP Vertica to clone a Database user. We have to user User Defined Procedure due to the lack of programmability features offered by Vertica(Vertica was build for super smooth Sql stuff). So first we will go over the scripts we will use and them see how we can call them from Database as UDP(User Defined Procedure).
#!/bin/bash
username=db_user_name
password=db_user_password
export username
export password
[dbadmin]$ ls -la /home/dbadmin/.profile
-rwx------ 1 dbadmin verticadba 179 Jul 6 12:14 /home/dbadmin/.profile
/opt/vertica/bin/vsql -U $username -w $password -t -o /tmp/create_user.sql -c"
SELECT
' CREATE USER $1 identified by ''$2'' RESOURCE POOL '||resource_pool ||
' search_path '|| search_path ||'; '
FROM
users
WHERE
user_name='$3'
UNION ALL
SELECT
' ALTER USER $1 DEFAULT ROLE all;'
FROM
users
WHERE
user_name='$3'
UNION ALL
SELECT
'GRANT ' || REPLACE(privileges_description, '*', '') || ' ON ' || COALESCE(object_schema, '')
|| '.' || object_name || ' TO ' || '$1' || ';' AS GRANTS
FROM
v_catalog.grants
WHERE
COALESCE(privileges_description, '') ''
AND grantee='$3'
AND object_TYPE NOT IN ('SCHEMA',
'RESOURCEPOOL')
UNION ALL
SELECT
'GRANT ' || REPLACE(privileges_description, '*', '') || ' ON schema ' || COALESCE(object_schema
, '') || object_name || ' TO ' || '$1' || ';' AS GRANTS
FROM
v_catalog.grants
WHERE
COALESCE(privileges_description, '') ''
AND grantee='$3'
AND object_TYPE IN ('SCHEMA');
"
/opt/vertica/bin/vsql -U $username -w $password -t -f /tmp/create_user.sql
#!/bin/bash
. /home/dbadmin/.profile
/opt/vertica/bin/vsql -U $username -w $password -t -o /tmp/create_user.sql -c"
SELECT
' CREATE USER $1 identified by ''$2'' RESOURCE POOL '||resource_pool ||
' search_path '|| search_path ||'; '
FROM
users
WHERE
user_name='$3'
UNION ALL
SELECT
' ALTER USER $1 DEFAULT ROLE all;'
FROM
users
WHERE
user_name='$3'
UNION ALL
SELECT
'GRANT ' || REPLACE(privileges_description, '*', '') || ' ON ' || COALESCE(object_schema, '')
|| '.' || object_name || ' TO ' || '$1' || ';' AS GRANTS
FROM
v_catalog.grants
WHERE
COALESCE(privileges_description, '') ''
AND grantee='$3'
AND object_TYPE NOT IN ('SCHEMA',
'RESOURCEPOOL')
UNION ALL
SELECT
'GRANT ' || REPLACE(privileges_description, '*', '') || ' ON schema ' || COALESCE(object_schema
, '') || object_name || ' TO ' || '$1' || ';' AS GRANTS
FROM
v_catalog.grants
WHERE
COALESCE(privileges_description, '') ''
AND grantee='$3'
AND object_TYPE IN ('SCHEMA');
"
/opt/vertica/bin/vsql -U $username -w $password -t -f /tmp/create_user.sql
chmod 4750 /vertica/catalog/database_name/procedures/clone_user.sh
. /home/dbadmin/.profile
admintools -t install_procedure -f /vertica/catalog/database/procedures/clone_user.sh -d Database_name -p $password
. /home/dbadmin/.profile
/opt/vertica/bin/vsql -U $username -w $password -c "CREATE PROCEDURE schema.clone_user(NewUser varchar,Password varchar,OldUser varchar)
AS 'clone_user.sh' LANGUAGE 'external' USER 'dbadmin';"
dbadmin= select object_name,object_type,grantee from grants where grantee='test_user';
object_name | object_type | grantee
--------------------------+--------------+-----------
general | RESOURCEPOOL | test_user
production_schemausage | ROLE | test_user
production_datareader | ROLE | test_user
dbadmin= select user_name,profile_name,resource_pool,search_path from users where user_name='test_user';
user_name | profile_name | resource_pool | search_path
-----------+--------------+---------------+------------------------------------------------------------
test_user | default | general | "$user", public, v_catalog, v_monitor, v_internal, production
dbadmin= select dba.clone_user('test_user_clone','secret_password','test_user');
INFO 4427: Procedure reported:
CREATE USER
ALTER USER
clone_user
------------
0
(1 row)
dbadmin= select user_name,profile_name,resource_pool,search_path from users where user_name='test_user_clone';
user_name | profile_name | resource_pool | search_path
-----------------+--------------+---------------+------------------------------------------------------------
test_user_clone | default | general | "$user", public, v_catalog, v_monitor, v_internal, production
(1 row)
dbadmin= select object_name,object_type,grantee from grants where grantee='test_user_clone';
object_name | object_type | grantee
--------------------------+--------------+-----------------
general | RESOURCEPOOL | test_user_clone
production_schemausage | ROLE | test_user_clone
production_datareader | ROLE | test_user_clone
(3 rows)