/root/projects/repository/config/alfresco/dbscripts/upgrade/2.2/org.hibernate.dialect.MySQLInnoDBDialect/AlfrescoSchemaUpdate-2.1-A--to--2.2-ACL.sql

https://github.com/alfresco-mirror/alfresco-mirror · SQL · 201 lines · 122 code · 32 blank · 47 comment · 0 complexity · 51b6c969397dd57509398ad685332192 MD5 · raw file

  1. --
  2. -- Title: Update for permissions schema changes
  3. -- Database: MySQL InnoDB
  4. -- Since: V2.2 Schema 85
  5. -- Author: Andy Hind
  6. --
  7. -- Please contact support@alfresco.com if you need assistance with the upgrade.
  8. --
  9. CREATE TABLE alf_acl_change_set (
  10. id BIGINT NOT NULL AUTO_INCREMENT,
  11. version BIGINT NOT NULL,
  12. primary key (id)
  13. ) ENGINE=InnoDB;
  14. -- Add to ACL
  15. ALTER TABLE alf_access_control_list
  16. ADD COLUMN type INT NOT NULL DEFAULT 0,
  17. ADD COLUMN latest BOOLEAN NOT NULL DEFAULT TRUE,
  18. ADD COLUMN acl_id VARCHAR(36) NOT NULL DEFAULT 'UNSET',
  19. ADD COLUMN acl_version BIGINT NOT NULL DEFAULT 1,
  20. ADD COLUMN inherited_acl BIGINT,
  21. ADD COLUMN is_versioned BOOLEAN NOT NULL DEFAULT FALSE,
  22. ADD COLUMN requires_version BOOLEAN NOT NULL DEFAULT FALSE,
  23. ADD COLUMN acl_change_set BIGINT,
  24. ADD COLUMN inherits_from BIGINT,
  25. ADD INDEX fk_alf_acl_acs (acl_change_set),
  26. ADD CONSTRAINT fk_alf_acl_acs FOREIGN KEY (acl_change_set) REFERENCES alf_acl_change_set (id),
  27. ADD INDEX idx_alf_acl_inh (inherits, inherits_from);
  28. --FOREACH alf_access_control_list.id system.upgrade.alf_access_control_list.batchsize
  29. UPDATE alf_access_control_list acl
  30. set acl_id = (acl.id)
  31. WHERE acl.id >= ${LOWERBOUND} AND acl.id <= ${UPPERBOUND};
  32. ALTER TABLE alf_access_control_list
  33. ADD UNIQUE (acl_id, latest, acl_version);
  34. -- Create ACL member list
  35. CREATE TABLE alf_acl_member (
  36. id BIGINT NOT NULL AUTO_INCREMENT,
  37. version BIGINT NOT NULL,
  38. acl_id BIGINT NOT NULL,
  39. ace_id BIGINT NOT NULL,
  40. pos INT NOT NULL,
  41. INDEX fk_alf_aclm_acl (acl_id),
  42. CONSTRAINT fk_alf_aclm_acl FOREIGN KEY (acl_id) REFERENCES alf_access_control_list (id),
  43. INDEX fk_alf_aclm_ace (ace_id),
  44. CONSTRAINT fk_alf_aclm_ace FOREIGN KEY (ace_id) REFERENCES alf_access_control_entry (id),
  45. primary key (id),
  46. unique(acl_id, ace_id, pos)
  47. ) ENGINE=InnoDB;
  48. ALTER TABLE alf_access_control_entry DROP INDEX acl_id;
  49. -- Extend ACE
  50. -- not required from 2.1-A
  51. -- ADD COLUMN auth_id BIGINT NOT NULL DEFAULT -1,
  52. ALTER TABLE alf_access_control_entry
  53. ADD COLUMN applies INT NOT NULL DEFAULT 0,
  54. ADD COLUMN context_id BIGINT;
  55. -- remove unused
  56. DROP TABLE alf_auth_ext_keys;
  57. -- not required from 2.1-A
  58. -- remove authority constraint
  59. ALTER TABLE alf_access_control_entry DROP INDEX FKFFF41F99B25A50BF, DROP FOREIGN KEY FKFFF41F99B25A50BF; -- (optional)
  60. -- not required from 2.1-A
  61. -- restructure authority
  62. -- ALTER TABLE alf_authority
  63. -- DROP PRIMARY KEY,
  64. -- ADD COLUMN id BIGINT NOT NULL AUTO_INCREMENT,
  65. -- ADD COLUMN crc BIGINT,
  66. -- CHANGE recipient authority VARCHAR(100),
  67. -- ADD INDEX idx_alf_auth_aut (authority),
  68. -- ADD primary key (id),
  69. -- ADD UNIQUE (authority, crc);
  70. -- migrate data - fix up FK refs to authority
  71. -- UPDATE alf_access_control_entry ace
  72. -- set auth_id = (select id from alf_authority a where a.authority = ace.authority_id);
  73. -- migrate data - build equivalent ACL entries
  74. --FOREACH alf_access_control_list.id system.upgrade.alf_acl_member.batchsize
  75. INSERT INTO alf_acl_member (version, acl_id, ace_id, pos)
  76. select 1, ace.acl_id, ace.id, 0
  77. from alf_access_control_entry ace join alf_access_control_list acl on acl.id = ace.acl_id
  78. where acl.id >= ${LOWERBOUND} AND acl.id <= ${UPPERBOUND};
  79. -- Create ACE context
  80. CREATE TABLE alf_ace_context (
  81. id BIGINT NOT NULL AUTO_INCREMENT,
  82. version BIGINT NOT NULL,
  83. class_context VARCHAR(1024),
  84. property_context VARCHAR(1024),
  85. kvp_context VARCHAR(1024),
  86. primary key (id)
  87. ) ENGINE=InnoDB;
  88. -- Create auth aliases table
  89. CREATE TABLE alf_authority_alias (
  90. id BIGINT NOT NULL AUTO_INCREMENT,
  91. version BIGINT NOT NULL,
  92. auth_id BIGINT NOT NULL,
  93. alias_id BIGINT NOT NULL,
  94. INDEX fk_alf_autha_ali (alias_id),
  95. CONSTRAINT fk_alf_autha_ali FOREIGN KEY (alias_id) REFERENCES alf_authority (id),
  96. INDEX fk_alf_autha_aut (auth_id),
  97. CONSTRAINT fk_alf_autha_aut FOREIGN KEY (auth_id) REFERENCES alf_authority (id),
  98. primary key (id),
  99. UNIQUE (auth_id, alias_id)
  100. ) ENGINE=InnoDB;
  101. -- Tidy up unused cols on ace table and add the FK contstraint back
  102. -- finish take out of ACL_ID
  103. -- DROP COLUMN authority_id,
  104. -- not required from 2.1-A
  105. -- CHANGE auth_id authority_id BIGINT NOT NULL,
  106. ALTER TABLE alf_access_control_entry
  107. DROP INDEX FKFFF41F99B9553F6C, DROP FOREIGN KEY FKFFF41F99B9553F6C,
  108. DROP INDEX FKFFF41F9960601995, DROP FOREIGN KEY FKFFF41F9960601995,
  109. DROP COLUMN acl_id,
  110. ADD INDEX fk_alf_ace_auth (authority_id),
  111. ADD CONSTRAINT fk_alf_ace_auth FOREIGN KEY (authority_id) REFERENCES alf_authority (id),
  112. ADD INDEX fk_alf_ace_perm (permission_id),
  113. ADD CONSTRAINT fk_alf_ace_perm FOREIGN KEY (permission_id) REFERENCES alf_permission (id),
  114. ADD INDEX fk_alf_ace_ctx (context_id),
  115. ADD CONSTRAINT fk_alf_ace_ctx FOREIGN KEY (context_id) REFERENCES alf_ace_context (id)
  116. ;
  117. CREATE TABLE alf_tmp_min_ace (
  118. min BIGINT NOT NULL,
  119. permission_id BIGINT NOT NULL,
  120. authority_id BIGINT NOT NULL,
  121. allowed BIT(1) NOT NULL,
  122. applies INT NOT NULL,
  123. UNIQUE (permission_id, authority_id, allowed, applies)
  124. ) ENGINE=InnoDB;
  125. --FOREACH alf_access_control_entry.authority_id system.upgrade.alf_tmp_min_ace.batchsize
  126. INSERT INTO alf_tmp_min_ace (min, permission_id, authority_id, allowed, applies)
  127. SELECT
  128. min(ace1.id),
  129. ace1.permission_id,
  130. ace1.authority_id,
  131. ace1.allowed,
  132. ace1.applies
  133. FROM
  134. alf_access_control_entry ace1
  135. WHERE
  136. ace1.authority_id >= ${LOWERBOUND} AND ace1.authority_id <= ${UPPERBOUND}
  137. GROUP BY
  138. ace1.permission_id, ace1.authority_id, ace1.allowed, ace1.applies
  139. ;
  140. -- Update members to point to the first use of an access control entry
  141. --FOREACH alf_acl_member.id system.upgrade.alf_acl_member.batchsize
  142. UPDATE alf_acl_member mem
  143. SET ace_id = (SELECT help.min FROM alf_access_control_entry ace
  144. JOIN alf_tmp_min_ace help
  145. ON help.permission_id = ace.permission_id AND
  146. help.authority_id = ace.authority_id AND
  147. help.allowed = ace.allowed AND
  148. help.applies = ace.applies
  149. WHERE ace.id = mem.ace_id )
  150. WHERE mem.id >= ${LOWERBOUND} AND mem.id <= ${UPPERBOUND};
  151. DROP TABLE alf_tmp_min_ace;
  152. -- Remove duplicate aces the mysql way (as you can not use the deleted table in the where clause ...)
  153. CREATE TABLE tmp_to_delete SELECT ace.id FROM alf_acl_member mem RIGHT OUTER JOIN alf_access_control_entry ace ON mem.ace_id = ace.id WHERE mem.ace_id IS NULL;
  154. DELETE FROM ace USING alf_access_control_entry ace JOIN tmp_to_delete t ON ace.id = t.id;
  155. DROP TABLE tmp_to_delete;
  156. -- Add constraint for duplicate acls
  157. ALTER TABLE alf_access_control_entry
  158. ADD UNIQUE (permission_id, authority_id, allowed, applies, context_id);
  159. --
  160. -- Record script finish
  161. --
  162. DELETE FROM alf_applied_patch WHERE id = 'patch.db-V2.2-ACL-From-2.1-A';
  163. INSERT INTO alf_applied_patch
  164. (id, description, fixes_from_schema, fixes_to_schema, applied_to_schema, target_schema, applied_on_date, applied_to_server, was_executed, succeeded, report)
  165. VALUES
  166. (
  167. 'patch.db-V2.2-ACL-From-2.1-A', 'Manually executed script upgrade V2.2: Update acl schema',
  168. 0, 82, -1, 120, null, 'UNKNOWN', ${TRUE}, ${TRUE}, 'Script completed'
  169. );