use*_*567 12 schema sql-server permissions
我在 SQL Azure 中创建了一个架构,并向数据库角色授予了以下权限:
CREATE ROLE myrole AUTHORIZATION dbo;
EXEC sp_addrolemember 'myrole', 'myuser';
CREATE SCHEMA myschema AUTHORIZATION dbo;
GRANT ALTER, CONTROL, DELETE, EXECUTE, INSERT, REFERENCES, SELECT, UPDATE, VIEW
DEFINITION ON SCHEMA::myschema TO myrole;
GRANT CREATE TABLE, CREATE PROCEDURE, CREATE FUNCTION, CREATE VIEW TO myrole;
Run Code Online (Sandbox Code Playgroud)
通过上面定义的权限myuser可以创建/删除自己的模式,所以为了克服这个问题我尝试了 ALTER ANY SCHEMA 权限。但此权限也拒绝用户创建/删除表。
需要什么权限才能允许用户在他自己的架构中做任何事情,但不能创建或删除架构本身?
Roi*_*ish 10
无需授予CONTROL架构。
需要的权限DROP SCHEMA或者是CONTROL在模式或ALTER ANY SCHEMA在数据库级别,这就是为什么你的用户能够删除模式。删除这两个权限将阻止与角色关联的用户创建和删除架构(当然,除非他们具有更高级别的权限)。
CREATE ALTER和DROP其他对象所需的权限是CREATE对象类型(表\过程\函数\视图)的ALTER权限与架构的权限相结合。
您的脚本中已经拥有这些权限,因此您所要做的就是删除该CONTROL权限。作为参考,这里是BOLDDL语句列表,您可以在其中找到所有对象类型所需的权限。
对于懒惰的人,这是删除不必要的权限后的代码:
CREATE ROLE myrole AUTHORIZATION dbo;
EXEC sp_addrolemember 'myrole', 'myuser';
CREATE SCHEMA myschema AUTHORIZATION dbo;
GRANT ALTER, DELETE, EXECUTE, INSERT, REFERENCES, SELECT,
UPDATE, VIEW DEFINITION ON SCHEMA::myschema TO myrole;
GRANT CREATE TABLE, CREATE PROCEDURE, CREATE FUNCTION, CREATE VIEW TO myrole;
Run Code Online (Sandbox Code Playgroud)
小智 5
请注意,由于新架构具有“dbo”的授权,因此用户将能够间接访问架构由 dbo 拥有的所有数据库对象。
例子:
select * from dbo.test; --fails
create view myschema.test
as
select *
from dbo.test; --view is created
select * from myschema.test; --contents of dbo.test now revealed.
Run Code Online (Sandbox Code Playgroud)
这是 SQL Server 引擎的正确操作;权限渗透到具有相同授权的其他模式中。要限制此类访问,这里有一个模式创建选项:
CREATE SCHEMA myschema AUTHORIZATION myrole;
Run Code Online (Sandbox Code Playgroud)