view_perms.sql
上传用户:blenddy
上传日期:2007-01-07
资源大小:6495k
文件大小:3k
源码类别:

数据库系统

开发平台:

Unix_Linux

  1. --
  2. -- Create a new user with the next unused usesysid
  3. --
  4. CREATE FUNCTION viewperms_nextid () RETURNS int4 AS '
  5. SELECT max(usesysid) + 1 AS ret FROM pg_user;
  6.     ' LANGUAGE 'sql';
  7. CREATE FUNCTION viewperms_testid () RETURNS oid AS '
  8.      SELECT oid(textin(int4out(usesysid))) FROM pg_user 
  9. WHERE usename = ''viewperms_testuser'';
  10.     ' LANGUAGE 'sql';
  11. INSERT INTO pg_shadow VALUES (
  12. 'viewperms_testuser',
  13. viewperms_nextid(),
  14. false, true, false, true,
  15. NULL, NULL
  16.     );
  17. --
  18. -- Create tables and views
  19. --
  20. CREATE TABLE viewperms_t1 (
  21.      a int4,
  22. b text
  23.     );
  24. CREATE TABLE viewperms_t2 (
  25.      a int4,
  26. b text
  27.     );
  28. INSERT INTO viewperms_t1 VALUES (1, 'one');
  29. INSERT INTO viewperms_t1 VALUES (2, 'two');
  30. INSERT INTO viewperms_t1 VALUES (3, 'three');
  31. INSERT INTO viewperms_t2 VALUES (1, 'one');
  32. INSERT INTO viewperms_t2 VALUES (2, 'two');
  33. INSERT INTO viewperms_t2 VALUES (3, 'three');
  34. CREATE VIEW viewperms_v1 AS SELECT * FROM viewperms_t1;
  35. CREATE VIEW viewperms_v2 AS SELECT * FROM viewperms_t2;
  36. CREATE VIEW viewperms_v3 AS SELECT * FROM viewperms_t1;
  37. CREATE VIEW viewperms_v4 AS SELECT * FROM viewperms_t2;
  38. CREATE VIEW viewperms_v5 AS SELECT * FROM viewperms_v1;
  39. CREATE VIEW viewperms_v6 AS SELECT * FROM viewperms_v4;
  40. CREATE VIEW viewperms_v7 AS SELECT * FROM viewperms_v2;
  41. --
  42. -- Change ownership
  43. --     t1 tuser
  44. --     t2 pgslq
  45. --     v1 pgslq
  46. --     v2 pgslq
  47. --     v3 tuser
  48. --     v4 tuser
  49. --     v5 postgres
  50. --     v6 postgres
  51. --     v7 tuser
  52. --
  53. UPDATE pg_class SET relowner = viewperms_testid() 
  54. WHERE relname = 'viewperms_t1';
  55. UPDATE pg_class SET relowner = viewperms_testid() 
  56. WHERE relname = 'viewperms_v3';
  57. UPDATE pg_class SET relowner = viewperms_testid() 
  58. WHERE relname = 'viewperms_v4';
  59. UPDATE pg_class SET relowner = viewperms_testid() 
  60. WHERE relname = 'viewperms_v7';
  61. --
  62. -- Now for the tests.
  63. --
  64. -- View v1 owner postgres has access to t1 owned by tuser
  65. SELECT * FROM viewperms_v1;
  66. -- View v2 owner postgres has access to t2 owned by postgres (of cause)
  67. SELECT * FROM viewperms_v2;
  68. -- View v3 owner tuser has access to t1 owned by tuser
  69. SELECT * FROM viewperms_v3;
  70. -- View v4 owner tuser has NO access to t2 owned by postgres
  71. -- MUST fail with permission denied
  72. SELECT * FROM viewperms_v4;
  73. -- v5 (postgres) can access v2 (postgres) can access t1 (tuser)
  74. SELECT * FROM viewperms_v5;
  75. -- v6 (postgres) can access v4 (tuser) CANNOT access t2 (postgres)
  76. SELECT * FROM viewperms_v6;
  77. -- v7 (tuser) CANNOT access v2 (postgres) wanna access t2 (pgslq)
  78. SELECT * FROM viewperms_v7;
  79. GRANT SELECT ON viewperms_v2 TO PUBLIC;
  80. -- but now
  81. -- v7 (tuser) can access v2 (postgres via grant) can access t2 (postgres)
  82. SELECT * FROM viewperms_v7;
  83. --
  84. -- Tidy up - we remove the testuser below and we don't let
  85. -- objects lay around with bad owner reference
  86. --
  87. DROP VIEW viewperms_v1;
  88. DROP VIEW viewperms_v2;
  89. DROP VIEW viewperms_v3;
  90. DROP VIEW viewperms_v4;
  91. DROP VIEW viewperms_v5;
  92. DROP VIEW viewperms_v6;
  93. DROP VIEW viewperms_v7;
  94. DROP TABLE viewperms_t1;
  95. DROP TABLE viewperms_t2;
  96. DROP FUNCTION viewperms_nextid ();
  97. DROP FUNCTION viewperms_testid ();
  98. --
  99. -- Remove the testuser
  100. --
  101. DELETE FROM pg_shadow WHERE usename = 'viewperms_testuser';