我在 Windows 7 上使用 PostgreSQL 9.6.2,当我从命令提示符启动 psql 时:
psql -U myusername
Run Code Online (Sandbox Code Playgroud)
它要求输入密码并登录。但是如果我这样做:
psql -U postgres
Run Code Online (Sandbox Code Playgroud)
它会以超级用户权限直接登录到主数据库,而无需输入任何类型的密码。如果我输入:
psql -U postgres -W
Run Code Online (Sandbox Code Playgroud)
然后它会询问 su 密码,顺便说一下,这是我在一键安装过程中设置的密码。
我已经检查过了pg_hba.conf,它被设置md5为所有用户,所有数据库。我什postgres=# ALTER USER postgres PASSWORD 'myPassword';至用: 更改了数据库中的密码,但无济于事。
问题是为什么当我以普通用户身份登录时它要求输入密码而当我以超级用户身份登录时却没有?这不是主要问题,因为在任何一种情况下我都可以访问我的数据库,但它似乎根本不安全。任何解决方法将不胜感激。
我正在尝试构建一个触发器函数,以便在任何项目发生更改时自动更新父订单值。
这是我创建的:
CREATE OR REPLACE FUNCTION update_totals() RETURNS void AS $$
UPDATE orders SET
total_fees = (SELECT SUM(fees) FROM order_items WHERE order_id = OLD.order_id),
total_profit = (CASE WHEN total_cost IS NOT NULL THEN total - total_tax - total_cost - (SELECT SUM(fees) FROM order_items WHERE order_id = OLD.order_id) ELSE NULL END)
WHERE id = OLD.order_id;
$$
LANGUAGE SQL;
CREATE TRIGGER update_totals AFTER INSERT
OR UPDATE OF fees
ON order_items INITIALLY DEFERRED
FOR EACH ROW
WHEN ( OLD.* IS DISTINCT FROM NEW.* …Run Code Online (Sandbox Code Playgroud) 我有一个应用程序使用db_owner权限连接到的数据库。
如何有效地确定该用户(应用程序)在不导致服务中断的情况下实际运行所需的最低要求集?(即没有反复试验)
我正在尝试检查什么事件称为我的触发器,例如INSERT,UPDATE或DELETE。
Oracle 触发器可以在一个简单的“IF”语句中进行检查:
IF INSERTING, IF UPDATING or even IF DELETING
Run Code Online (Sandbox Code Playgroud)
PostgreSQL 上有类似的说法吗?
通常我只是创建一个函数 for INSERT,另一个 forUPDATE和一个 for DELETE,但如果有某种方法只创建一个函数,那就浪费了代码。
有人可以帮忙吗?
我们的 OLTP 日志系统的其中一个表中的 ID 即将用完。我的工作是找到一种方法来“归档”完整表和所有引用表中的现有行数据,以便我们可以继续将新数据记录到表中。
我们在一个表中归档数据的最快方法是简单地重命名目标表和所有依赖对象——联结表、索引、约束。它速度很快,并且可以保持数据完整。为了完成这项工作,我们必须使用旧名称创建所有对象的新的空副本。如果我们在一个事务中完成所有这些操作,插入新数据的存储过程不会因为缺少表而失败。
我已经整理了一个 PowerShell 脚本来生成一个 T-SQL 脚本来执行存档操作。
该脚本没有生成应有的重命名语句,我不明白为什么。
该脚本加载 SMO,设置目标对象的名称,并设置到服务器的仅捕获连接 - 这样我就可以捕获重命名命令以供稍后检查:
Add-Type -AssemblyName "Microsoft.SqlServer.Smo, Version=10.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91";
$ServerName = 'CLOUDCORP\LOGGING'
$DatabaseName = 'Logging'
$TableName = 'tbDataRequests'
$TableSchemaName = 'Logging'
$Server = New-Object Microsoft.SqlServer.Management.Smo.Server $ServerName
$Server.ConnectionContext.SqlExecutionModes = [Microsoft.SqlServer.Management.Common.SqlExecutionModes]::CaptureSql
Run Code Online (Sandbox Code Playgroud)
接下来,它创建一个将通过重命名存档的对象数组。目标表本身、所有引用表以及这些表的所有键和所有索引都将被归档:
$Database = $Server.Databases[$DatabaseName]
$Table = @($Database.Tables[$TableName, $TableSchemaName])
$ReferencingTables = $Database.Tables.ForeignKeys |
? { $_.ReferencedTable -eq $TableName -and $_.ReferencedTableSchema -eq $TableSchemaName } |
% { $_.Parent } | Sort ID | Get-Unique
$TablesToArchive = …Run Code Online (Sandbox Code Playgroud) 我有一个表继承设置,可以像这样简化:
CREATE TABLE p (
id BIGSERIAL PRIMARY KEY,
type_id BIGINT,
approved BOOLEAN
);
CREATE INDEX ON p(approved);
CREATE TABLE a (
a_field VARCHAR,
PRIMARY KEY (id),
CHECK(type_id = 1::BIGINT)
) INHERITS (p);
CREATE TABLE b (
b_field INT,
PRIMARY KEY (id),
CHECK(type_id = 2::BIGINT)
) INHERITS (p);
CREATE INDEX ON b(approved);
CREATE TABLE c (
c_field NUMERIC,
PRIMARY KEY (id)
-- this table is missing the check constraint (for no good reason)
) INHERITS (p);
Run Code Online (Sandbox Code Playgroud)
我现在有一个锁定 table 的长期运行事务a …
如果我明确要求,该语句为什么不复制约束?
CREATE TABLE backup_schema.permissions (LIKE public.permissions INCLUDING DEFAULTS INCLUDING CONSTRAINTS INCLUDING INDEXES INCLUDING STORAGE INCLUDING COMMENTS);
INSERT INTO backup_schema.permissions
SELECT *
FROM public.permissions
WHERE community_id=123;
Run Code Online (Sandbox Code Playgroud)
使用 pgadmin3 验证我发现新表(例如:backup_schema)的约束是:

但在公共模式的原始表中是这样的:

使用指定的表名和列名运行更新查询时出现错误:
UPDATE Temp SET Temp.Id='234',Temp.Name='Test'WHERE Id='245'
Run Code Online (Sandbox Code Playgroud)
这是错误:
ERROR: column "temp" of relation "temp" does not exist
LINE 1: UPDATE Temp SET Temp.Id='23...
^
********** Error **********
ERROR: column "temp" of relation "temp" does not exist
SQL state: 42703
Character: 24
Run Code Online (Sandbox Code Playgroud) 我使用的是 PG 9.5,我有一个表 Visitor(id, data::json)
例子:
Visitor(id: 1, data: {name: 'Jack', age: 33, is_user: true })
Run Code Online (Sandbox Code Playgroud)
我想执行类似的查询
数据列内的键是用户指定的,因此是动态的。
在这种情况下哪个索引最有意义?
我是 PostgreSQL 的新手,这就是我问这个问题的原因。我有一个表app_client_users和一个名为client_id. 最初我将其设置为NOT NULL,现在我想将其更改为允许 NULL。我试过了
alter table app_client_users alter column client_id int NULL ;
Run Code Online (Sandbox Code Playgroud)
和
alter table app_client_users alter column client_id NULL ;
Run Code Online (Sandbox Code Playgroud)
这是行不通的。我该如何解决?
postgresql ×8
sql-server ×2
table ×2
alter-table ×1
constraint ×1
functions ×1
index ×1
json ×1
locking ×1
null ×1
partitioning ×1
plpgsql ×1
powershell ×1
security ×1
smo ×1
trigger ×1
update ×1
windows ×1