【SQL Server】用户的设置与授权、sa用户登录、查询一个数据库中有多少张表

本文详细介绍了如何在SQL Server中设置用户、授权访问特定数据库、使用sa用户登录以及查询数据库中表的数量。包括创建用户、设置权限、使用SQL Server身份验证登录和查询数据库结构的基本操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、用户的设置与授权

SQL Server用户的设置与授权除了将不同的数据库开放给不同的用户以外,还有一个就是提供一个通道给其它程序访问,毕竟直接使用Windows身份验证有点不太专业。

在实验之前,我们先设置两个数据库,一个test还有一个是aaa。实现一个创建pc用户,仅授权它访问test的功能。


1、在创建用户之前,我们先要对SQL2005进行设置,否则其默认是不提供给任何用户访问的。

一个是对数据库实例的属性进行设置,如下图,在安全性中,设置服务器身份验证为“SQL Server和Windows身份验证模式”同时设置登录审核为“失败和成功的登录”


之后,我们在SQL数据库中进行如下的查询:

create login pc with password='admin', default_database=[test];
--登陆帐户名为:pc,登陆密码:admin,默认连接到的数据库:test
--这时候,pc帐户就可以连接到SQL Server服务器上了。但是此时还不能 访问数据库中的对象
--严格的说,此时pc帐户默认是guest数据库用户身份,可以访问guest能够访问的数据库对象
create user pc for login pc with default_schema=[dbo];
--并指定数据库用户pc的默认schema是dbo。
--意味着用户pc在执行select * from t,实际上执行的是select * from dbo.t。
--所有查询补个dbo.前缀为了与低版本SQL Server导过来的表相同
use [test];
go
exec sp_addrolemember 'db_owner', 'pc';
go
--在test数据库中
--通过加入数据库角色,赋予数据库用户“db_owner”权限
--此时pc可以随意操作数据库test

这段SQL语句秉承微软数据库的所有传统,凡是涉及表名、数据库名都用[]表明,以免触发系统的关键字。

而最后一条语句大家可能疑惑,为何要加一段go呢?这两个go还是不能省,毕竟它是用于确保use[test]和exec sp_addrolemember 'db_owner', 'pc';这两条语句不分裂,否则sp_addrolemember这个SQL保留的存储过程(这个概念也就是类似编程语言函数、过程、方法那些东东)是无法执行的,找不到你是指哪个数据库。

同时关于dbo是这样的:dbo是默认用户也是架构,dbo作为架构是为了更好的与2000兼容,这样2000中的代码移植到2005中就不会报错(dbo在2005中是默认的架构,创建表时,如不指定架构,则默认为属于dbo为个架构)。

以上的查询执行之后:


你可以很明显地发现在数据库中,多了pc用户,右击属性,可以发现其test被这个pc用户映射,且其身份就是db_owner数据库拥有者,意思就是想搞啥都行。

此时,还不能直接用这个pc登录SQL,因为,你还要如下图,打开开始菜单的配置工具中的“服务和连接的外围应用配置器”,开始本地连接与远程连接,设置为同时使用TCP/IP和named pipes。


设置完,还要如下图重启MSSQLSERVER与SQLEXPRESS两个服务。


如果你不这样设置,可能会出现,如下的错误:

已成功与服务器建立连接,但是在登录过程中发生错取。(provider:共享内存提供程序,error:0-管道的另一端上无任何进程。)(Microsoft SQL Server,错误:233)

2、此时,你终于可以在登录的时候,在身份验证选择“SQL Server 身份验证”,登录名与密码就是你刚才在T-SQL语句中设置的密码。


3、用这个pc登录之后,默认就登录在数据库test中,如果你要使用use aaa;其它没有权限的数据库,则会出现如下的结果:


4、做完上述实验,如果不想要这个pc用户,可以在Windows身份验证中,按顺序执行以下两个查询,这两句也可以同时执行,执行之后pc就被删除了。

--删除数据库用户: 
drop user pc
--删除 SQL Server登陆帐户: 
drop login pc

二、sa用户登录

