如何修改系统表
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何修改系统表相关的知识,希望对你有一定的参考价值。
SQL 2005修改系统表的两个先决条件
1. 在单用户模式(single-user mode)下启动 sql server instance(实例)。
2. 使用管理员专用连接(DAC: dedicated administrator connections),连接到
SQL Server Instance 下面,就来具体介绍如何实现这两个修改系统表的先决条件。
1. 单用户模式下启动 SQL Server 2005 Instance(实例)。
【开始】--【运行】--【services.msc】进入Windows 服务管理器。
找到【SQL Server 服务】--【右键】--【属性】
根据【可执行文件的路径】内容,我的是:
"D:/MicrosoftSQL Server 2005/MSSQL.1/MSSQL/Binn/sqlservr.exe" -sSQLB
命令行下,进入sqlservr.exe 安装路径,执行:sqlservr.exe -sSQLB -m
C:/>d:
D:/>cdD:/Microsoft SQL Server 2005/MSSQL.1/MSSQL/Binn
D:/Microsoft SQLServer 2005/MSSQL.1/MSSQL/Binn> sqlservr.exe -sSQLB -m
-sSQLB 表示要启动的SQL Server 实例名字为:SQLB;-m 参数表示以单用户模式启动 SQL Server 实例。如果顺利的话,SQL Server 实例就启动起来了。如果启动不了呢,可以重新启动下机器,再试,如果仍然启动不了,那你可以根据报错内容,到网上找找解决方法。
2. 使用 DAC 连接到 SQL Server 2005。
使用 DAC 连接到SQL Server 2005 最常见的方法就是,在命令行下执行带有 -A 参数的 sqlcmd,如:
c:/sqlcmd -E -SMYPC/SQLB -A
也可以使用SQL Server 超级用户和密码进入:
c:/sqlcmd -U sa -P**** -S MYPC/SQLB -A
注意:这里是“MYPC/SQLB”(computer_name/instance_name),而不单单只是SQL Server 实例名“SQLB”。小知识:“除默认实例外,所有数据库引擎实例都由安装该实例的过程中指定的实例名标识。应用程序必须提供准备连接的计算机的名称和命名实例的实例名。计算机名和实例名以格式 computer_name/ instance_name 指定”。
如果不能通过DAC 连接到SQL Server 2005 实例,那你就要检查下,SQL Server Browser 这个服务启动没有。SQL Server Browser 侦听 1434端口(UDP端口),它可以根据客户端发送来的实例名,返回相应的IP 和 Port,从而引导客户端建立正确的连接。
大部分情况下都能顺利完成DAC 连接。但是,在命令行下操作SQL Server,你不觉得很痛苦吗,如果没有配置好 cmd 环境,显示的结果总是乱七八糟的。呵呵,我在这里介绍下如何使用 SQL Server Management Studio(SSMS)DAC 到 SQL 2005。DAC 连接跟普通连接不一样,它有个自己专用的端口,我们只要找到这个 DAC 端口,就可以以任何方式(命令行或者 SSMS)连接到 SQL 2005 实例。
如何找到DAC 的专用端口呢?当你在命令行单用户下启动 sql server 的时候, SQL Server 在屏幕上会输出好多日志信息。关键是找到包含“Dedicated admin connection”的内容:
Server is listeningon [ 127.0.0.1 [ipv4] 1183].
Dedicated adminconnection support was established for listening locally on port 1183.
这条信息告诉我们,SQL2005 在网络地址127.0.0.1 上的 1183 端口监听客户端的 DAC 连接。我们启动 SSMS,在服务器名称中输入:127.0.0.1,1183。这里的 ip和 port 中间要用英文逗号“,”来分隔。当然,也可以在命令下通过sqlcmd 来建立DAC 连接。
c:/sqlcmd -E -S127.0.0.1,1183
需要注意的是,如果指定了DAC 端口,就不要在sqlcmd 后加 -A 参数,否则会出错。这时候,也不需要启动 SQL Server Browser 了,因为我们已经告诉 sqlcmd 要连接到的 DAC 地址和端口是:127.0.0.1,1183。
就可以通过DAC 连接到SQL 2005 中,这时候会出现个错误,忽略它。
3. 在 SQL 2005 中修改系统表
use master
go
create table ddd(id int not null)
go
insert into dddvalues(10)
go
这时候,我们创建了一个表:ddd。下面在SQL 2005 系统表 sys.sysschobjs 中查询这个表“ddd”的元数据。sys.sysschobjs 就类似于SQL 2000 中的系统表 dbo.sysobjects。
select * fromsys.sysschobjs where name = 'ddd'
下面列出的结果集中,由于版面的缘故,我省略了 created, modified 两个日期字段内容。
id name nsid nsclass status typepid pclass intprop created modified
---------- --------- ------- -------- ---- ---- ------ -------- ------- --------
1211151360 ddd 1 0 917504 U 0 1 1 2008*** 2008***
这时候,我想把表“ddd”更名为“sqlstudy”:
updatesys.sysschobjs set name = 'sqlstudy' where name = 'ddd'
警告: 数据库 ID 1 中的系统表 ID 34 已直接更新,但可能未维护缓存一致性。应重新启动 SQL Server。
(1 行受影响)
因为有缓存导致不一致,新的表名字可能没有马上生效,在命令行 Ctrl+C,重新启动 SQL Server 2005。就可以看到表“ddd”已经改名为“sqlstudy”了。
select * fromsqlstudy
id
-------
10
补充内容:查看 SQL 2005 系统表的语句。
select name fromsys.all_objects where type = 'S' order by name
name
-------------------
sysallocunits
sysasymkeys
sysbinobjs
sysbinsubobjs
syscerts
syschildinsts
sysclsobjs
syscolpars
sysconvgroup
sysdbfiles
sysdbreg
sysdercv
sysdesend
sysendpts
sysfiles1
sysftinds
sysguidrefs
syshobtcolumns
syshobts
sysidxstats
sysiscols
syslnklgns
syslogshippers
sysmultiobjrefs
sysnsobjs
sysobjkeycrypts
sysobjvalues
sysowners
sysprivs
sysqnames
sysremsvcbinds
sysrmtlgns
sysrowsetcolumns
sysrowsetrefs
sysrowsets
sysrts
sysscalartypes
sysschobjs
sysserefs
syssingleobjrefs
syssqlguides
systypedsubobjs
sysusermsgs
syswebmethods
sysxlgns
sysxmitqueue
sysxmlcomponent
sysxmlfacet
sysxmlplacement
sysxprops
sysxsrvs
在 SQLServer 2005 master 数据库中,共有 51 个系统表。并且这些系统表的 schema 是 “sys”。
本文《SQL2005 修改系统表方法》示例,在SQL Server 2005 Enterprise Edition SP2(9.00.3042.00) 环境下运行通过。操作系统:WindowsServer 2003。
本文参考:http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=89594&SiteID=1
基本的步骤:
1、启动到单用户模式
"C:\ProgramFiles\Microsoft SQL Server\MSSQL.1\MSSQL\Binn\sqlservr.exe" -m
2、打开SQL Server Management Studio,在Connect to Server对话框中的Server Name处输入admin:InstanceName,这样就可以用DAC登陆启动的SQL Server实例了。 参考技术A 是系统里面的注册表信息吧追答
网上有教程的。你自己看看。这些东西还是不要随便修改会无法开机启动的
如何在 Symfony EasyAdmin 3 中创建数据验证系统
【中文标题】如何在 Symfony EasyAdmin 3 中创建数据验证系统【英文标题】:How to create a data validation system in Symfony EasyAdmin3 【发布时间】:2021-09-25 07:36:17 【问题描述】:在上下文中,有一个编辑器可以根据他的 id 修改他的信息,并且他的信息必须由管理员验证在保存到数据库之前。
我想创建一个临时表来存储编辑器将修改的信息,管理员可以通过 EasyAdmin 的界面访问他的信息,然后一旦管理员验证信息,它将保留在原始表中。
我在文档中没有找到恢复编辑页面表单信息的方法。
我加入了我想要定位的 crud 控制器:
类OperateurCrudController 扩展AbstractCrudController
private $crudUrlGenerator;
private $adminContextProvider;
public function __construct(AdminUrlGenerator $adminUrlGenerator, AdminContextProvider $adminContextProvider)
$this->adminUrlGenerator = $adminUrlGenerator;
$this->adminContextProvider = $adminContextProvider;
public static function getEntityFqcn(): string
return Operateur::class;
public function configureFields(string $pageName): iterable
return [
IdField::new('id')->hideOnForm(),
TextField::new('name', 'Nom'),
TextEditorField::new('description', 'Description')->hideOnIndex(),
TextareaField::new('address', 'Adresse'),
TextField::new('city', 'Ville')->hideOnIndex(),
TextField::new('postal_code', 'Code Postal')->hideOnIndex(),
TextField::new('email', 'Email'),
TelephoneField::new('phone', 'Téléphone'),
UrlField::new('website', 'Site Web')->hideOnIndex(),
TextEditorField::new('opening_hours', 'Horaires d\'Ouverture'),
NumberField::new('latitude', 'Latitude')->hideOnIndex()->setNumDecimals(15),
NumberField::new('longitude', 'Longitude')->hideOnIndex()->setNumDecimals(15),
TextField::new('slug', 'Slug')->hideOnIndex()->setPermission('ROLE_ADMIN'),
DateTimeField::new('created_at', 'Date Création')->onlyOnIndex(),
DateTimeField::new('updated_at', 'Date Modification')->onlyOnIndex(),
AssociationField::new('thematiques', 'Thématiques')
];
public function configureActions(Actions $actions): Actions
$batchAction = Action::new('approve', 'Approuver', 'fa fa-user-check')
->linkToUrl('approveOperators');
$updateOperator = Action::new('update', 'Enregistrer les modifications', 'fa fa-save')
->linkToCrudAction('saveOperator');
if($this->isGranted('ROLE_ADMIN'))
return $actions
->add(Crud::PAGE_INDEX, $batchAction)
->add(Crud:: PAGE_INDEX, Action::DETAIL)
->setPermission(Action::DELETE, 'ROLE_ADMIN')
->setPermission(Action::NEW, 'ROLE_ADMIN')
->setPermission(Action::EDIT, 'ROLE_ADMIN')
->setPermission($batchAction, 'ROLE_ADMIN');
if($this->isGranted('ROLE_EDITOR'))
return $actions
->add(Crud:: PAGE_INDEX, Action::DETAIL)
->add(Crud::PAGE_EDIT, $updateOperator)
->setPermission(Action::DELETE, 'ROLE_ADMIN')
->setPermission(Action::NEW, 'ROLE_ADMIN')
->setPermission($updateOperator, 'ROLE_EDITOR')
->disable( Action::SAVE_AND_RETURN, Action::SAVE_AND_CONTINUE);
public function approveOperators(): Response
$this->addFlash('notice', '<span style="color: green"><i class="fa fa-check"></i>Modification effecuté </span>');
$url = $this->adminUrlGenerator
->setAction(Action::INDEX)
->generateUrl();
return $this->redirect($url);
public function saveOperator()
//$this->addFlash('notice', '<span style="color: green"><i class="fa fa-check"></i>Modification pris en compte ! </span>');
//Create my own save button in page edit
public function configureCrud(Crud $crud): Crud
return $crud
->setEntityPermission('ROLE_EDITOR');
public function createIndexQueryBuilder(SearchDto $searchDto, EntityDto $entityDto, FieldCollection $fields, FilterCollection $filters): QueryBuilder
$response = parent::createIndexQueryBuilder($searchDto, $entityDto, $fields, $filters);
if(!$this->isGranted('ROLE_ADMIN'))
$response->where('entity.id = :id');
$response->setParameter('id', $this->getUser()->getOperateur());
return $response;
public function updateEntity(EntityManagerInterface $entityManager, $entityInstance): void
parent::updateEntity($entityManager, $entityInstance); // TODO: Change the autogenerated stub
感谢您的阅读
【问题讨论】:
一旦管理员按下“接受”按钮(或者您想设计接受机制),是什么阻止您复制数据?或者将“接受”字段设置为 true? 如果信息被接受,我也考虑过添加字段的解决方案,但我发现自己遇到了恢复表单值的同样问题。以及如何存储信息(例如,如果电脑同时崩溃) 创建两个实体。一个是你拥有的那个。另一个通过引用和接受字段与之相关。只有管理员可以编辑后面的实体。如果您的电脑崩溃,请使用可以处理崩溃的数据库。 好的,感谢您的解决方案!但是从表单中获取信息的方法是什么?或者一种覆盖保存和返回按钮的方法 好吧,也许它不是一个解决方案,我不知道。 EasyAdmin3 可能有办法允许/禁止基于记录的角色访问? (例如,一旦被接受,一个角色就不能再编辑记录)。 【参考方案1】:你应该使用 BeforeEntityPersistedEvent::class
它将在将元素持久化到数据库中之前自动触发
class EasyAdminSubscriber extends AbstractController implements EventSubscriberInterface
public function __construct( )
public static function getSubscribedEvents()
return [
BeforeEntityPersistedEvent::class => ['functionName']
];
public function functionName(BeforeEntityPersistedEvent $event)
$entity=$event->getEntityInstance();
$user = $this->getUser();
$userRole = $user->getRole();
$check = $this->checkRole($userRole);
if ($entity instanceof yourEntity && $check== true)
//Do your magic with changing the value you want in the table you
抱歉没有评论,我没有足够的声誉,所以我在那里回答。
【讨论】:
请分享更多细节。这如何确保数据在被普通用户编辑后可以呈现给管理员? 他希望管理员对 prepersist 数据进行验证系统,因此用户尝试持久化数据,触发此事件,然后他可以选择自己的方式。发送这些信息,并在表格上为 null 的检查字段,发送警报“等待管理员验证,或向管理员发送链接,其中包含这些信息的预设表单。以上是关于如何修改系统表的主要内容,如果未能解决你的问题,请参考以下文章
请问修改表中的某一个日期类型的字段为当前系统时间的sql语句该如何书写。