コード例 #1
0
ファイル: Grants.cs プロジェクト: chadclan/sqlmake
        public static ArrayList parseGrantSql(string p_sql, string p_filename)
        {
            SQLPlusScanner scanner = new SQLPlusScanner(new StringReader(p_sql), "parseGrantSql");
            string currGrantType = "";
            string currObjectClause = "";
            string currGrantor = "";
            string currTableName = "";
            string currAdminOption = "NO";
            string currGrantable = "NO";
            string currHierarchy = "NO";
            bool complete = false;
            StringBuilder grantPrivileges = new StringBuilder();
            StringBuilder grantees = new StringBuilder();

            try
            {
                string currentToken = scanner.getSkipComments();
                if (currentToken != "GRANT") throw new ArgumentException("Sql does not contain grant statement");

                while (true)
                {
                    currentToken = scanner.getSkipComments();
                    if (currentToken == "ON" || currentToken == "TO") break;
                    if (currentToken != "," && grantPrivileges.Length > 0) grantPrivileges.Append(" ");
                    grantPrivileges.Append(currentToken);
                }

                if (grantPrivileges.ToString().Trim() == "")
                    Log.Warning("GrantObject", "Incorrect grant, was expecting grant privileges: {0}", p_sql);

                if (currentToken == "ON") currGrantType = "OBJECT";
                else currGrantType = "SYSTEM";

                // read objectName
                if (currGrantType == "OBJECT")
                {
                    currentToken = scanner.getSkipComments();
                    if (currentToken == "DIRECTORY")
                    {
                        currObjectClause = currentToken;
                        currentToken = scanner.getSkipComments();
                    }
                    else if (currentToken == "JAVA")
                    {
                        currObjectClause = currentToken;
                        currentToken = scanner.getSkipComments();
                        if (currentToken != "SOURCE" || currentToken != "RESOURCE")
                            SQLMake.Util.Log.Warning("GrantObject", "Incorrect grant, was expecting keyword SOURCE|RESOURCE: {0}", p_sql);
                        currObjectClause += " " + currentToken;
                        currentToken = scanner.getSkipComments();
                    }

                    if (currentToken.IndexOf('.') > -1)
                    {
                        currGrantor = currentToken.Split('.')[0];
                        currTableName = currentToken.Split('.')[1];
                    }
                    else
                    {
                        currTableName = currentToken;
                    }
                    currentToken = scanner.getSkipComments();
                }

                if (currentToken != "TO")
                    Log.Warning("GrantObject", "Incorrect grant, was expecting keyword TO: {0}", p_sql);

                // read grantees part
                while (true)
                {
                    currentToken = scanner.getSkipComments();
                    grantees.Append(currentToken);
                    complete = true;
                    currentToken = scanner.getSkipComments();
                    if (currentToken != ",") break;
                    else grantees.Append(currentToken);
                }

                // read with admin clause
                if (currGrantType == "SYSTEM")
                {
                    currentToken += " " + scanner.getSkipComments() + " " + scanner.getSkipComments();
                    if (currentToken == "WITH ADMIN OPTION") currAdminOption = "YES";
                    else Log.Warning("GrantObject", "Incorrect grant, was expecting keyword WITH ADMIN OPTION: {0}", p_sql);
                }
                else
                {
                    currentToken += " " + scanner.getSkipComments() + " " + scanner.getSkipComments();
                    if (currentToken == "WITH GRANT OPTION") currGrantable = "YES";
                    else if (currentToken == "WITH HIERARCHY OPTION") currHierarchy = "YES";
                    else Log.Warning("GrantObject", "Incorrect grant, was expecting keyword WITH GRANT OPTION|WITH HIERARCHY OPTION: {0}", p_sql);

                    currentToken = scanner.getSkipComments();
                    currentToken += " " + scanner.getSkipComments() + " " + scanner.getSkipComments();
                    if (currentToken == "WITH GRANT OPTION") currGrantable = "YES";
                    else if (currentToken == "WITH HIERARCHY OPTION") currHierarchy = "YES";
                    else Log.Warning("GrantObject", "Incorrect grant, was expecting keyword WITH GRANT OPTION|WITH HIERARCHY OPTION: {0}", p_sql);
                }

                currentToken = scanner.getSkipComments();
                Log.Warning("GrantObject", "Incorrect grant, keywords found after expected end of grant clause: {0}", p_sql);
            }
            catch (EOFException)
            {
                if (!complete) Log.Warning("GrantObject", "Incorrect grant, premature termination of sql statement: {0}", p_sql);
            }
            catch (EOBException)
            {
                if (!complete) Log.Warning("GrantObject", "Incorrect grant, premature termination of sql statement: {0}", p_sql);
            }

            ArrayList resultSet = new ArrayList();
            if (complete)
            {
                foreach (string grantPrivilege in grantPrivileges.ToString().Split(','))
                {
                    foreach (string grantee in grantees.ToString().Split(','))
                    {
                        GrantObject grantObject = new GrantObject(p_filename, currGrantType, currObjectClause, replaceWithSandbox(grantee.Trim()), currTableName, replaceWithSandbox(currGrantor.Trim()), grantPrivilege, currAdminOption, currGrantable, currHierarchy);
                        // Console.WriteLine(grantObject.ToString());
                        resultSet.Add(grantObject);
                    }
                }
            }
            return resultSet;
        }
