Author: Rithesh Makkena

  • How to write back data to Snowflake?

    How to write back data to Snowflake?

    Preface

    This document assumes you are already using or used or aware of the base set up from  Timo’s  Extension write back to MYSQL. You can use the same XAMPP or your web server and PHP (which is used to INSERT/Writeback to Snowflake DB). 

    Step 1: Create Role in Snowflake 

    Create a Role That would have access to INSERT Operation to the Database/Schema/Table Object. The same Role would be used in the PHP properties

    Step 2:  Assign the Role to Database Object

    As mentioned in MYSQL blog create a Table in Snowflake under a Database for example under Sales DataBase and name it Writeback and just as screenshot above you can give the option to give Writeback to any Table under Sales Database like did above or you could just select the Table “Tableauinsert” only and give the permission only on that Table (which is recommended). I have a created a new role called Writeback just for the purpose that users who belong to that this Role can do Insert/Select/Delete  operations and assigned this Role to Whole DB “Sales”.

    Step 3: Download and Install required Snowflake Drivers

    • PHP – I installed a separate PHP version 7.2.11. You can just use your existing PHP version as well which comes default with XAMPP, but make sure you have PHP version 7.1 or greater for Snowflake ODBC Drivers compatibility
    • Next, you do need Snowflake PDO drivers that need to be installed (download this from git https://github.com/snowflakedb/pdo_snowflake)
    • Next configure your PHP.INI file to add the extension=pdo_snowflake.so 
        • If you don’t have .ini file or having issues with adding the PDO extension you can still execute the .php file with below command . $PHP_HOME/bin/php -dextension=modules/pdo_snowflake.so INSERTDB.php
        • Note that INSERTDB is my PHP file and all the syntax are the same 
        • Now coming to the PHP file itself everything stays the same expect the Snowflake PDO connector needs to be called and few other syntaxes like a warehouse to use etc. Note only the blue highlighted code is modified for snowflake (PDO connection and specify the which warehouse to use to run the insert operation)
        • PHP File Content , You do need a Warehouse -Snowflake computing Node to run INSERT operations( I am including only the info that is needed for Snowflake change, everything else remains the same from MSQL blog) 

          $account = “demo130”;

          $user = “rmakkena”;

          $password = “xxxxxx”;

          $warehouse = “RITHESHDEMO”;

          $dbh = new PDO(“snowflake:account=$account;insecure_mode=true”, $user, $password);

          $sth = $dbh->query(“use warehouse RITHESHDEMO”);

     

    Same steps you might already followed for writing back data to Microsoft SQL Server or SAP HANA (“copying all the required files of the extensions”)

     

    • Step 5: Update your MarkSelection JS file to refer to this PHP file created above.

     

    • Step 6: Follow the same steps from Timo’s original blog to test the insert records update from Tableau Dashboard and you’re done with Tableau writeback to Snowflake

    Note: If you are aware of Snowflake concepts, you can use Transient Tables for these Insert Operations or even get creative and use Temporary Tables if the Tableau requirement is What-If analysis for Session only ( Users will do What if Analysis on Tableau by doing writeback-modify in WebEdit mode and once they close the report the loose the session –this is particularly good for added security& enabling all users to do to have access to Writeback and do instant What-if Analysis  ). 

  • How to write back data to SAP HANA?

    How to write back data to SAP HANA?

    Preface

    This document assumes you are already using or used Timo’s  Extension write back to MYSQL. You can use same XAMPP, however since I already have npm on my machine I was using that as a webserver to host the PHP file which finally writes back the data to SAP HANA.

    Extensions work for both HANA 1.0 and also 2.0(XSA-HDI)

    Step 1: Create a New User on HANA if you don’t already have one

    Make sure the user has a content admin role over the required schema (synonyms/CDS objects if using 2.0).

    Step 2:  As mentioned in MYSQL blog post create similar tables in HANA. You can create a columnar or a row table in HANA according to your needs. Both will work for this solution.

    Note :For autoincrement in HANA for any column you would need to define the column as primary key and make it as IDENTITY 

     

    Step 3: Download and Install required Drivers

    • The code used the 32 bit HDB HANA driver. Execute c:\Windows\SysWOW64\odbcad32.exe in run
    • Download the HDB 32 bit HANA driver from SAP market place(SAP made it far more easier now to download the drivers)
    •  install the drivers 

     

    Step 4: Follow the same instructions from Timo blog post over copying all the required files of the extensions.

    Before testing the HANA insert records PHP file, make sure to modify the ini file under location xampp\php in my case it is under npm. Modifaction requires you to just uncomment below two dll libraries which are already in the INI file.

    extension=php_pdo_odbc.dll
    extension=php_odbc.dll

     

    Step 5: Inserting records into HANA PHP file

    Below is the code : You can run this PHP from your browser to test if statements are working. Easiest way is use Select ‘A’ from dummy staement or even simple INSERT statment with dummy values into the table you created.

    <?php
    $customerName = $_POST['name'];
    $clusterName = $_POST['cluster'];
    $checkBox = $_POST['checkbox'];
    $userInput = $_POST['userinput'];
    $selectedMeasure = $_POST['measure'];
    
    if (! extension_loaded('odbc'))
    {
    die('ODBC extension not enabled / loaded');
    }
    
    
    $driver = 'HDBODBC32';
    
    $host = "HANA:30015";
    
    // Default name of your hana instance
    $db_name = "HDB";
    
    // Username
    $username = 'makkena';
    
    // Password
    $password = "HANA";
    
    // Try to connect
    $conn = odbc_connect("Driver=$driver;ServerNode=$host;Database=$db_name;", $username, $password, SQL_CUR_USE_ODBC);
    
    if (!$conn)
    {
    // Try to get a meaningful error if the connection fails
    echo "Connection failed.\n";
    echo "ODBC error code: " . odbc_error() . ". Message: " . odbc_errormsg();
    }
    else
    {
    // Do a basic select from DUMMY with is basically a synonym for SYS.DUMMY if you need to test in HANA
    $sql = "INSERT INTO CPG.getdataandwriteback (ClusterName,CustomerName,CheckBox,UserInput,SelectedMeasure) VALUES ('".$clusterName."','".$customerName."','".$checkBox."','".$userInput."','".$selectedMeasure."')";
    $result = odbc_exec($conn, $sql);
    if (!$result)
    {
    echo "Error while sending SQL statement to the database server.\n";
    echo "ODBC error code: " . odbc_error() . ". Message: " . odbc_errormsg();
    }
    else
    {
    while ($row = odbc_fetch_object($result))
    {
    var_dump($row);
    }
    }
    odbc_close($conn);
    }

     

     

    Step 6: Update your MarkSelection JS file to refer to this PHP file created above.

    • Assume you are using Timo JS code, just rename the reference of  Timo’s INSERT PHP file to HANA one that you created in Step 5.
    • Also since Timo’s dashboard is using the data source name as MYSQL you might have to change that in case you decide to change the data source name in your dashboard. For example, if I created the Data Source named HANA on these Tables create in the above steps I will have to change the JS script code referencing the data source name.

     

    Step 7: Follow the same steps from Timo’s original blog to test the insert records update from Tableau Dashboard and your done! 😉