我有一个正在迁移到 MySQL 的模块化系统。
在 SQL Server 中,存在将表和数据库对象分组在一起的架构概念。例如,所有与用户相关的表都可以放入auth模式中,所有博客表可以放入博客模式中。这意味着我们可以在对象资源管理器中看到这些表名称:
这是一种将事物放在一起并对它们进行排序的巧妙方法,这对于理解数据库和模块化结构非常有帮助,并有助于降低维护成本。
我知道MySQL不支持这个功能。
我还知道我们可以为表名称添加前缀来模仿这种行为。但我想知道这是否是最好的方法?
是否有一种我不知道的已知方法可以实现这一目标?我对 MySQL 还很陌生。
考虑一个简单的查询,就像一条select
语句一样简单:
select * from Teachers where Name like N'%John%'
Run Code Online (Sandbox Code Playgroud)
一旦我开始这个查询,它就完成了。因此,我没有机会看到sp_who2
这个查询对数据库对象应用了什么类型的锁。
我可以用事务语句来扩充这个查询:
begin transaction
select * from Teachers where Name like N'%John%'
-- Here, I won't commit transaction, thus holding the lock
Run Code Online (Sandbox Code Playgroud)
但坦率地说,这似乎不是自然锁定检测的正确方法,因为我已经使用事务语句操纵了默认行为。
我们是否有一个工具,比如Display Estimated Execution Plan
向我们展示有关锁定给定查询的一些信息?如果不是,我们如何找出给定查询可以在数据库上应用哪种类型的锁,因为它们执行得太快而无法检测到。
我正在尝试以 0-100 的比例找出查询的每个给定记录的位置。我这样使用PERCENT_RANK
排名功能:
select Term, Frequency, percent_rank() over (order by Frequency desc) * 100
from Words
Run Code Online (Sandbox Code Playgroud)
但是当我查看结果时,我看到的不是从 0 开始到 100 的列,而是从 0 开始到 37.xxxx 的列。
虽然BOL没有明确提到结果分布在 0-100 的范围内,但我对这个词的理解percent
让我使用了这个排名函数。
我在这里想念什么?
假设我有一张Customers
桌子和一张Emails
桌子。Emails
表有这些字段:
Id
CustomerId
EmailValue
Run Code Online (Sandbox Code Playgroud)
现在,我想创建一个约束,以便每个客户都不应该注册重复的电子邮件。我能想到的方法有:
但是,我最近熟悉了 SQL Server 的筛选索引。尽管我不知道它在这种特定情况下是否可以帮助我。我见过的大多数示例都是过滤掉NULL值,以便为可空列创建唯一索引。
有没有办法可以使用过滤索引来实现我想要的?
我有一个简单的过程,存在于 150 多个数据库中。我可以将它们一一删除,这是软件开发界最愚蠢的工作。或者我可以以某种方式在一个查询中动态删除它们,这很聪明但不起作用。
我试过了:
execute sp_msforeachdb 'drop procedure Usages'
Run Code Online (Sandbox Code Playgroud)
我有:
无法删除过程“用法”,因为它不存在或您没有权限。
所以我想也许我为它创建了一个游标。于是我写道:
declare @command nvarchar(max) = '
drop procedure Usages
';
declare @databaseName nvarchar(100)
declare databasesCursor cursor for select [name] from sys.databases where database_id > 5
open databasesCursor
fetch next from databasesCursor into @databaseName
while @@fetch_status = 0
begin
print @databaseName
execute sp_executesql @command
fetch next from databasesCursor into @databaseName
end
close databasesCursor
deallocate databasesCursor
Run Code Online (Sandbox Code Playgroud)
再次,我收到了同样的消息。我想,也许它不会改变数据库的上下文,因此我在删除命令前面加上了给定数据库的名称,所以命令会变得类似于drop procedure [SomeDatabase].dbo.Usages
,但后来我收到了:
“DROP PROCEDURE”不允许将数据库名称指定为对象名称的前缀。
所以,我想出动态执行,use @databaseName
以便我可以在该数据库的上下文中删除过程。但它不起作用。我该怎么办?我被困在聪明的方法上,而且我现在比愚蠢的方法花费的时间更多。
使用它docker-compose.yml
我创建了一个容器:
version: "3.9"
services:
database:
image: mcr.microsoft.com/mssql/server
user: root
restart: always
container_name: ContainerNameHere
volumes:
- /Organization/Databases:/var/opt/mssql/data
environment:
- ACCEPT_EULA=Y
- SA_PASSWORD=password_here
- MSSQL_PID=Express
ports:
- 1433:1433
logging:
driver: none
networks:
- NetworkNameHere
networks:
NetworkNameHere:
name: NetworkNameHere
driver: bridge
Run Code Online (Sandbox Code Playgroud)
它的用户数据库为零。它只是一个简单的空 SQL Server docker 容器,没有数据库,也没有数据。
但这是我的top
命令的结果:
正如你所看到的,它完全摧毁了我的 VPS。
这太令人沮丧了,微软团队还没有回复我。
为什么 SQL Server 的 docker 容器会这样,我应该如何解决这个问题?
我有 10 GB 可用空间:
df -h /
已用文件系统大小 Avail Use% 安装在
/dev/sda1 20G 8.9G 10G 47% /
我的 SQL …