コード例 #2
0
ファイル: Grants.cs プロジェクト: chadclan/sqlmake
        public static ArrayList buildGrantsList(string p_dir, OracleConnection conn)
        {
            Log.Info("grants", "Processing scripts ... {0}", p_dir);
            // First read all files from the file system
            string configSqlFileList = Settings.getSqlFileList(true);
            string configIgnoreDirList = Settings.getIgnoreDirList(true);
            string configIgnoreFileList = Settings.getIgnoreFileList(true);

            Log.Verbose("grants", "Searching for sql scripts");
            string[] files = FolderSearch.Search(p_dir, true, configSqlFileList, configIgnoreDirList, configIgnoreFileList);

            ArrayList fileList = new ArrayList();
            // each file can contain 0 or more blocks
            foreach (string filename in files)
            {
                ArrayList sqlCommandList = new ArrayList(SqlScript.Load(filename));
                foreach (SqlObject sqlCommand in sqlCommandList)
                {
                    if (sqlCommand.commandType == "SQL" && sqlCommand.action == "GRANT")
                        fileList.AddRange(parseGrantSql(sqlCommand.sqlText, filename));
                }
            }

            // TODO: Check for duplicate grants

            Console.WriteLine("Processing database catalog ...");
            // Read all entries from user_tab_privs_made
            // Carefull about recycle bin objects (filter using cross check on user objects view)
            string cmdQuery = "select grantee, table_name, grantor, privilege, grantable, hierarchy from user_tab_privs_made where exists (select 1 from user_objects where table_name = object_name)";
            OracleCommand cmd = new OracleCommand(cmdQuery, conn);
            OracleDataReader reader = cmd.ExecuteReader();
            while (reader.Read())
            {
                GrantObject currObject = new GrantObject("OBJECT", "", reader.GetString(0), reader.GetString(1), reader.GetString(2), reader.GetString(3), "NO", reader.GetString(4), reader.GetString(5));
                int existingObjectIndex = fileList.IndexOf(currObject);

                // This object does not exist in arrayList
                if (existingObjectIndex == -1) fileList.Add(currObject);

                // because of duplicates loop through all occurences
                while (existingObjectIndex >= 0)
                {
                    GrantObject existingFileItem = (GrantObject)fileList[existingObjectIndex];
                    existingFileItem.existsInSchema = true;
                    existingObjectIndex = fileList.IndexOf(currObject, existingObjectIndex + 1);
                }
            }

            // Read all entries from user_sys_privs
            cmdQuery = "select username, privilege, admin_option from user_sys_privs";
            bool objectFound;
            cmd = new OracleCommand(cmdQuery, conn);
            reader = cmd.ExecuteReader();
            while (reader.Read())
            {
                GrantObject currObject = new GrantObject("SYSTEM", "", reader.GetString(0), "", "", reader.GetString(1), reader.GetString(2), "NO", "NO");
                int existingObjectIndex = fileList.IndexOf(currObject);
                objectFound = false;

                // This object does not exist in arrayList
                if (existingObjectIndex == -1 && !objectFound) fileList.Add(currObject);

                while (existingObjectIndex >= 0)
                {
                    objectFound = true;
                    ((GrantObject)fileList[existingObjectIndex]).existsInSchema = true;
                    ((GrantObject)fileList[existingObjectIndex]).different = !((GrantObject)fileList[existingObjectIndex]).Equals(currObject);
                    existingObjectIndex = fileList.IndexOf(currObject, existingObjectIndex + 1);
                }
            }

            return fileList;
        }
コード例 #3
0
ファイル: Grants.cs プロジェクト: chadclan/sqlmake
        public static ArrayList buildObjectGrantsList(OracleConnection conn, string p_object)
        {
            ArrayList grantsList = new ArrayList();
            // Read all entries from user_tab_privs_made
            string cmdQuery = "select grantee, table_name, grantor, privilege, grantable, hierarchy from user_tab_privs_made where table_name = :p_object";
            OracleCommand cmd = new OracleCommand(cmdQuery, conn);
            OracleParameter Param2 = cmd.Parameters.Add("p_object", OracleType.VarChar);
            Param2.Direction = System.Data.ParameterDirection.Input;
            Param2.Value = p_object;

            OracleDataReader reader = cmd.ExecuteReader();
            while (reader.Read())
            {
                GrantObject currObject = new GrantObject("OBJECT", "", reader.GetString(0), reader.GetString(1), reader.GetString(2), reader.GetString(3), "NO", reader.GetString(4), reader.GetString(5));
                grantsList.Add(currObject);
            }
            return grantsList;
        }