sys.sysdatabases的status列的值

本文详细介绍了 SQL Server 数据库状态位的含义及其配置方式,包括自动关闭、选择性/批量复制、日志截断等特性,并解释了如何通过 ALTER DATABASE 命令设置这些状态位。

Status bits, some of which can be set by using ALTER DATABASE as noted:

1 = autoclose (ALTER DATABASE)

4 = select into/bulkcopy (ALTER DATABASE using SET RECOVERY)

8 = trunc. log on chkpt (ALTER DATABASE using SET RECOVERY)

16 = torn page detection (ALTER DATABASE)

32 = loading

64 = pre recovery

128 = recovering

256 = not recovered

512 = offline (ALTER DATABASE)

1024 = read only (ALTER DATABASE)

2048 = dbo use only (ALTER DATABASE using SET RESTRICTED_USER)

4096 = single user (ALTER DATABASE)

32768 = emergency mode

4194304 = autoshrink (ALTER DATABASE)

1073741824 = cleanly shutdown

Multiple bits can be ON at the same time.

 

 

status2

16384 = ANSI null default (ALTER DATABASE)

65536 = concat null yields null (ALTER DATABASE)

131072 = recursive triggers (ALTER DATABASE)

1048576 = default to local cursor (ALTER DATABASE)

8388608 = quoted identifier (ALTER DATABASE)

33554432 = cursor close on commit (ALTER DATABASE)

67108864 = ANSI nulls (ALTER DATABASE)

268435456 = ANSI warnings (ALTER DATABASE)

536870912 = full text enabled (set by using sp_fulltext_database )

<think>嗯,用户现在要把一个SQL Server的脚本转换成PostgreSQL的语句。原脚本是检查是否存在名为'HISTORY'的数据库,如果存在的话,就将其设置为单用户模式并立即回滚。我需要仔细分析这个SQL Server语句的结构和功能,然后找到PostgreSQL中对应的实现方式。 首先,原SQL Server代码使用了`IF EXISTS (SELECT ... ) ALTER DATABASE ...`的结构。这里的关键点在于条件判断和数据库状态的修改。在PostgreSQL中,条件判断通常需要使用PL/pgSQL的存储过程或者DO语句,因为普通的SQL不支持流程控制。 接下来,检查数据库是否存在。SQL Server查询的是`master.dbo.sysdatabases`系统表,而PostgreSQL中可以通过查询`pg_database`系统目录表来获取数据库信息。所以对应的查询应该是`SELECT 1 FROM pg_database WHERE datname = 'HISTORY'`。 然后,修改数据库为单用户模式并回滚。但PostgreSQL中没有直接的`SINGLE_USER`模式。这里可能需要终止所有连接到目标数据库的会话,以便进行独占操作。在PostgreSQL中,可以使用`pg_terminate_backend()`函数来终止连接,结合`pg_stat_activity`视图来获取当前的活动连接。 接下来需要考虑的是如何将这些步骤组合成一个事务性的操作。PostgreSQL的DO语句可以执行匿名代码块,但默认情况下是自治事务,可能需要使用事务控制语句。不过,在DO语句中直接使用事务控制可能会有问题,所以可能需要分开执行。 另外,用户可能需要将整个操作自动化,可能需要创建一个函数或者脚本,依次执行终止连接、修改数据库参数等步骤。需要注意的是,PostgreSQL不允许在事务中执行某些管理命令,比如`ALTER DATABASE`,所以需要确保这些命令在事务外执行。 同时,用户可能没有考虑到权限问题,执行这些操作需要超级用户权限,或者相应的权限授予。在转换过程中,需要提醒用户注意权限设置,避免执行时出现权限不足的错误。 最后,需要将整个逻辑用PostgreSQL的语法重新表达,确保每个步骤都正确对应,并测试其可行性。例如,终止所有连接的查询可能需要排除掉自身的连接,或者在执行ALTER DATABASE之前确保没有其他会话存在。</think>以下是 SQL Server 语法到 PostgreSQL 的等效转换及逐步解释: --- ### 原始 SQL Server 代码功能 ```sql IF EXISTS (SELECT name FROM master.dbo.sysdatabases WHERE name = 'HISTORY') ALTER DATABASE [HISTORY] SET SINGLE_USER WITH ROLLBACK IMMEDIATE; ``` 1. 检查数据库 `HISTORY` 是否存在 2. 若存在,强制终止所有连接并将数据库设为单用户模式 --- ### PostgreSQL 等效实现步骤 PostgreSQL 没有直接的 `SINGLE_USER` 模式,但可通过 **终止连接 + 独占操作** 实现类似效果: #### 1. 检查数据库是否存在 ```sql SELECT 1 FROM pg_database WHERE datname = 'HISTORY'; ``` #### 2. 终止所有活动连接 ```sql SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = 'HISTORY' AND pid <> pg_backend_pid(); ``` - `pg_stat_activity`:系统视图,记录当前所有连接 - `pg_terminate_backend()`:强制终止指定进程 - `pg_backend_pid()`:排除当前自身连接 #### 3. 禁止新连接(类似单用户模式) ```sql ALTER DATABASE "HISTORY" ALLOW_CONNECTIONS false; ``` --- ### 完整脚本示例 ```sql DO $$ BEGIN -- 检查数据库是否存在 IF EXISTS (SELECT 1 FROM pg_database WHERE datname = 'HISTORY') THEN -- 终止所有活动连接 PERFORM pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = 'HISTORY' AND pid <> pg_backend_pid(); -- 禁止新连接 EXECUTE 'ALTER DATABASE "HISTORY" ALLOW_CONNECTIONS false'; END IF; END $$; ``` --- ### 关键差异说明 | 功能 | SQL Server | PostgreSQL | |----------------------|-------------------------------|--------------------------------------| | **检查数据库存在** | 查询 `sysdatabases` | 查询 `pg_database` | | **终止连接** | `ROLLBACK IMMEDIATE` | 手动调用 `pg_terminate_backend()` | | **单用户模式** | `SET SINGLE_USER` | `ALLOW_CONNECTIONS false` + 终止连接 | --- ### 注意事项 1. **权限要求**:需超级用户权限 (`SUPERUSER`) 或 `pg_terminate_backend` 授权 2. **事务限制**:`ALTER DATABASE` 不能在事务块内执行 3. **恢复连接**:需手动执行 `ALTER DATABASE "HISTORY" ALLOW_CONNECTIONS true;` 如果需要更严格的独占访问,可结合 `LOCK` 语句或维护模式工具实现。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值