假设我有两个 Postgresql 数据库组,“authors”和“editors”,以及两个用户,“maxwell”和“ernest”。
create role authors;
create role editors;
create user maxwell;
create user ernest;
grant authors to editors; --editors can do what authors can do
grant editors to maxwell; --maxwell is an editor
grant authors to ernest; --ernest is an author
Run Code Online (Sandbox Code Playgroud)
我想编写一个高性能函数,它返回 maxwell 所属的角色列表(最好是他们的 oid),如下所示:
create or replace function get_all_roles() returns oid[] ...
Run Code Online (Sandbox Code Playgroud)
它应该返回 maxwell、authors 和 editors(但不是 ernest)的 oid。
但是当有继承时,我不知道该怎么做。
我最近想与服务器的一个用户共享定期访问权限和我认识到,一个简单的CREATE USER和GRANT ALL ON DATABASE命令没有让他运行一个简单SELECT的数据。
我想将给定数据库中所有表的权限授予指定用户,但我不确定授予他对整个架构的访问权限是否是最好的主意,public因为我不知道这是否允许某种特权升级。有没有其他办法?
根据微软“SQL Server 数据库的 ALTER AUTHORIZATION”:
对新主人的要求:
新的所有者委托人必须是以下之一:
- SQL Server 身份验证登录。
- 代表 Windows 用户(不是组)的 Windows 身份验证登录。
- 通过代表 Windows 组的 Windows 身份验证登录进行身份验证的 Windows 用户。
显然一个组不能拥有一个数据库。确实调用
alter authorization on database::MyDatabase to [domainname\SQLServerAdminGroup]
Run Code Online (Sandbox Code Playgroud)
结果在消息中
数据库类型的实体不能由角色、组、approle 或映射到证书或非对称密钥的主体拥有。
例如,让 SQL 管理员的 Windows 安全组的单个成员成为数据库所有者似乎很容易受到该帐户被废弃的影响。在这个问题中,这似乎是所有者员工离开公司时发生的事情。 此答案将数据库所有权作为 NT 主要主体的问题总结如下:
将数据库所有权默认为 NT 主要主体会产生一个包含问题(所有者是由 AD 管理的 NT SID,并且不会随数据库文件一起移动,NT 帐户可能会被指纹等)。
我是 SQL Server 管理的新手,与例如文件的所有权相比,只有主要主体才能成为所有者的限制很突出。根据微软“如何分配和更改所有者”:
默认情况下,新对象的所有者是在附加到创建过程的访问令牌中标识为默认所有者的安全主体。...当用户是管理员组或域管理员组的成员时,会发生唯一的例外。在这两种情况下,用户访问令牌中的所有者字段包含组的 SID,而不是单个用户帐户的 SID。假设管理帐户仅用于管理系统,而不用于任何个人目的。因此,由一个管理员创建的对象可以由同一组中的其他管理员管理。
换句话说,
这给我留下了以下问题:
我们有一种情况,开发人员没有任何UPDATE权限,但他们使用应用程序并查看连接字符串 -> 他们知道来自某些SQLLogin1具有 UPDATE 权限的SQL 帐户(示例)的密码。我们目前的操作并不完善,有时需要修改生产数据(目前还没有 GUI)。
开发人员没有联系 DBA 并要求他修改数据,而是(不正确地)使用 SQL 帐户SQLLogin1(有权修改数据),并通过 SQL Server Management Studio 连接自己修改数据。
DBA 无法SQLLogin1在 Developer 看到新连接字符串和新密码的情况下更改密码,因为使用的应用程序连接字符串SQLLogin1是由 Developer 维护的。
有没有办法拒绝访问SQLLogin1SQL 登录,但前提是它通过 SSMS 连接?
同时如果SQLLogin1正在连接.Net SqlClient Data Provider(program_name在sys.dm_exec_sessions),必须允许登录。
这样我们就不想让开发人员使用 SSMS 连接SQLLogin1,而使用的应用程序SQLLogin1仍然可以连接。
在我工作的地方,我们有一个 SQL Server 数据库(Microsoft SQL Server 2008 R2)作为后端,有两个不同的用户界面,一个 .NET Web 界面和一个 FoxPro 界面。
每个月我们都需要对 Web 和 FoxPro 客户端应用更新。在执行此操作之前,建议我们确保在更新过程中没有人访问数据库。
在我们更新数据库时阻止访问数据库的最简单方法是什么?后续问题:在我们更新时阻止访问的最佳方法是什么?
我希望能够获得一个函数名称和函数所有者名称的表格。
目前,此查询返回给定模式的函数列表:
SELECT proname
FROM pg_catalog.pg_namespace n
JOIN pg_catalog.pg_proc p
ON pronamespace = n.oid
WHERE nspname = '<%= schema_name %>';
Run Code Online (Sandbox Code Playgroud)
我可以看到有一proowner列返回角色的 ID。
https://www.postgresql.org/docs/10/catalog-pg-proc.html
我想要的是返回所有者名称的东西,我只是不知道足够的 SQL 来弄清楚如何加入表等。
|function_name|function_owner|
______________________________
|func1 |func1_owner |
|func2 |func2_owner |
Run Code Online (Sandbox Code Playgroud)
如果有人可以解释如何做到这一点,我将不胜感激!
谢谢
我有一个数据库服务器(Sql Server 2008 R2 Enterprise)支持两个独立但相关的供应商产品,每个产品都有自己的数据库(称为 X 和 Y)
在数据库 XI 中定义了很多用户,但他们的访问权限归结为少数几个可管理的角色。我想扮演这些角色之一并使用它来授予对数据库 Y 中几个表的选择访问权限。我真的想避免在数据库 Y 中创建一个新角色并重新添加所有用户,而不仅仅是因为忙于设置安全信息,但也因为需要随着时间的推移保持这些角色同步,因为用户来来去去。实际上,数据库 X 中已经存在的角色已经在逻辑上从业务角度定义了我想要的数据库 Y 中的访问组方面做得很好,我想保持这种方式。
如何从 X 授予此角色在 Y 中的访问权限?
为了阻止 Oracle 数据库上的特定用户和 IP 组合,我创建了以下触发器,并且编译没有错误。
Create or replace trigger you_may_not_login
after logon on database
begin
if sys_context('USERENV','SESSION_USER')='xx' AND sys_context('USERENV','IP_ADDRESS')='10.0.30.219' then
raise_application_error(-20001,'Denied! You are not allowed to logon the database');
end if;
end;
/
Run Code Online (Sandbox Code Playgroud)
当我使用 'xx' 用户登录时,警报日志显示以下错误,但访问权限已授予数据库,触发器以某种方式无法阻止用户登录。
Errors in file /oraarch/core/udump/wfsbi_ora_9338.trc:
ORA-00604: error occurred at recursive SQL level 1
ORA-20001: Sorry, you are not allowed here!
ORA-06512: at line 9
Run Code Online (Sandbox Code Playgroud)
我哪里错了?/
我有一个生成 XMLTYPE 的过程,我想根据模式对其进行验证。问题是运行 createSchemaBasedXML 似乎存在权限问题,因为当我以 AUTHID DEFINER 运行该过程时,它给出错误“ORA-31050:拒绝访问”,但是当我以 AUTHID CURRENT_USER 运行它时,它实际上返回了一个特定于验证的错误(我会单独处理)。CURRENT_USER 不是可接受的解决方案。
我的假设是 CURRENT_USER 有效,因为用户具有 XMLADMIN 角色。授予角色包含的权限并不能解决问题,因此必须是角色能够绕过 ACL。
问题是,查询 RESOURCE_VIEW 以获取保护资源的 ACL 表明它受/sys/acls/all_owner_acl.xml. DBMS_XDB.getPrivileges显示 xsd 具有以下所有权限:
<read-properties/>
<read-contents/>
<write-config/>
<link/>
<unlink/>
<read-acl/>
<write-acl-ref/>
<update-acl/>
<resolve/>
<link-to/>
<unlink-from/>
<dav:lock/>
<dav:unlock/>
<dav:write-properties/>
<dav:write-content/>
<dav:execute/>
<dav:take-ownership/>
<dav:read-current-user-privilege-set/>
Run Code Online (Sandbox Code Playgroud)
使用DBMS_XDB.getAclDocument表明主体dav:owner拥有所有权限,因此这不足以允许模式的所有者创建基于模式的 XML。考虑到这个想法,我创建了一个块来运行DBMS_XDB.createResource创建一个新的 ACL。我可以成功创建 ACL,并且从 SQLDeveloper 我可以看到它存在于我创建它的位置。
在这个过程中有很多地方我可能会出错,所以我正在寻找的核心是:
必须具备哪些条件才能根据模式验证 XMLTYPE?
=== 2013 年 4 月 3 日更新 ===
我可以将我的 xsd 文件的 acl 设置/sys/acls/all_all_acl.xml为/sys/acls/all_owner_acl.xml. 和以前一样,这些都不能解决权限问题。我还尝试了使用从 …
我试图做到这一点,以便与数据库的本地连接不需要登录。所以我local all all trust将这一行添加到 pg_hba.conf 文件中,但是当我加载 pgAdmin 并尝试连接到服务器时,它只是说FATAL: could not load pg_hba.conf. 我究竟做错了什么?
access-control ×10
postgresql ×4
sql-server ×4
permissions ×3
role ×3
oracle ×2
connections ×1
functions ×1
logins ×1
pg-hba.conf ×1
security ×1
trigger ×1
users ×1
windows ×1
xml ×1