From 5c5dfae1415d6e10fe6389cb2e9ad728c655b120 Mon Sep 17 00:00:00 2001 From: Vasiya Krishnan <43657071+VasiyaKrishnan@users.noreply.github.com> Date: Tue, 19 Jan 2021 11:30:10 -0800 Subject: [PATCH] Add files via upload --- .../Wind Turbine Demo/script.sql | 77 +++++++++++++++++ .../Wind Turbine Demo/security.sql | 78 ++++++++++++++++++ .../turbine-sensor-db-dacpac.zip | Bin 0 -> 4534 bytes 3 files changed, 155 insertions(+) create mode 100644 samples/demos/azure-sql-edge-demos/Wind Turbine Demo/script.sql create mode 100644 samples/demos/azure-sql-edge-demos/Wind Turbine Demo/security.sql create mode 100644 samples/demos/azure-sql-edge-demos/Wind Turbine Demo/turbine-sensor-db-dacpac.zip diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/script.sql b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/script.sql new file mode 100644 index 00000000..4c0f23e2 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/script.sql @@ -0,0 +1,77 @@ +-- TABLES -- +/****** Object: Table [dbo].[RealtimeSensorRecord] ******/ +SET ANSI_NULLS ON +GO +SET QUOTED_IDENTIFIER ON +GO +CREATE TABLE [dbo].RealtimeSensorRecord( + [RecordId] [uniqueidentifier] NOT NULL, + [TurbineId] [varchar](50) NULL, + [SensorType] [varchar](50) NULL, -- + [SensorId] [varchar](50) NULL, + [SensorValue] [real] NULL, + [Timestamp] [datetime] NULL + +PRIMARY KEY CLUSTERED +( + [RecordId] ASC +)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] +) ON [PRIMARY] +GO + +-- STORE PROCEDURES -- +/* Store procedure that clean up the sensor records table */ +CREATE PROCEDURE [dbo].[TruncateRealtimeSensorRecords] +AS +DECLARE @SQL VARCHAR(2000) +SET @SQL='TRUNCATE TABLE dbo.RealtimeSensorRecord' +EXEC (@SQL); + + +-- Run Model Store Procedure +SET ANSI_NULLS ON +GO +SET QUOTED_IDENTIFIER ON +GO + +IF OBJECT_ID ( 'RunModel', 'P' ) IS NOT NULL + DROP PROCEDURE RunModel; +GO + +CREATE PROCEDURE [dbo].RunModel + @Result INT = 0 OUTPUT +AS +BEGIN + SET NOCOUNT ON; + + DECLARE @model VARBINARY(max) = ( + SELECT DATA + FROM dbo.models + WHERE id = 1 + ) + + ;WITH predict_input AS ( + SELECT WindSpeedStdDev, TurbineSpeedStdDev, OverallWindDirection, TurbineWindDirection, + WindSpeedAverage, WindTempAverage, GearboxOilLevel, GearboxOilTemp, GeneratorActivePower, + GeneratorSpeed, GeneratorTemp, GeneratorTorque, GridFrequency, GridVoltage, + HydraulicOilPressure, NacelleAngle, PitchAngle, Vibration, TurbineSpeedAverage + FROM + ( + SELECT SensorValue, SensorType, timestamp + FROM RealtimeSensorRecord + GROUP BY SensorValue, SensorType, timestamp + ) d + PIVOT + ( + MAX(SensorValue) + FOR SensorType IN (WindSpeedStdDev, TurbineSpeedStdDev, OverallWindDirection, TurbineWindDirection, + WindSpeedAverage, WindTempAverage, GearboxOilLevel, GearboxOilTemp, GeneratorActivePower, + GeneratorSpeed, GeneratorTemp, GeneratorTorque, GridFrequency, GridVoltage, + HydraulicOilPressure, NacelleAngle, PitchAngle, Vibration, TurbineSpeedAverage) + ) piv + ) + + SELECT @Result = p.output_label + FROM PREDICT(MODEL = @model, DATA = predict_input) WITH (output_label bigint) AS p +END +GO diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/security.sql b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/security.sql new file mode 100644 index 00000000..1370d9b7 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/security.sql @@ -0,0 +1,78 @@ +/* Create users using the logins created */ +CREATE USER OperatorUser WITHOUT LOGIN; +CREATE USER DataScientistUser WITHOUT LOGIN; +CREATE USER SecurityUser WITHOUT LOGIN; +CREATE USER TurbineUser WITHOUT LOGIN; + +/* Grand permissions to users */ +GRANT SELECT ON RealtimeSensorRecord TO OperatorUser; +GRANT SELECT ON RealtimeSensorRecord TO DataScientistUser; +GRANT SELECT ON RealtimeSensorRecord TO SecurityUser; +GRANT SELECT, INSERT ON RealtimeSensorRecord TO TurbineUser; + + +-- Mask the last four digits of the serial number (Sensor ID) of the sensor for the Data Scientist +ALTER TABLE RealtimeSensorRecord +ALTER COLUMN SensorId varchar(50) MASKED WITH (FUNCTION = 'partial(34,"XXXX",0)'); +DENY UNMASK TO DataScientistUser; +GO + +/** +* Operator: Can see all events +* Data Scientist: Can see everything BUT Hatch Sensor events +* Security: Can ONLY see HatchSensor events +*/ +ALTER TABLE RealtimeSensorRecord +ALTER COLUMN SensorType sysname +GO + +CREATE SCHEMA Security; +GO + +/** +* Operator: Can see all events +* Data Scientist: Can see everything BUT Hatch Sensor events +* Security: Can ONLY see HatchSensor events +*/ +CREATE FUNCTION Security.fn_securitypredicate(@SensorType AS sysname) +RETURNS TABLE +WITH SCHEMABINDING +AS +RETURN SELECT 1 AS fn_securitypredicate_result + WHERE + USER_NAME() = 'OperatorUser' OR USER_NAME() = 'dbo' OR + (USER_NAME() = 'DataScientistUser' AND @SensorType <> 'HatchSensor') OR + (USER_NAME() = 'SecurityUser' AND @SensorType = 'HatchSensor'); + +CREATE SECURITY POLICY SensorsDataFilter +ADD FILTER PREDICATE Security.fn_securitypredicate(SensorType) +ON dbo.RealtimeSensorRecord +WITH (STATE = ON); + +/* QUERIES FOR TESTING POLICIES */ + +-- Testing basic policy to deny delete +EXECUTE AS USER = 'OperatorUser'; +SELECT * FROM RealtimeSensorRecord; +DELETE FROM RealtimeSensorRecord WHERE SensorType = 'GeneratorTorque'; +REVERT; + +-- Testing the masking for data Data Scientist +EXECUTE AS USER = 'DataScientistUser'; +SELECT TOP 10 * FROM RealtimeSensorRecord; +REVERT; + +-- Testing Row-Level Security policy with Operator that can see all the events +EXECUTE AS USER = 'OperatorUser'; +SELECT * FROM RealtimeSensorRecord; +REVERT; + +-- Testing Row-Level Security policy with DataScientist that can see all the events but HatchSensor +EXECUTE AS USER = 'DataScientistUser'; +SELECT * FROM RealtimeSensorRecord; +REVERT; + +-- Testing Row-Level Security policy with Security that can see only the HatchSensor events +EXECUTE AS USER = 'SecurityUser'; +SELECT * FROM RealtimeSensorRecord; +REVERT; diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/turbine-sensor-db-dacpac.zip b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/turbine-sensor-db-dacpac.zip new file mode 100644 index 0000000000000000000000000000000000000000..eb2266ba9276bc1abf07d4bb3e2ea2c222c208d2 GIT binary patch literal 4534 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 literal 0 HcmV?d00001