Skip to content

Commit 5c5dfae

Browse files
Add files via upload
1 parent d69b15a commit 5c5dfae

3 files changed

Lines changed: 155 additions & 0 deletions

File tree

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
-- TABLES --
2+
/****** Object: Table [dbo].[RealtimeSensorRecord] ******/
3+
SET ANSI_NULLS ON
4+
GO
5+
SET QUOTED_IDENTIFIER ON
6+
GO
7+
CREATE TABLE [dbo].RealtimeSensorRecord(
8+
[RecordId] [uniqueidentifier] NOT NULL,
9+
[TurbineId] [varchar](50) NULL,
10+
[SensorType] [varchar](50) NULL, --
11+
[SensorId] [varchar](50) NULL,
12+
[SensorValue] [real] NULL,
13+
[Timestamp] [datetime] NULL
14+
15+
PRIMARY KEY CLUSTERED
16+
(
17+
[RecordId] ASC
18+
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
19+
) ON [PRIMARY]
20+
GO
21+
22+
-- STORE PROCEDURES --
23+
/* Store procedure that clean up the sensor records table */
24+
CREATE PROCEDURE [dbo].[TruncateRealtimeSensorRecords]
25+
AS
26+
DECLARE @SQL VARCHAR(2000)
27+
SET @SQL='TRUNCATE TABLE dbo.RealtimeSensorRecord'
28+
EXEC (@SQL);
29+
30+
31+
-- Run Model Store Procedure
32+
SET ANSI_NULLS ON
33+
GO
34+
SET QUOTED_IDENTIFIER ON
35+
GO
36+
37+
IF OBJECT_ID ( 'RunModel', 'P' ) IS NOT NULL
38+
DROP PROCEDURE RunModel;
39+
GO
40+
41+
CREATE PROCEDURE [dbo].RunModel
42+
@Result INT = 0 OUTPUT
43+
AS
44+
BEGIN
45+
SET NOCOUNT ON;
46+
47+
DECLARE @model VARBINARY(max) = (
48+
SELECT DATA
49+
FROM dbo.models
50+
WHERE id = 1
51+
)
52+
53+
;WITH predict_input AS (
54+
SELECT WindSpeedStdDev, TurbineSpeedStdDev, OverallWindDirection, TurbineWindDirection,
55+
WindSpeedAverage, WindTempAverage, GearboxOilLevel, GearboxOilTemp, GeneratorActivePower,
56+
GeneratorSpeed, GeneratorTemp, GeneratorTorque, GridFrequency, GridVoltage,
57+
HydraulicOilPressure, NacelleAngle, PitchAngle, Vibration, TurbineSpeedAverage
58+
FROM
59+
(
60+
SELECT SensorValue, SensorType, timestamp
61+
FROM RealtimeSensorRecord
62+
GROUP BY SensorValue, SensorType, timestamp
63+
) d
64+
PIVOT
65+
(
66+
MAX(SensorValue)
67+
FOR SensorType IN (WindSpeedStdDev, TurbineSpeedStdDev, OverallWindDirection, TurbineWindDirection,
68+
WindSpeedAverage, WindTempAverage, GearboxOilLevel, GearboxOilTemp, GeneratorActivePower,
69+
GeneratorSpeed, GeneratorTemp, GeneratorTorque, GridFrequency, GridVoltage,
70+
HydraulicOilPressure, NacelleAngle, PitchAngle, Vibration, TurbineSpeedAverage)
71+
) piv
72+
)
73+
74+
SELECT @Result = p.output_label
75+
FROM PREDICT(MODEL = @model, DATA = predict_input) WITH (output_label bigint) AS p
76+
END
77+
GO
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
/* Create users using the logins created */
2+
CREATE USER OperatorUser WITHOUT LOGIN;
3+
CREATE USER DataScientistUser WITHOUT LOGIN;
4+
CREATE USER SecurityUser WITHOUT LOGIN;
5+
CREATE USER TurbineUser WITHOUT LOGIN;
6+
7+
/* Grand permissions to users */
8+
GRANT SELECT ON RealtimeSensorRecord TO OperatorUser;
9+
GRANT SELECT ON RealtimeSensorRecord TO DataScientistUser;
10+
GRANT SELECT ON RealtimeSensorRecord TO SecurityUser;
11+
GRANT SELECT, INSERT ON RealtimeSensorRecord TO TurbineUser;
12+
13+
14+
-- Mask the last four digits of the serial number (Sensor ID) of the sensor for the Data Scientist
15+
ALTER TABLE RealtimeSensorRecord
16+
ALTER COLUMN SensorId varchar(50) MASKED WITH (FUNCTION = 'partial(34,"XXXX",0)');
17+
DENY UNMASK TO DataScientistUser;
18+
GO
19+
20+
/**
21+
* Operator: Can see all events
22+
* Data Scientist: Can see everything BUT Hatch Sensor events
23+
* Security: Can ONLY see HatchSensor events
24+
*/
25+
ALTER TABLE RealtimeSensorRecord
26+
ALTER COLUMN SensorType sysname
27+
GO
28+
29+
CREATE SCHEMA Security;
30+
GO
31+
32+
/**
33+
* Operator: Can see all events
34+
* Data Scientist: Can see everything BUT Hatch Sensor events
35+
* Security: Can ONLY see HatchSensor events
36+
*/
37+
CREATE FUNCTION Security.fn_securitypredicate(@SensorType AS sysname)
38+
RETURNS TABLE
39+
WITH SCHEMABINDING
40+
AS
41+
RETURN SELECT 1 AS fn_securitypredicate_result
42+
WHERE
43+
USER_NAME() = 'OperatorUser' OR USER_NAME() = 'dbo' OR
44+
(USER_NAME() = 'DataScientistUser' AND @SensorType <> 'HatchSensor') OR
45+
(USER_NAME() = 'SecurityUser' AND @SensorType = 'HatchSensor');
46+
47+
CREATE SECURITY POLICY SensorsDataFilter
48+
ADD FILTER PREDICATE Security.fn_securitypredicate(SensorType)
49+
ON dbo.RealtimeSensorRecord
50+
WITH (STATE = ON);
51+
52+
/* QUERIES FOR TESTING POLICIES */
53+
54+
-- Testing basic policy to deny delete
55+
EXECUTE AS USER = 'OperatorUser';
56+
SELECT * FROM RealtimeSensorRecord;
57+
DELETE FROM RealtimeSensorRecord WHERE SensorType = 'GeneratorTorque';
58+
REVERT;
59+
60+
-- Testing the masking for data Data Scientist
61+
EXECUTE AS USER = 'DataScientistUser';
62+
SELECT TOP 10 * FROM RealtimeSensorRecord;
63+
REVERT;
64+
65+
-- Testing Row-Level Security policy with Operator that can see all the events
66+
EXECUTE AS USER = 'OperatorUser';
67+
SELECT * FROM RealtimeSensorRecord;
68+
REVERT;
69+
70+
-- Testing Row-Level Security policy with DataScientist that can see all the events but HatchSensor
71+
EXECUTE AS USER = 'DataScientistUser';
72+
SELECT * FROM RealtimeSensorRecord;
73+
REVERT;
74+
75+
-- Testing Row-Level Security policy with Security that can see only the HatchSensor events
76+
EXECUTE AS USER = 'SecurityUser';
77+
SELECT * FROM RealtimeSensorRecord;
78+
REVERT;
Binary file not shown.

0 commit comments

Comments
 (0)