Sql server 为什么TRUNCATE语句需要ALTER权限而不是DELETE权限?

Sql server 为什么TRUNCATE语句需要ALTER权限而不是DELETE权限?,sql-server,Sql Server,有人能解释为什么截断指令需要ALTER权限吗 同时,删除指令需要删除权限 我知道TRUNCATE会将页面标记为已删除,而DELETE会将字符串标记为已删除 因此,它有不同的事务日志使用和工作速度,但这种知识不允许理解必要特权的差异。一个原因是它们没有被删除。例如,删除触发器。Alter不会。Alter是绕过系统中许多可能的安全措施的ametadata操作。特别是可能执行日志记录、禁止或修改删除操作的触发器。一个原因是您没有被删除。例如,删除触发器。Alter不会。Alter是绕过系统中许多可能的

有人能解释为什么截断指令需要ALTER权限吗

同时,删除指令需要删除权限

我知道TRUNCATE会将页面标记为已删除,而DELETE会将字符串标记为已删除


因此,它有不同的事务日志使用和工作速度,但这种知识不允许理解必要特权的差异。

一个原因是它们没有被删除。例如,删除触发器。Alter不会。Alter是绕过系统中许多可能的安全措施的ametadata操作。特别是可能执行日志记录、禁止或修改删除操作的触发器。

一个原因是您没有被删除。例如,删除触发器。Alter不会。Alter是绕过系统中许多可能的安全措施的ametadata操作。特别是可能执行日志记录、禁止或修改删除操作的触发器。

很难知道原因,但如果您查看以下方面的差异:

由于Truncate的操作不同,它需要对其权限有不同的要求。如果我是“为什么”委员会的成员,那么触发器没有被触发这一事实对我来说将是一个大问题,而它不能回滚这一事实也将是一个大问题


请记住,当权限被定义时,它应该是在非常早期的SQL版本上,更改操作所需的权限可能会被视为一个突破性的更改

很难知道原因,但如果你看看以下方面的区别:

由于Truncate的操作不同,它需要对其权限有不同的要求。如果我是“为什么”委员会的成员,那么触发器没有被触发这一事实对我来说将是一个大问题,而它不能回滚这一事实也将是一个大问题


请记住,当权限被定义时,它应该是在非常早期的SQL版本上,更改操作所需的权限可能会被视为一个突破性的更改

Truncate将删除数据,此外它将重置表的
identity
属性。它处理的是表的结构。除了换桌子什么都没有

因此,我们需要
ALTER
相同的权限


注意:未记录。出于这个原因,我对同样的问题保持冷静。

Truncate将删除数据,此外,它将重置表的
标识属性。它处理的是表的结构。除了换桌子什么都没有

因此,我们需要
ALTER
相同的权限


注意:未记录。用同样的问题让我保持冷静的原因。

我认为没有人能够权威地回答为什么。这可能是几十年前做出的一个决定。请看,Delete是DML,Truncate是DDL,这是all@DenisRubashkin嗯。。。。。那么,接下来呢?那么为什么TRUNCATE是DDL操作呢?显然,它会进行数据操作?@meow-meow,不,它不会进行操作,它会释放表页,并且不担心这些页上的数据。TRUNCATE几乎与删除/创建表相同。我认为没有人能够权威地回答为什么。这可能是几十年前做出的一个决定。请看,Delete是DML,Truncate是DDL,这是all@DenisRubashkin嗯。。。。。那么,接下来呢?那么为什么TRUNCATE是DDL操作呢?显然,它会进行数据操作?@meow-meow,不,它不会进行操作,它会释放表页,并且不担心这些页上的数据。TRUNCATE几乎与DROP/CREATE表相同。它确实是非常有用的信息,尽管它不能充分回答我的问题,因为内部仍然很接近,thx!如果有人需要,我可以在上表中添加有关删除语法的信息。您使用的是什么版本的SQL Server?另外,
TRUNCATE
可以在所有现代SQL Server版本中回滚。这可能不适用于其他DBMS产品。例如,不能在与Oracle的事务中执行DDL。where子句可能是其中最重要的部分。DML可以选择使用指定数据的过滤器(例如从…何处选择、从…何处删除)应用。DDL应用于数据结构,而不需要在数据结构本身中指定数据过滤。它确实是非常有用的信息,尽管它不能充分回答我的问题,因为内部仍然很接近,thx!如果有人需要,我可以在上表中添加有关删除语法的信息。您使用的是什么版本的SQL Server?另外,
TRUNCATE
可以在所有现代SQL Server版本中回滚。这可能不适用于其他DBMS产品。例如,不能在与Oracle的事务中执行DDL。where子句可能是其中最重要的部分。DML可以选择使用指定数据的过滤器(例如从…何处选择、从…何处删除)应用。DDL适用于数据结构,无需在数据结构本身中指定对数据的过滤。请小心使用“truncate将删除数据”这一说法。从技术上讲,truncate保留表结构,但释放与之相关的内存/存储。这就是TRUNCATE语句不影响事务日志的原因。在操作过程中没有数据被物理移动。请小心说“truncate将删除数据”。从技术上讲,truncate保留表结构,但释放与之相关的内存/存储。这就是TRUNCATE语句不影响事务日志的原因。在操作过程中没有数据被物理移动。
+----------------------------------------+----------------------------------------------+
|                Truncate                |                    Delete                    |
+----------------------------------------+----------------------------------------------+
| We can't Rollback after performing     | We can Rollback after delete.                |
| Truncate. (new versions allow)         |                                              |                                              |
| Example:                               | Example:                                     |
| BEGIN TRAN                             | BEGIN TRAN                                   |
| TRUNCATE TABLE tranTest                | DELETE FROM tranTest                         |
| SELECT * FROM tranTest                 | SELECT * FROM tranTest                       |
| ROLLBACK                               | ROLLBACK                                     |
| SELECT * FROM tranTest                 | SELECT * FROM tranTest                       |
+----------------------------------------+----------------------------------------------+
| Truncate reset identity of table.      | Delete does not reset identity of table.     |
+----------------------------------------+----------------------------------------------+
| It locks the entire table.             | It locks the table row.                      |
+----------------------------------------+----------------------------------------------+
| Its DDL(Data Definition Language)      | Its DML(Data Manipulation Language)          |
| command.                               | command.                                     |
+----------------------------------------+----------------------------------------------+
| We can't use WHERE clause with it.     | We can use WHERE to filter data to delete.   |
+----------------------------------------+----------------------------------------------+
| Trigger is not fired while truncate.   | Trigger is fired.                            |
+----------------------------------------+----------------------------------------------+
| Syntax :                               | Syntax :                                     |
| 1) TRUNCATE TABLE table_name           | 1) DELETE FROM table_name                    |
|                                        | 2) DELETE FROM table_name WHERE              |
|                                        |    example_column_id IN (1,2,3)              |
+----------------------------------------+----------------------------------------------+