在 Ubuntu 16.04 上使用 PostGIS 2.2 全新安装 PostgreSQL 9.5 时,我似乎无法为数据库创建只读用户。这是我到目前为止所做的:
跑了这个,
CREATE ROLE dbowner LOGIN ENCRYPTED PASSWORD 'dbownerpassword';
CREATE DATABASE thedb WITH OWNER dbowner;
GRANT ALL PRIVILEGES ON DATABASE thedb TO dbowner;
CREATE EXTENSION postgis;
CREATE EXTENSION postgis_topology;
GRANT ALL ON ALL TABLES IN SCHEMA public to dbowner;
GRANT ALL ON ALL SEQUENCES IN SCHEMA public to dbowner;
GRANT ALL ON ALL FUNCTIONS IN SCHEMA public to dbowner;
CREATE ROLE readonly LOGIN ENCRYPTED PASSWORD 'ropassword';
GRANT CONNECT ON DATABASE thedb …Run Code Online (Sandbox Code Playgroud) 当我设置我的数据库时,我创建了一个我的应用程序运行的 sql 用户。sql 用户获得对服务器上所有数据库的只读访问权限。问题是用户将来不会对任何新创建的数据库具有只读访问权限。还有另一个应用程序可以为用户创建这些新数据库,但我无法将我的用户脚本添加到创建的模板数据库中。有没有办法自动更新 sql 用户以供将来使用只读?SQL 服务器 2014。
我想创建一个“不可变”的Postgres数据库,用户只能insert/ select(写入/读取)数据,但不能update/ delete(更改/删除)。
我知道有FOR UPDATE锁,但不知道如何使用它。
假设我有下表,如何使其不可变(或者,如果我理解正确,如何FOR UPDATE永久使用锁)?
CREATE TABLE account(
user_id serial PRIMARY KEY,
username VARCHAR (50) UNIQUE NOT NULL,
password VARCHAR (50) NOT NULL,
email VARCHAR (355) UNIQUE NOT NULL,
created_on TIMESTAMP NOT NULL,
last_login TIMESTAMP
);
Run Code Online (Sandbox Code Playgroud) 我希望更新READ_ONLY数据库上的几个用户。
由于数据库在全球范围内 24/7 全天候使用,并且维护窗口刚刚过去,我想在活动量低的时刻执行此操作(以便能够遵守截止日期)。
我目前正在考虑使用:
USE MASTER
GO
ALTER DATABASE SQL SET READ_WRITE
GO
USE SQL
GO
EXEC sp_addrolemember N'db_datareader', N'USER'
GO
USE MASTER
GO
ALTER DATABASE SQL SET READ_ONLY
GO
Run Code Online (Sandbox Code Playgroud)
但是我想:
由于我无法将这些命令放入事务中,而且我在 DEV 或 STG 环境中没有方便的应用程序服务器来预先测试更改,是否有任何有关更改read_only单个操作状态的文档?(我确实测试了 T-SQL 语句,并且它们有效)
另外,由于这需要对数据库进行排他锁,我什至有可能通过我的语句吗?
我倾向于只是提出这将不得不等到下一个维护窗口期间。但我希望这里有人能证明我错了。
我有一个客户希望我实现一个网页,该网页允许用户在文本框中输入自定义查询,以便他们可以直接查询 SQL Server 数据库。我担心用户输入恶意查询*。有没有办法(通过语法检查或角色权限或其他方式)确保数据库在提供此功能时保持安全?
*忽略拒绝服务。我担心的主要是数据丢失
security best-practices permissions sql-server-2008-r2 read-only-database
我们有一个独特的情况,我们希望允许用户使用 SSMS 查询数据库的可读辅助副本以进行临时报告,但不允许他们从主副本中读取数据。我们设置了只读路由来完成此任务。这也是 SQL 2016 上的全部。
我最初的想法是在主副本和辅助副本上创建登录名,并授予对相关数据库的读取访问权限。然后我们将拒绝连接或禁用当前主副本上的登录。在 SSMS 中,用户可以使用 ApplicationIntent=ReadOnly 连接到侦听器,并路由到辅助副本,而无需接触主副本。
我们将使用基本逻辑在主副本服务器和辅助副本服务器上设置一个简单的作业:如果当前服务器=主服务器,则禁用登录;如果当前服务器 = 辅助服务器,则启用登录。
问题是,当在主服务器上禁用登录时,以只读意图连接到侦听器时,我会遇到登录失败。当我在主副本上重新启用登录时,它工作得很好,并且连接已正确路由到可读的辅助副本。
我在主服务器上设置了跟踪,果然,我可以看到登录连接并在主副本上的 master 和 msdb 中运行一些系统类型查询 - 即使我在 SSMS 中使用 ApplicationIntent=ReadOnly 进行连接。我不确定这是否是 SSMS 在幕后执行的操作,或者是否是登录通过只读路由过程的默认行为。
以下是我在主数据库上使用快速分析器跟踪捕获的查询:
--msdb query
select
case
when object_id('dbo.sysdac_instances') is not null then 1
else
0
end
--master query
SELECT
dtb.name AS [Name],
dtb.database_id AS [ID],
CAST(has_dbaccess(dtb.name) AS bit) AS [IsAccessible]
FROM
master.sys.databases AS dtb
ORDER BY
[Name] ASC
Run Code Online (Sandbox Code Playgroud)
以前有人处理过这种情况吗?看来我们基本上需要允许主副本上的登录连接权限,同时拒绝其对主副本上 AG 中的数据库的读取访问权限,但授予该登录权限以读取可读辅助副本上的数据库。
另一种选择是创建一个直接指向辅助副本的 DNS 条目,但我们不能保证该副本始终是辅助副本,因为可能会发生故障转移。
sql-server availability-groups read-only-database sql-server-2016