Advertisement
anchormodeling

Anchor Model

Mar 30th, 2011
234
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
SQL 7.81 KB | None | 0 0
  1. ---------------------------------- [Anchor Table] ------------------------------------
  2. -- AN_Anchor table (with 2 attributes)
  3. --------------------------------------------------------------------------------------
  4. IF NOT EXISTS (SELECT * FROM sys.objects WHERE name = 'AN_Anchor' AND TYPE LIKE '%U%')
  5. CREATE TABLE [AN_Anchor] (
  6.    AN_ID INT IDENTITY(1, 1) NOT NULL,
  7.    Metadata_AN INT NOT NULL,
  8.    PRIMARY KEY (
  9.       AN_ID ASC
  10.    )
  11. );
  12. GO
  13.  
  14. ----------------------- [Key Generation Stored Procedure] ----------------------------
  15. -- AN_Anchor surrogate key generation stored procedure
  16. --------------------------------------------------------------------------------------
  17. IF EXISTS (SELECT * FROM sys.objects WHERE name = 'kAN_Anchor' AND TYPE IN ('P','PC'))
  18. DROP PROCEDURE kAN_Anchor
  19. GO
  20. CREATE PROCEDURE kAN_Anchor (
  21.    @requestedNumberOfIdentities BIGINT,
  22.    @Metadata_AN INT
  23. ) AS
  24. BEGIN
  25.    IF @requestedNumberOfIdentities > 0
  26.    BEGIN
  27.       WITH rowGenerator (rowNumber) AS (
  28.          SELECT
  29.             1
  30.          UNION ALL
  31.          SELECT
  32.             rowNumber + 1
  33.          FROM
  34.             rowGenerator
  35.          WHERE
  36.             rowNumber < @requestedNumberOfIdentities
  37.       )
  38.       INSERT INTO AN_Anchor(Metadata_AN)
  39.       OUTPUT
  40.          inserted.AN_ID
  41.       SELECT
  42.          @Metadata_AN
  43.       FROM
  44.          rowGenerator
  45.       OPTION (maxrecursion 0);
  46.    END
  47. END
  48. GO
  49.  
  50. --------------------------------- [Attribute Table] ----------------------------------
  51. -- AN_ONE_Anchor_AttributeOne table (on AN_Anchor)
  52. --------------------------------------------------------------------------------------
  53. IF NOT EXISTS (SELECT * FROM sys.objects WHERE name = 'AN_ONE_Anchor_AttributeOne' AND TYPE LIKE '%U%')
  54. CREATE TABLE [AN_ONE_Anchor_AttributeOne] (
  55.    AN_ID INT NOT NULL FOREIGN KEY REFERENCES AN_Anchor(AN_ID),
  56.    AN_ONE_Anchor_AttributeOne CHAR(42) NOT NULL,
  57.    Metadata_AN_ONE INT NOT NULL,
  58.    PRIMARY KEY (
  59.       AN_ID ASC
  60.    )
  61. );
  62. GO
  63.  
  64. --------------------------------- [Attribute Table] ----------------------------------
  65. -- AN_TWO_Anchor_AttributeTwo table (on AN_Anchor)
  66. --------------------------------------------------------------------------------------
  67. IF NOT EXISTS (SELECT * FROM sys.objects WHERE name = 'AN_TWO_Anchor_AttributeTwo' AND TYPE LIKE '%U%')
  68. CREATE TABLE [AN_TWO_Anchor_AttributeTwo] (
  69.    AN_ID INT NOT NULL FOREIGN KEY REFERENCES AN_Anchor(AN_ID),
  70.    AN_TWO_Anchor_AttributeTwo CHAR(42) NOT NULL,
  71.    AN_TWO_ValidFrom DATE NOT NULL,
  72.    Metadata_AN_TWO INT NOT NULL,
  73.    PRIMARY KEY (
  74.       AN_ID ASC,
  75.       AN_TWO_ValidFrom DESC
  76.    )
  77. );
  78. GO
  79.  
  80. ------------------------------- [Latest Perspective] ---------------------------------
  81. -- AN_Anchor viewed as is (given by the latest available information)
  82. --------------------------------------------------------------------------------------
  83. IF EXISTS (SELECT * FROM sys.objects WHERE name = 'lAN_Anchor' AND TYPE LIKE '%V%')
  84. DROP VIEW [lAN_Anchor];
  85. GO
  86. CREATE VIEW [lAN_Anchor] AS
  87. SELECT
  88.    [AN].AN_ID,
  89.    [AN].Metadata_AN,
  90.    [AN_ONE].AN_ONE_Anchor_AttributeOne,
  91.    [AN_ONE].Metadata_AN_ONE,
  92.    [AN_TWO].AN_TWO_Anchor_AttributeTwo,
  93.    [AN_TWO].AN_TWO_ValidFrom,
  94.    [AN_TWO].Metadata_AN_TWO
  95. FROM
  96.    AN_Anchor [AN]
  97. LEFT JOIN
  98.    AN_ONE_Anchor_AttributeOne [AN_ONE]
  99. ON
  100.    [AN_ONE].AN_ID = [AN].AN_ID
  101. LEFT JOIN
  102.    AN_TWO_Anchor_AttributeTwo [AN_TWO]
  103. ON
  104.    [AN_TWO].AN_ID = [AN].AN_ID
  105. AND
  106.    [AN_TWO].AN_TWO_ValidFrom = (
  107.       SELECT
  108.          MAX(sub.AN_TWO_ValidFrom)
  109.       FROM
  110.          AN_TWO_Anchor_AttributeTwo sub
  111.       WHERE
  112.          sub.AN_ID = [AN].AN_ID
  113.    );
  114. GO
  115.  
  116. --------------------------------- [Insert Trigger] -----------------------------------
  117. -- AN_Anchor insert trigger on the latest perspective
  118. --------------------------------------------------------------------------------------
  119. IF EXISTS (SELECT * FROM sys.triggers WHERE name = 'tAN_Anchor')
  120. DROP TRIGGER tAN_Anchor
  121. GO
  122. CREATE TRIGGER tAN_Anchor ON lAN_Anchor
  123. INSTEAD OF INSERT
  124. AS
  125. BEGIN
  126.    DECLARE @Metadata_AN INT;
  127.    SELECT
  128.       @Metadata_AN = Metadata_AN
  129.    FROM
  130.       inserted;
  131.    DECLARE @AN_ID INT;
  132.    SELECT
  133.       @AN_ID = AN_ID
  134.    FROM
  135.       inserted;
  136.    IF(@AN_ID IS NULL)
  137.    BEGIN
  138.       INSERT INTO AN_Anchor(
  139.          Metadata_AN
  140.       )
  141.       VALUES (@Metadata_AN);
  142.       SELECT @AN_ID = SCOPE_IDENTITY();
  143.    END
  144.    INSERT INTO AN_ONE_Anchor_AttributeOne(
  145.       AN_ID,
  146.       AN_ONE_Anchor_AttributeOne,
  147.       Metadata_AN_ONE
  148.    )
  149.    SELECT
  150.       @AN_ID,
  151.       AN_ONE_Anchor_AttributeOne,
  152.       COALESCE(Metadata_AN_ONE, @Metadata_AN)
  153.    FROM
  154.       inserted
  155.    WHERE
  156.       AN_ONE_Anchor_AttributeOne IS NOT NULL
  157.    AND
  158.       COALESCE(Metadata_AN_ONE, @Metadata_AN) IS NOT NULL;
  159.    INSERT INTO AN_TWO_Anchor_AttributeTwo(
  160.       AN_ID,
  161.       AN_TWO_Anchor_AttributeTwo,
  162.       Metadata_AN_TWO,
  163.       AN_TWO_ValidFrom
  164.  
  165.    )
  166.    SELECT
  167.       @AN_ID,
  168.       AN_TWO_Anchor_AttributeTwo,
  169.       COALESCE(Metadata_AN_TWO, @Metadata_AN),
  170.       AN_TWO_ValidFrom
  171.  
  172.    FROM
  173.       inserted
  174.    WHERE
  175.       AN_TWO_Anchor_AttributeTwo IS NOT NULL
  176.    AND
  177.       COALESCE(Metadata_AN_TWO, @Metadata_AN) IS NOT NULL
  178. AND      AN_TWO_ValidFrom IS NOT NULL;
  179. END
  180. GO
  181.  
  182. ---------------------------- [Point-in-Time Perspective] -----------------------------
  183. -- AN_Anchor viewed as was (at the given timepoint)
  184. --------------------------------------------------------------------------------------
  185. IF EXISTS (SELECT * FROM sys.objects WHERE name = 'pAN_Anchor' AND TYPE LIKE '%F%')
  186. DROP FUNCTION [pAN_Anchor];
  187. GO
  188. CREATE FUNCTION [pAN_Anchor] (@timepoint datetime)
  189. RETURNS TABLE RETURN
  190. SELECT
  191.    [AN].AN_ID,
  192.    [AN].Metadata_AN,
  193.    [AN_ONE].AN_ONE_Anchor_AttributeOne,
  194.    [AN_ONE].Metadata_AN_ONE,
  195.    [AN_TWO].AN_TWO_Anchor_AttributeTwo,
  196.    [AN_TWO].AN_TWO_ValidFrom,
  197.    [AN_TWO].Metadata_AN_TWO
  198. FROM
  199.    AN_Anchor [AN]
  200. LEFT JOIN
  201.    AN_ONE_Anchor_AttributeOne [AN_ONE]
  202. ON
  203.    [AN_ONE].AN_ID = [AN].AN_ID
  204. LEFT JOIN
  205.    AN_TWO_Anchor_AttributeTwo [AN_TWO]
  206. ON
  207.    [AN_TWO].AN_ID = [AN].AN_ID
  208. AND
  209.    [AN_TWO].AN_TWO_ValidFrom = (
  210.       SELECT
  211.          MAX(sub.AN_TWO_ValidFrom)
  212.       FROM
  213.          AN_TWO_Anchor_AttributeTwo sub
  214.       WHERE
  215.          sub.AN_ID = [AN].AN_ID
  216.       AND
  217.          sub.AN_TWO_ValidFrom <= @timepoint
  218.    );
  219. GO
  220.  
  221. ------------------------------ [Difference Perspective] ------------------------------
  222. -- AN_Anchor viewed by differences in AN_TWO_Anchor_AttributeTwo
  223. --------------------------------------------------------------------------------------
  224. IF EXISTS (SELECT * FROM sys.objects WHERE name = 'dAN_TWO_Anchor_AttributeTwo' AND TYPE LIKE '%F%')
  225. DROP FUNCTION [dAN_TWO_Anchor_AttributeTwo];
  226. GO
  227. CREATE FUNCTION [dAN_TWO_Anchor_AttributeTwo] (@intervalStart datetime, @intervalEnd datetime)
  228. RETURNS TABLE RETURN
  229. SELECT
  230.    timepoints.inspectedTimepoint,
  231.    [AN].*
  232. FROM (
  233.    SELECT DISTINCT
  234.       AN_TWO_ValidFrom AS inspectedTimepoint
  235.    FROM
  236.       AN_TWO_Anchor_AttributeTwo
  237.    WHERE
  238.       AN_TWO_ValidFrom BETWEEN @intervalStart AND @intervalEnd
  239. ) timepoints
  240. CROSS APPLY
  241.    pAN_Anchor(timepoints.inspectedTimepoint) [AN];
  242. GO
  243.  
  244. ------------------------------ [Difference Perspective] ------------------------------
  245. -- AN_Anchor viewed by differences in every historized attribute
  246. --------------------------------------------------------------------------------------
  247. IF EXISTS (SELECT * FROM sys.objects WHERE name = 'dAN_Anchor' AND TYPE LIKE '%F%')
  248. DROP FUNCTION [dAN_Anchor];
  249. GO
  250. CREATE FUNCTION [dAN_Anchor] (@intervalStart datetime, @intervalEnd datetime)
  251. RETURNS TABLE RETURN
  252. SELECT
  253.    timepoints.inspectedTimepoint,
  254.    [AN].*
  255. FROM (
  256.    SELECT DISTINCT
  257.       AN_TWO_ValidFrom AS inspectedTimepoint
  258.    FROM
  259.       AN_TWO_Anchor_AttributeTwo
  260.    WHERE
  261.       AN_TWO_ValidFrom BETWEEN @intervalStart AND @intervalEnd
  262. ) timepoints
  263. CROSS APPLY
  264.    pAN_Anchor(timepoints.inspectedTimepoint) [AN];
  265. GO
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement