代码之家  ›  专栏  ›  技术社区  ›  HAdes

如何对具有访问其他模式的对象的模式设置权限?

  •  1
  • HAdes  · 技术社区  · 16 年前

    CREATE VIEW I.ITest
    AS
        SELECT 1 as TestColumn
    GO
    CREATE VIEW O.OTest
    AS
        SELECT * FROM I.ITest
    GO
    
    EXEC ('SELECT * FROM O.OTest') AS USER = 'TestUser'
    
    DROP VIEW O.OTest
    DROP VIEW I.ITest
    

    :我的模式由不同的db角色拥有,所以我通过简单地将两者的所有者都更改为dbo,然后授予db角色访问模式的权限来解决这个问题。这意味着所有者dbo可以看到所有内容,然后我可以只对db角色授予特定权限,除非通过此模式,否则其余的db对象不可用。谢谢你的帮助

    2 回复  |  直到 16 年前
        1
  •  1
  •   Mike H    16 年前

    USE DATABASE SANDBOX;
    
    --Create Logins
    CREATE LOGIN UserOne WITH Password='Hello123';
    CREATE LOGIN UserTwo WITH Password='Hello123';
    
    --Create Database Users
    CREATE USER UserOne;
    CREATE USER UserTwo;
    
    --Create the Test Schemas
    CREATE SCHEMA SchemaOne AUTHORIZATION UserOne;
    CREATE SCHEMA SchemaTwo AUTHORIZATION UserTwo;
    
    --Create a View on SchemaOne
    CREATE VIEW SchemaOne.ViewOne
    AS SELECT 1 as TestColumn;
    
    --Create a View on SchemaTwo
    CREATE VIEW SchemaTwo.ViewTwo
    AS SELECT * FROM SchemaOne.ViewOne;
    
    --Test that the SchemaOne
    EXEC('select * from SchemaOne.ViewOne') AS USER = 'UserOne'
    --1
    
    EXEC('select * from SchemaTwo.ViewTwo') AS USER = 'UserOne'
    --The SELECT permission was denied on the object 'ViewTwo', database 'SANDBOX', schema 'SchemaTwo'.
    
    --Create a stored procedure to safely expose the view within SchemaTwo to UserOne who's default Schema is
    --SchemaOne.
    CREATE PROCEDURE SchemaTwo.proc_SelectViewTwo
    AS
        select * from SchemaTwo.ViewTwo;
    
    --Grant execute rights on the procedure
    GRANT EXECUTE ON SchemaTwo.proc_SelectViewTwo TO UserOne;
    
    --Test the 
    EXECUTE AS LOGIN='UserOne';
        Exec SchemaTwo.proc_SelectViewTwo;
    revert;
    

    我在评论中建议的另一种方法是使用数据库角色来控制对多个模式的访问。使用上面解决方案中定义的主体,您可以这样使用数据库角色:

    EXEC sp_addrole 'CrossSchemaRole';
    EXEC sp_addrolemember 'CrossSchemaRole','UserOne';
    
    GRANT SELECT ON SCHEMA::SchemaOne TO CrossSchemaRole;
    GRANT SELECT ON SCHEMA::SchemaTwo TO CrossSchemaRole;
    
    EXECUTE AS LOGIN='UserOne';
        select * from SchemaTwo.ViewTwo;
    revert;
    

        2
  •  1
  •   John Sansom    16 年前

    当然,您授予的权限是用户而不是对象,仅此而已。如果您或其他模式的所有者希望允许其他用户访问其中的对象(无论是表、视图还是其他),那么这取决于其他模式的拥有者。仅仅因为你作为开发人员可以编写一个访问其他模式中对象的过程,并不意味着运行你的过程的任何人都应该被允许这样做。角色是要走的路。