1、在安装SQL2005的时候,曾经设置过一个超级管理员sa用户,然而,在SQL Server并不能像其它数据库的root账号一样直接用来登录的。如果你要在SQL Server身份验证中使用sa来登录,必须做如下的设置:

如下图,首先要对sa的属性中的状态,设置其允许登录。


同时,需要在“常规”上将密码重打一次,同时关闭“强制实施密码策略”。

点击确定,如上,重启SQL服务,就可以使用SQL Server身份验证中使用这个sa用户登录。

三、查询一个数据库中有多少张表

1、在SQL如果要查询一个数据库中有多少张表,很简单,

首先你要明白利用:

SELECT * FROM sysobjects WHERE (xtype = 'U')

能读出这个数据库中含有表的所有信息。

后面的条件xtype,是这样的:

xtype这个值还不一定等于U,还可以是下列对象类型中的一种,对sysobject理论上可以查询这个数据库的任何东西:

C = CHECK 约束

D = 默认值或 DEFAULT 约束

F = FOREIGN KEY 约束 

L = 日志 

FN = 标量函数 

IF = 内嵌表函数 

P = 存储过程 

PK = PRIMARY KEY 约束(类型是 K) 

RF = 复制筛选存储过程 

S = 系统表 

TF = 表函数 

TR = 触发器 

U = 用户表 

UQ = UNIQUE 约束(类型是 K) 

V = 视图 

X = 扩展存储过程

2、不过一般情况下,如果我们单纯查询有多少张表,查询所有表名,或者表的数量就可以了,一般使用如下的语句:

SELECT name FROM sysobjects WHERE (xtype = 'U') --查询这个数据库所有的表明
SELECT count(*) FROM sysobjects WHERE (xtype = 'U') --查询这个数据库表的数量

运行结果如下:


<think>嗯,用户的问题是如何使用Zabbix监控数据库中的特定。之前对话中用户提到了站内引用,这些引用主要涉及Zabbix监控MySQLSQLServer的方法,特别是通过自定义脚本实现监控的思路。用户当前的需求非常具体,需要监控特定的数据变化或状态。用户可能是个运维工程师或DBA,正在搭建数据库监控体系。从ta追问特定监控的细节来看,基础监控可能已经部署完成,现在需要更精细化的指标监控。考虑到实际生产环境的重要性,用户可能对数据实时性和准确性要求较高。根据引用内容,实现这个需求的核心在于两点:获取数据的方法(脚本)和Zabbix的集成。需要区分不同类型的数据库:1.对于MySQL,可以采用Shell脚本结合mysql命令行工具,或者用Python/Perl等语言编写更复杂的查询2.对于SQLServer,引用中提到的bat脚本方案值得参考,但要注意Windows环境的路径处理3.对于Oracle等其他数据库,虽然用户没提,但实现逻辑类似用户没有说明具体监控什么维度的数据,可能是:-行数变化速率(监控数据增长)-关键字段值(如业务配置的开关状态)-数据更新时间(判断数据是否及时更新)在回答时要特别强调几个关键点:1.账户权限最小化原则,避免直接用root账号监控2.不同数据库类型的实现差异3.历史数据处理建议(比如监控行数变化时需要持久化上次取值)考虑到用户参考了多篇技术文章,应该是个有一定经验的实施者,所以回复时可以适当深入技术细节,比如直接在代码示例中展示如何过滤特定的监控。但也要注意把核心步骤拆解清楚,毕竟Zabbix自定义监控对新人来说还是有门槛的。</think> 以下是基于 Zabbix 监控特定数据库的完整教程,结合脚本开发和配置流程: --- ### **一、核心实现思路** 1. **数据采集**:通过脚本连接数据库查询目标的关键指标(如行数、关键字段值、更新时间等) 2. **数据传输**:脚本将结果输出为标准格式(如 JSON/KV),Zabbix 通过 `zabbix_get` 或主动式代理抓取 3. **告警配置**:在 Zabbix 前端设置触发器阈值 --- ### **二、具体操作步骤(以 MySQL 为例)** #### ▶ **Step 1:编写监控脚本** 创建 Shell 脚本 `/etc/zabbix/scripts/monitor_table.sh`: ```bash #!/bin/bash # 监控指定的行数 TABLE_NAME="$1" # 通过参数传入名 MYSQL_USER="zabbix_monitor" MYSQL_PASS="sEcureP@ss!123" DB_NAME="your_database" RESULT=$(mysql -N -u${MYSQL_USER} -p${MYSQL_PASS} -D${DB_NAME} \ -e "SELECT COUNT(*) FROM ${TABLE_NAME};") echo ${RESULT:-0} # 防止空值错误 ``` * 权限配置: ```bash chmod 755 /etc/zabbix/scripts/monitor_table.sh chown zabbix:zabbix /etc/zabbix/scripts/monitor_table.sh ``` #### ▶ **Step 2:配置 Zabbix Agent** 1. 添加自定义监控项: ```conf # /etc/zabbix/zabbix_agentd.conf.d/userparameter_mysql.conf UserParameter=mysql.table.rowcount[*], /etc/zabbix/scripts/monitor_table.sh "$1" ``` 2. 重启 Agent: ```bash systemctl restart zabbix-agent ``` #### ▶ **Step 3:Zabbix 前端配置 1. **创建监控项**: - 名称:`MySQL Table [orders] Row Count` - 键值:`mysql.table.rowcount["orders"]` - 数据类型:*数字* - 更新间隔:`5m`(根据需求调整) 2. **设置触发器**(例:订单1小时无变化告警): ```text {Template DB MySQL:mysql.table.rowcount["orders"].delta(1h)}=0 ``` --- ### **三、高级场景实现** #### ▶ 监控数据更新时间(需字段) ```sql -- 修改 Step1 的查询语句(需中有时间戳字段) SELECT UNIX_TIMESTAMP(MAX(update_time)) FROM orders; ``` 触发器配置: ```text # 超过12小时未更新 {Template DB MySQL:mysql.table.last_update["orders"].last()} < now-12h ``` #### ▶ 监控 SQL Server (引用[4]思路) ```bat rem 创建 getdata.sql 文件 SELECT COUNT(*) FROM Sales.Orders rem 监控脚本 get_rowcount.bat sqlcmd -S 127.0.0.1 -U sa -P pwd -d DBName -i getdata.sql -W -h-1 -s "," > rowcount.txt type rowcount.txt ``` Zabbix Agent 配置: ```conf UserParameter=mssql.table.rowcount[*], "D:\scripts\get_rowcount.bat" ``` --- ### **四、安全最佳实践** 1. **最小权限原则**:数据库账户仅授予查询目标的权限 ```sql GRANT SELECT ON yourdb.target_table TO 'zabbix_monitor'@'localhost'; ``` 2. **凭证保护**: ```bash chmod 400 /etc/zabbix/scripts/monitor_table.sh mysql_config_editor set --login-path=zabbix --user=monitor --password ``` 3. **脚本防注入**:使用参数化输入(避免拼接 SQL) --- ### **五、验证流程** 1. 手动测试脚本: ```bash /etc/zabbix/scripts/monitor_table.sh "orders" # 输出如:24789 ``` 2. 通过 zabbix_get 验证: ```bash zabbix_get -s 127.0.0.1 -k 'mysql.table.rowcount["orders"]' ``` > **注**:其他数据库类型(Oracle/PostgreSQL)只需替换脚本中的连接命令和SQL语法即可实现[^1][^2][^4] --- ### **相关扩展问题** 1. 如何监控MySQL主从同步延迟但只需针对特定? *方案*:`SHOW SLAVE STATUS` 中定位 `SQL_Remaining_Seconds`,配合过滤复制规则[^3] 2. 若需监控中的某字段值异常(如库存为负)? ```sql SELECT COUNT(*) FROM products WHERE stock < 0 ``` 3. 如何实现监控数据的可视化趋势图? → 在Zabbix中为监控项创建图,或集成Grafana 4. 如何避免高频查询对生产数据库的影响? → 使用本地缓存(Redis/Memcached),Zabbix设置15分钟以上采集间隔[^2]
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值